aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_mbe/src/mbe_expander
diff options
context:
space:
mode:
authorFlorian Diebold <[email protected]>2020-03-16 11:22:10 +0000
committerFlorian Diebold <[email protected]>2020-03-16 17:38:19 +0000
commitd655749aaeb31461f9af923bbf0b36d219cff343 (patch)
treed7f8e8a11bd4794567fb24ac29b2b85ebd247881 /crates/ra_mbe/src/mbe_expander
parentf3c6a2e3dbe477a7e0ac714a5bdbda6e8838fcfa (diff)
Turn ExpandResult into struct
Diffstat (limited to 'crates/ra_mbe/src/mbe_expander')
-rw-r--r--crates/ra_mbe/src/mbe_expander/matcher.rs21
-rw-r--r--crates/ra_mbe/src/mbe_expander/transcriber.rs22
2 files changed, 19 insertions, 24 deletions
diff --git a/crates/ra_mbe/src/mbe_expander/matcher.rs b/crates/ra_mbe/src/mbe_expander/matcher.rs
index f40d55d4e..22fb5d74c 100644
--- a/crates/ra_mbe/src/mbe_expander/matcher.rs
+++ b/crates/ra_mbe/src/mbe_expander/matcher.rs
@@ -79,7 +79,7 @@ pub(super) fn match_(pattern: &tt::Subtree, src: &tt::Subtree) -> ExpandResult<M
79 err = Some(err!("leftover tokens")); 79 err = Some(err!("leftover tokens"));
80 } 80 }
81 81
82 (res, err) 82 ExpandResult(res, err)
83} 83}
84 84
85fn match_subtree( 85fn match_subtree(
@@ -148,7 +148,7 @@ fn match_subtree(
148 continue; 148 continue;
149 } 149 }
150 }; 150 };
151 let (matched, match_err) = match_meta_var(kind.as_str(), src); 151 let ExpandResult(matched, match_err) = match_meta_var(kind.as_str(), src);
152 match matched { 152 match matched {
153 Some(fragment) => { 153 Some(fragment) => {
154 res.bindings.inner.insert(name.clone(), Binding::Fragment(fragment)); 154 res.bindings.inner.insert(name.clone(), Binding::Fragment(fragment));
@@ -308,17 +308,17 @@ impl<'a> TtIter<'a> {
308 token_trees: res.into_iter().cloned().collect(), 308 token_trees: res.into_iter().cloned().collect(),
309 })), 309 })),
310 }; 310 };
311 (res, err) 311 ExpandResult(res, err)
312 } 312 }
313 313
314 pub(crate) fn eat_vis(&mut self) -> Option<tt::TokenTree> { 314 pub(crate) fn eat_vis(&mut self) -> Option<tt::TokenTree> {
315 let mut fork = self.clone(); 315 let mut fork = self.clone();
316 match fork.expect_fragment(Visibility) { 316 match fork.expect_fragment(Visibility) {
317 (tt, None) => { 317 ExpandResult(tt, None) => {
318 *self = fork; 318 *self = fork;
319 tt 319 tt
320 } 320 }
321 (_, Some(_)) => None, 321 ExpandResult(_, Some(_)) => None,
322 } 322 }
323 } 323 }
324} 324}
@@ -419,12 +419,11 @@ fn match_meta_var(kind: &str, input: &mut TtIter) -> ExpandResult<Option<Fragmen
419 }, 419 },
420 _ => Err(ExpandError::UnexpectedToken), 420 _ => Err(ExpandError::UnexpectedToken),
421 }; 421 };
422 return to_expand_result(tt_result.map(|it| it.map(Fragment::Tokens))); 422 return tt_result.map(|it| it.map(Fragment::Tokens)).into();
423 } 423 }
424 }; 424 };
425 let (tt, err) = input.expect_fragment(fragment); 425 let result = input.expect_fragment(fragment);
426 let fragment = if kind == "expr" { tt.map(Fragment::Ast) } else { tt.map(Fragment::Tokens) }; 426 result.map(|tt| if kind == "expr" { tt.map(Fragment::Ast) } else { tt.map(Fragment::Tokens) })
427 (fragment, err)
428} 427}
429 428
430fn collect_vars(buf: &mut Vec<SmolStr>, pattern: &tt::Subtree) -> Result<(), ExpandError> { 429fn collect_vars(buf: &mut Vec<SmolStr>, pattern: &tt::Subtree) -> Result<(), ExpandError> {
@@ -438,7 +437,3 @@ fn collect_vars(buf: &mut Vec<SmolStr>, pattern: &tt::Subtree) -> Result<(), Exp
438 } 437 }
439 Ok(()) 438 Ok(())
440} 439}
441
442fn to_expand_result<T: Default>(result: Result<T, ExpandError>) -> ExpandResult<T> {
443 result.map_or_else(|e| (Default::default(), Some(e)), |it| (it, None))
444}
diff --git a/crates/ra_mbe/src/mbe_expander/transcriber.rs b/crates/ra_mbe/src/mbe_expander/transcriber.rs
index c53c2d35e..4b173edd3 100644
--- a/crates/ra_mbe/src/mbe_expander/transcriber.rs
+++ b/crates/ra_mbe/src/mbe_expander/transcriber.rs
@@ -87,23 +87,23 @@ fn expand_subtree(ctx: &mut ExpandCtx, template: &tt::Subtree) -> ExpandResult<t
87 match op { 87 match op {
88 Op::TokenTree(tt @ tt::TokenTree::Leaf(..)) => buf.push(tt.clone()), 88 Op::TokenTree(tt @ tt::TokenTree::Leaf(..)) => buf.push(tt.clone()),
89 Op::TokenTree(tt::TokenTree::Subtree(tt)) => { 89 Op::TokenTree(tt::TokenTree::Subtree(tt)) => {
90 let (tt, e) = expand_subtree(ctx, tt); 90 let ExpandResult(tt, e) = expand_subtree(ctx, tt);
91 err = err.or(e); 91 err = err.or(e);
92 buf.push(tt.into()); 92 buf.push(tt.into());
93 } 93 }
94 Op::Var { name, kind: _ } => { 94 Op::Var { name, kind: _ } => {
95 let (fragment, e) = expand_var(ctx, name); 95 let ExpandResult(fragment, e) = expand_var(ctx, name);
96 err = err.or(e); 96 err = err.or(e);
97 push_fragment(&mut buf, fragment); 97 push_fragment(&mut buf, fragment);
98 } 98 }
99 Op::Repeat { subtree, kind, separator } => { 99 Op::Repeat { subtree, kind, separator } => {
100 let (fragment, e) = expand_repeat(ctx, subtree, kind, separator); 100 let ExpandResult(fragment, e) = expand_repeat(ctx, subtree, kind, separator);
101 err = err.or(e); 101 err = err.or(e);
102 push_fragment(&mut buf, fragment) 102 push_fragment(&mut buf, fragment)
103 } 103 }
104 } 104 }
105 } 105 }
106 (tt::Subtree { delimiter: template.delimiter, token_trees: buf }, err) 106 ExpandResult(tt::Subtree { delimiter: template.delimiter, token_trees: buf }, err)
107} 107}
108 108
109fn expand_var(ctx: &mut ExpandCtx, v: &SmolStr) -> ExpandResult<Fragment> { 109fn expand_var(ctx: &mut ExpandCtx, v: &SmolStr) -> ExpandResult<Fragment> {
@@ -112,7 +112,7 @@ fn expand_var(ctx: &mut ExpandCtx, v: &SmolStr) -> ExpandResult<Fragment> {
112 let tt = 112 let tt =
113 tt::Leaf::from(tt::Ident { text: "$crate".into(), id: tt::TokenId::unspecified() }) 113 tt::Leaf::from(tt::Ident { text: "$crate".into(), id: tt::TokenId::unspecified() })
114 .into(); 114 .into();
115 (Fragment::Tokens(tt), None) 115 ExpandResult::ok(Fragment::Tokens(tt))
116 } else if !ctx.bindings.contains(v) { 116 } else if !ctx.bindings.contains(v) {
117 // Note that it is possible to have a `$var` inside a macro which is not bound. 117 // Note that it is possible to have a `$var` inside a macro which is not bound.
118 // For example: 118 // For example:
@@ -141,11 +141,11 @@ fn expand_var(ctx: &mut ExpandCtx, v: &SmolStr) -> ExpandResult<Fragment> {
141 ], 141 ],
142 } 142 }
143 .into(); 143 .into();
144 (Fragment::Tokens(tt), None) 144 ExpandResult::ok(Fragment::Tokens(tt))
145 } else { 145 } else {
146 ctx.bindings.get(&v, &mut ctx.nesting).map_or_else( 146 ctx.bindings.get(&v, &mut ctx.nesting).map_or_else(
147 |e| (Fragment::Tokens(tt::TokenTree::empty()), Some(e)), 147 |e| ExpandResult(Fragment::Tokens(tt::TokenTree::empty()), Some(e)),
148 |b| (b.clone(), None), 148 |b| ExpandResult::ok(b.clone()),
149 ) 149 )
150 } 150 }
151} 151}
@@ -165,7 +165,7 @@ fn expand_repeat(
165 let mut counter = 0; 165 let mut counter = 0;
166 166
167 loop { 167 loop {
168 let (mut t, e) = expand_subtree(ctx, template); 168 let ExpandResult(mut t, e) = expand_subtree(ctx, template);
169 let nesting_state = ctx.nesting.last_mut().unwrap(); 169 let nesting_state = ctx.nesting.last_mut().unwrap();
170 if nesting_state.at_end || !nesting_state.hit { 170 if nesting_state.at_end || !nesting_state.hit {
171 break; 171 break;
@@ -225,9 +225,9 @@ fn expand_repeat(
225 let tt = tt::Subtree { delimiter: None, token_trees: buf }.into(); 225 let tt = tt::Subtree { delimiter: None, token_trees: buf }.into();
226 226
227 if RepeatKind::OneOrMore == kind && counter == 0 { 227 if RepeatKind::OneOrMore == kind && counter == 0 {
228 return (Fragment::Tokens(tt), Some(ExpandError::UnexpectedToken)); 228 return ExpandResult(Fragment::Tokens(tt), Some(ExpandError::UnexpectedToken));
229 } 229 }
230 (Fragment::Tokens(tt), None) 230 ExpandResult::ok(Fragment::Tokens(tt))
231} 231}
232 232
233fn push_fragment(buf: &mut Vec<tt::TokenTree>, fragment: Fragment) { 233fn push_fragment(buf: &mut Vec<tt::TokenTree>, fragment: Fragment) {