From 175229ab3d3243991aebfad6cf7052c1b5bc4ecf Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Fri, 11 Dec 2020 17:59:04 +0800 Subject: negative sign matching in mbe matching for literal --- crates/mbe/src/mbe_expander/matcher.rs | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'crates/mbe/src/mbe_expander') diff --git a/crates/mbe/src/mbe_expander/matcher.rs b/crates/mbe/src/mbe_expander/matcher.rs index 3f8445897..4860b242d 100644 --- a/crates/mbe/src/mbe_expander/matcher.rs +++ b/crates/mbe/src/mbe_expander/matcher.rs @@ -356,6 +356,18 @@ impl<'a> TtIter<'a> { ExpandResult { value: _, err: Some(_) } => None, } } + + pub(crate) fn eat_char(&mut self) -> Option { + let mut fork = self.clone(); + match fork.expect_char('-') { + Ok(_) => { + let tt = self.next().cloned(); + *self = fork; + tt + } + Err(_) => None, + } + } } pub(super) fn match_repeat( @@ -447,10 +459,22 @@ fn match_meta_var(kind: &str, input: &mut TtIter) -> ExpandResult input - .expect_literal() - .map(|literal| Some(tt::Leaf::from(literal.clone()).into())) - .map_err(|()| err!()), + "literal" => { + let neg = input.eat_char(); + input + .expect_literal() + .map(|literal| { + let lit = tt::Leaf::from(literal.clone()); + match neg { + None => Some(lit.into()), + Some(neg) => Some(tt::TokenTree::Subtree(tt::Subtree { + delimiter: None, + token_trees: vec![neg, lit.into()], + })), + } + }) + .map_err(|()| err!()) + } // `vis` is optional "vis" => match input.eat_vis() { Some(vis) => Ok(Some(vis)), -- cgit v1.2.3