diff options
Diffstat (limited to 'crates/mbe/src/parser.rs')
-rw-r--r-- | crates/mbe/src/parser.rs | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/crates/mbe/src/parser.rs b/crates/mbe/src/parser.rs index b90ae7015..f891ec29c 100644 --- a/crates/mbe/src/parser.rs +++ b/crates/mbe/src/parser.rs | |||
@@ -3,15 +3,16 @@ | |||
3 | 3 | ||
4 | use smallvec::SmallVec; | 4 | use smallvec::SmallVec; |
5 | use syntax::SmolStr; | 5 | use syntax::SmolStr; |
6 | use tt::Delimiter; | ||
6 | 7 | ||
7 | use crate::{tt_iter::TtIter, MetaTemplate, ParseError}; | 8 | use crate::{tt_iter::TtIter, MetaTemplate, ParseError}; |
8 | 9 | ||
9 | #[derive(Clone, Debug, PartialEq, Eq)] | 10 | #[derive(Clone, Debug, PartialEq, Eq)] |
10 | pub(crate) enum Op { | 11 | pub(crate) enum Op { |
11 | Var { name: SmolStr, kind: Option<SmolStr>, id: tt::TokenId }, | 12 | Var { name: SmolStr, kind: Option<SmolStr>, id: tt::TokenId }, |
12 | Repeat { subtree: MetaTemplate, kind: RepeatKind, separator: Option<Separator> }, | 13 | Repeat { tokens: MetaTemplate, kind: RepeatKind, separator: Option<Separator> }, |
13 | Leaf(tt::Leaf), | 14 | Leaf(tt::Leaf), |
14 | Subtree(MetaTemplate), | 15 | Subtree { tokens: MetaTemplate, delimiter: Option<Delimiter> }, |
15 | } | 16 | } |
16 | 17 | ||
17 | #[derive(Copy, Clone, Debug, PartialEq, Eq)] | 18 | #[derive(Copy, Clone, Debug, PartialEq, Eq)] |
@@ -92,12 +93,10 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul | |||
92 | match second { | 93 | match second { |
93 | tt::TokenTree::Subtree(subtree) => { | 94 | tt::TokenTree::Subtree(subtree) => { |
94 | let (separator, kind) = parse_repeat(src)?; | 95 | let (separator, kind) = parse_repeat(src)?; |
95 | let delimiter = subtree.delimiter; | ||
96 | let tokens = parse_inner(&subtree, mode) | 96 | let tokens = parse_inner(&subtree, mode) |
97 | .into_iter() | 97 | .into_iter() |
98 | .collect::<Result<Vec<Op>, ParseError>>()?; | 98 | .collect::<Result<Vec<Op>, ParseError>>()?; |
99 | let subtree = MetaTemplate { tokens, delimiter }; | 99 | Op::Repeat { tokens: MetaTemplate(tokens), separator, kind } |
100 | Op::Repeat { subtree, separator, kind } | ||
101 | } | 100 | } |
102 | tt::TokenTree::Leaf(leaf) => match leaf { | 101 | tt::TokenTree::Leaf(leaf) => match leaf { |
103 | tt::Leaf::Punct(punct) => { | 102 | tt::Leaf::Punct(punct) => { |
@@ -136,12 +135,9 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul | |||
136 | } | 135 | } |
137 | tt::TokenTree::Leaf(tt) => Op::Leaf(tt.clone()), | 136 | tt::TokenTree::Leaf(tt) => Op::Leaf(tt.clone()), |
138 | tt::TokenTree::Subtree(subtree) => { | 137 | tt::TokenTree::Subtree(subtree) => { |
139 | let delimiter = subtree.delimiter; | ||
140 | let tokens = | 138 | let tokens = |
141 | parse_inner(&subtree, mode).into_iter().collect::<Result<Vec<Op>, ParseError>>()?; | 139 | parse_inner(&subtree, mode).into_iter().collect::<Result<Vec<Op>, ParseError>>()?; |
142 | 140 | Op::Subtree { tokens: MetaTemplate(tokens), delimiter: subtree.delimiter } | |
143 | let subtree = MetaTemplate { tokens, delimiter }; | ||
144 | Op::Subtree(subtree) | ||
145 | } | 141 | } |
146 | }; | 142 | }; |
147 | Ok(res) | 143 | Ok(res) |