From e4e2338f97d734624fb21b7972c73288ca04e65e Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Wed, 24 Apr 2019 02:59:38 +0800 Subject: Fix incorrect repeat sep eating --- crates/ra_mbe/src/mbe_expander.rs | 57 +++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 23 deletions(-) (limited to 'crates/ra_mbe/src/mbe_expander.rs') diff --git a/crates/ra_mbe/src/mbe_expander.rs b/crates/ra_mbe/src/mbe_expander.rs index 00fb09a3b..91b6db522 100644 --- a/crates/ra_mbe/src/mbe_expander.rs +++ b/crates/ra_mbe/src/mbe_expander.rs @@ -179,10 +179,10 @@ fn match_lhs(pattern: &crate::Subtree, input: &mut TtCursor) -> Result { - // let token = input.eat().ok_or(ExpandError::UnexpectedToken)?.clone(); - // res.inner.insert(text.clone(), Binding::Simple(token.into())); - // } + "tt" => { + let token = input.eat().ok_or(ExpandError::UnexpectedToken)?.clone(); + res.inner.insert(text.clone(), Binding::Simple(token.into())); + } "item" => { let item = input.eat_item().ok_or(ExpandError::UnexpectedToken)?.clone(); @@ -226,18 +226,36 @@ fn match_lhs(pattern: &crate::Subtree, input: &mut TtCursor) -> Result { + counter += 1; + limit -= 1; + if limit == 0 { + break; } + + memento = input.save(); + res.push_nested(nested)?; + if counter == 1 { + if let crate::RepeatKind::ZeroOrOne = kind { + break; + } + } + + if let Some(separator) = *separator { + if input.eat_punct().map(|p| p.char) != Some(separator) { + input.rollback(memento); + break; + } + } + } + Err(_) => { + input.rollback(memento); + break; } } } @@ -246,10 +264,6 @@ fn match_lhs(pattern: &crate::Subtree, input: &mut TtCursor) -> Result { return Err(ExpandError::UnexpectedToken); } - crate::RepeatKind::ZeroOrOne if counter > 1 => { - return Err(ExpandError::UnexpectedToken); - } - _ => {} } } @@ -333,10 +347,7 @@ fn expand_tt( } } nesting.pop().unwrap(); - - // Dirty hack for remove the last sep - // if it is a "," undo the push - if has_sep && repeat.separator.unwrap() == ',' { + if has_sep { token_trees.pop(); } -- cgit v1.2.3