From 299d97b6d98cec673ff056c188ac45a17febc7d4 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Wed, 24 Apr 2019 23:01:32 +0800 Subject: Add handling `token` seperator in mbe --- crates/ra_mbe/src/mbe_parser.rs | 40 +++++++++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 13 deletions(-) (limited to 'crates/ra_mbe/src/mbe_parser.rs') diff --git a/crates/ra_mbe/src/mbe_parser.rs b/crates/ra_mbe/src/mbe_parser.rs index 0710062d9..c7ab463e2 100644 --- a/crates/ra_mbe/src/mbe_parser.rs +++ b/crates/ra_mbe/src/mbe_parser.rs @@ -74,18 +74,11 @@ fn parse_var(p: &mut TtCursor, transcriber: bool) -> Result Result { - let subtree = p.eat_subtree().unwrap(); - let mut subtree = parse_subtree(subtree, transcriber)?; - subtree.delimiter = crate::Delimiter::None; - let sep = p.eat_punct().ok_or(ParseError::Expected(String::from("separator")))?; - let (separator, rep) = match sep.char { - '*' | '+' | '?' => (None, sep.char), - char => { - (Some(char), p.eat_punct().ok_or(ParseError::Expected(String::from("separator")))?.char) - } - }; - +fn mk_repeat( + rep: char, + subtree: crate::Subtree, + separator: Option, +) -> Result { let kind = match rep { '*' => crate::RepeatKind::ZeroOrMore, '+' => crate::RepeatKind::OneOrMore, @@ -95,6 +88,27 @@ fn parse_repeat(p: &mut TtCursor, transcriber: bool) -> Result Result { + let subtree = p.eat_subtree().unwrap(); + let mut subtree = parse_subtree(subtree, transcriber)?; + subtree.delimiter = crate::Delimiter::None; + + if let Some(rep) = p.at_punct() { + match rep.char { + '*' | '+' | '?' => { + p.bump(); + return mk_repeat(rep.char, subtree, None); + } + _ => {} + } + } + + let sep = p.eat_seperator().ok_or(ParseError::Expected(String::from("separator")))?; + let rep = p.eat_punct().ok_or(ParseError::Expected(String::from("repeat")))?; + + mk_repeat(rep.char, subtree, Some(sep)) +} + #[cfg(test)] mod tests { use ra_syntax::{ast, AstNode}; @@ -109,7 +123,7 @@ mod tests { is_valid("($i:ident) => ()"); expect_err("$i:ident => ()", "subtree"); expect_err("($i:ident) ()", "`=`"); - expect_err("($($i:ident)_) => ()", "separator"); + expect_err("($($i:ident)_) => ()", "repeat"); } fn expect_err(macro_body: &str, expected: &str) { -- cgit v1.2.3