Skip to content

Commit 4e35227

Browse files
committed
minor: simplify
1 parent 613609c commit 4e35227

File tree

1 file changed

+18
-22
lines changed

1 file changed

+18
-22
lines changed

crates/mbe/src/parser.rs

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,28 @@ pub(crate) struct MetaTemplate(pub(crate) Vec<Op>);
2424

2525
impl MetaTemplate {
2626
pub(crate) fn parse_pattern(pattern: &tt::Subtree) -> Result<MetaTemplate, ParseError> {
27-
let ops =
28-
parse_inner(pattern, Mode::Pattern).into_iter().collect::<Result<_, ParseError>>()?;
29-
Ok(MetaTemplate(ops))
27+
MetaTemplate::parse(pattern, Mode::Pattern)
3028
}
3129

3230
pub(crate) fn parse_template(template: &tt::Subtree) -> Result<MetaTemplate, ParseError> {
33-
let ops =
34-
parse_inner(template, Mode::Template).into_iter().collect::<Result<_, ParseError>>()?;
35-
Ok(MetaTemplate(ops))
31+
MetaTemplate::parse(template, Mode::Template)
3632
}
3733

3834
pub(crate) fn iter(&self) -> impl Iterator<Item = &Op> {
3935
self.0.iter()
4036
}
37+
38+
fn parse(tt: &tt::Subtree, mode: Mode) -> Result<MetaTemplate, ParseError> {
39+
let mut src = TtIter::new(tt);
40+
41+
let mut res = Vec::new();
42+
while let Some(first) = src.next() {
43+
let op = next_op(first, &mut src, mode)?;
44+
res.push(op)
45+
}
46+
47+
Ok(MetaTemplate(res))
48+
}
4149
}
4250

4351
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -96,15 +104,6 @@ enum Mode {
96104
Template,
97105
}
98106

99-
fn parse_inner(tt: &tt::Subtree, mode: Mode) -> Vec<Result<Op, ParseError>> {
100-
let mut src = TtIter::new(tt);
101-
std::iter::from_fn(move || {
102-
let first = src.next()?;
103-
Some(next_op(first, &mut src, mode))
104-
})
105-
.collect()
106-
}
107-
108107
macro_rules! err {
109108
($($tt:tt)*) => {
110109
ParseError::UnexpectedToken(($($tt)*).to_string())
@@ -128,10 +127,8 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul
128127
match second {
129128
tt::TokenTree::Subtree(subtree) => {
130129
let (separator, kind) = parse_repeat(src)?;
131-
let tokens = parse_inner(subtree, mode)
132-
.into_iter()
133-
.collect::<Result<Vec<Op>, ParseError>>()?;
134-
Op::Repeat { tokens: MetaTemplate(tokens), separator, kind }
130+
let tokens = MetaTemplate::parse(subtree, mode)?;
131+
Op::Repeat { tokens, separator, kind }
135132
}
136133
tt::TokenTree::Leaf(leaf) => match leaf {
137134
tt::Leaf::Punct(_) => {
@@ -162,9 +159,8 @@ fn next_op<'a>(first: &tt::TokenTree, src: &mut TtIter<'a>, mode: Mode) -> Resul
162159
}
163160
tt::TokenTree::Leaf(tt) => Op::Leaf(tt.clone()),
164161
tt::TokenTree::Subtree(subtree) => {
165-
let tokens =
166-
parse_inner(subtree, mode).into_iter().collect::<Result<Vec<Op>, ParseError>>()?;
167-
Op::Subtree { tokens: MetaTemplate(tokens), delimiter: subtree.delimiter }
162+
let tokens = MetaTemplate::parse(subtree, mode)?;
163+
Op::Subtree { tokens, delimiter: subtree.delimiter }
168164
}
169165
};
170166
Ok(res)

0 commit comments

Comments
 (0)