diff options
Diffstat (limited to 'crates/mbe/src/mbe_expander')
-rw-r--r-- | crates/mbe/src/mbe_expander/matcher.rs | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/crates/mbe/src/mbe_expander/matcher.rs b/crates/mbe/src/mbe_expander/matcher.rs index 3f8445897..93ee77908 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> { | |||
356 | ExpandResult { value: _, err: Some(_) } => None, | 356 | ExpandResult { value: _, err: Some(_) } => None, |
357 | } | 357 | } |
358 | } | 358 | } |
359 | |||
360 | pub(crate) fn eat_char(&mut self, c: char) -> Option<tt::TokenTree> { | ||
361 | let mut fork = self.clone(); | ||
362 | match fork.expect_char(c) { | ||
363 | Ok(_) => { | ||
364 | let tt = self.next().cloned(); | ||
365 | *self = fork; | ||
366 | tt | ||
367 | } | ||
368 | Err(_) => None, | ||
369 | } | ||
370 | } | ||
359 | } | 371 | } |
360 | 372 | ||
361 | pub(super) fn match_repeat( | 373 | pub(super) fn match_repeat( |
@@ -447,10 +459,22 @@ fn match_meta_var(kind: &str, input: &mut TtIter) -> ExpandResult<Option<Fragmen | |||
447 | .expect_lifetime() | 459 | .expect_lifetime() |
448 | .map(|tt| Some(tt)) | 460 | .map(|tt| Some(tt)) |
449 | .map_err(|()| err!("expected lifetime")), | 461 | .map_err(|()| err!("expected lifetime")), |
450 | "literal" => input | 462 | "literal" => { |
451 | .expect_literal() | 463 | let neg = input.eat_char('-'); |
452 | .map(|literal| Some(tt::Leaf::from(literal.clone()).into())) | 464 | input |
453 | .map_err(|()| err!()), | 465 | .expect_literal() |
466 | .map(|literal| { | ||
467 | let lit = tt::Leaf::from(literal.clone()); | ||
468 | match neg { | ||
469 | None => Some(lit.into()), | ||
470 | Some(neg) => Some(tt::TokenTree::Subtree(tt::Subtree { | ||
471 | delimiter: None, | ||
472 | token_trees: vec![neg, lit.into()], | ||
473 | })), | ||
474 | } | ||
475 | }) | ||
476 | .map_err(|()| err!()) | ||
477 | } | ||
454 | // `vis` is optional | 478 | // `vis` is optional |
455 | "vis" => match input.eat_vis() { | 479 | "vis" => match input.eat_vis() { |
456 | Some(vis) => Ok(Some(vis)), | 480 | Some(vis) => Ok(Some(vis)), |