diff options
Diffstat (limited to 'crates/mbe/src/expander/transcriber.rs')
-rw-r--r-- | crates/mbe/src/expander/transcriber.rs | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/crates/mbe/src/expander/transcriber.rs b/crates/mbe/src/expander/transcriber.rs index 30c090f32..78368a33e 100644 --- a/crates/mbe/src/expander/transcriber.rs +++ b/crates/mbe/src/expander/transcriber.rs | |||
@@ -2,6 +2,7 @@ | |||
2 | //! `$ident => foo`, interpolates variables in the template, to get `fn foo() {}` | 2 | //! `$ident => foo`, interpolates variables in the template, to get `fn foo() {}` |
3 | 3 | ||
4 | use syntax::SmolStr; | 4 | use syntax::SmolStr; |
5 | use tt::Delimiter; | ||
5 | 6 | ||
6 | use super::ExpandResult; | 7 | use super::ExpandResult; |
7 | use crate::{ | 8 | use crate::{ |
@@ -54,10 +55,9 @@ pub(super) fn transcribe( | |||
54 | template: &MetaTemplate, | 55 | template: &MetaTemplate, |
55 | bindings: &Bindings, | 56 | bindings: &Bindings, |
56 | ) -> ExpandResult<tt::Subtree> { | 57 | ) -> ExpandResult<tt::Subtree> { |
57 | assert!(template.delimiter == None); | ||
58 | let mut ctx = ExpandCtx { bindings: &bindings, nesting: Vec::new() }; | 58 | let mut ctx = ExpandCtx { bindings: &bindings, nesting: Vec::new() }; |
59 | let mut arena: Vec<tt::TokenTree> = Vec::new(); | 59 | let mut arena: Vec<tt::TokenTree> = Vec::new(); |
60 | expand_subtree(&mut ctx, template, &mut arena) | 60 | expand_subtree(&mut ctx, template, None, &mut arena) |
61 | } | 61 | } |
62 | 62 | ||
63 | #[derive(Debug)] | 63 | #[derive(Debug)] |
@@ -80,6 +80,7 @@ struct ExpandCtx<'a> { | |||
80 | fn expand_subtree( | 80 | fn expand_subtree( |
81 | ctx: &mut ExpandCtx, | 81 | ctx: &mut ExpandCtx, |
82 | template: &MetaTemplate, | 82 | template: &MetaTemplate, |
83 | delimiter: Option<Delimiter>, | ||
83 | arena: &mut Vec<tt::TokenTree>, | 84 | arena: &mut Vec<tt::TokenTree>, |
84 | ) -> ExpandResult<tt::Subtree> { | 85 | ) -> ExpandResult<tt::Subtree> { |
85 | // remember how many elements are in the arena now - when returning, we want to drain exactly how many elements we added. This way, the recursive uses of the arena get their own "view" of the arena, but will reuse the allocation | 86 | // remember how many elements are in the arena now - when returning, we want to drain exactly how many elements we added. This way, the recursive uses of the arena get their own "view" of the arena, but will reuse the allocation |
@@ -88,8 +89,9 @@ fn expand_subtree( | |||
88 | for op in template.iter() { | 89 | for op in template.iter() { |
89 | match op { | 90 | match op { |
90 | Op::Leaf(tt) => arena.push(tt.clone().into()), | 91 | Op::Leaf(tt) => arena.push(tt.clone().into()), |
91 | Op::Subtree(tt) => { | 92 | Op::Subtree { tokens, delimiter } => { |
92 | let ExpandResult { value: tt, err: e } = expand_subtree(ctx, &tt, arena); | 93 | let ExpandResult { value: tt, err: e } = |
94 | expand_subtree(ctx, &tokens, *delimiter, arena); | ||
93 | err = err.or(e); | 95 | err = err.or(e); |
94 | arena.push(tt.into()); | 96 | arena.push(tt.into()); |
95 | } | 97 | } |
@@ -98,7 +100,7 @@ fn expand_subtree( | |||
98 | err = err.or(e); | 100 | err = err.or(e); |
99 | push_fragment(arena, fragment); | 101 | push_fragment(arena, fragment); |
100 | } | 102 | } |
101 | Op::Repeat { subtree, kind, separator } => { | 103 | Op::Repeat { tokens: subtree, kind, separator } => { |
102 | let ExpandResult { value: fragment, err: e } = | 104 | let ExpandResult { value: fragment, err: e } = |
103 | expand_repeat(ctx, subtree, *kind, separator, arena); | 105 | expand_repeat(ctx, subtree, *kind, separator, arena); |
104 | err = err.or(e); | 106 | err = err.or(e); |
@@ -108,7 +110,7 @@ fn expand_subtree( | |||
108 | } | 110 | } |
109 | // drain the elements added in this instance of expand_subtree | 111 | // drain the elements added in this instance of expand_subtree |
110 | let tts = arena.drain(start_elements..arena.len()).collect(); | 112 | let tts = arena.drain(start_elements..arena.len()).collect(); |
111 | ExpandResult { value: tt::Subtree { delimiter: template.delimiter, token_trees: tts }, err } | 113 | ExpandResult { value: tt::Subtree { delimiter, token_trees: tts }, err } |
112 | } | 114 | } |
113 | 115 | ||
114 | fn expand_var(ctx: &mut ExpandCtx, v: &SmolStr, id: tt::TokenId) -> ExpandResult<Fragment> { | 116 | fn expand_var(ctx: &mut ExpandCtx, v: &SmolStr, id: tt::TokenId) -> ExpandResult<Fragment> { |
@@ -162,7 +164,7 @@ fn expand_repeat( | |||
162 | let mut counter = 0; | 164 | let mut counter = 0; |
163 | 165 | ||
164 | loop { | 166 | loop { |
165 | let ExpandResult { value: mut t, err: e } = expand_subtree(ctx, template, arena); | 167 | let ExpandResult { value: mut t, err: e } = expand_subtree(ctx, template, None, arena); |
166 | let nesting_state = ctx.nesting.last_mut().unwrap(); | 168 | let nesting_state = ctx.nesting.last_mut().unwrap(); |
167 | if nesting_state.at_end || !nesting_state.hit { | 169 | if nesting_state.at_end || !nesting_state.hit { |
168 | break; | 170 | break; |