err = err.or(e);
arena.push(tt.into());
}
- Op::Var { name, kind: _ } => {
+ Op::Var { name, .. } => {
let ExpandResult { value: fragment, err: e } = expand_var(ctx, name);
err = err.or(e);
push_fragment(arena, fragment);
Op::Repeat { subtree, separator, kind }
}
tt::TokenTree::Leaf(leaf) => match leaf {
- tt::Leaf::Punct(..) => return Err(ExpandError::UnexpectedToken),
+ tt::Leaf::Punct(_) => {
+ return Err(ExpandError::UnexpectedToken);
+ }
tt::Leaf::Ident(ident) => {
let name = &ident.text;
let kind = eat_fragment_kind(src, mode)?;
return;
}
- result.push(if k.is_punct() {
+ result.push(if k.is_punct() && k != UNDERSCORE {
assert_eq!(range.len(), TextSize::of('.'));
let delim = match k {
T!['('] => Some((tt::DelimiterKind::Parenthesis, T![')'])),
let leaf: tt::Leaf = match k {
T![true] | T![false] => make_leaf!(Ident),
IDENT => make_leaf!(Ident),
+ UNDERSCORE => make_leaf!(Ident),
k if k.is_keyword() => make_leaf!(Ident),
k if k.is_literal() => make_leaf!(Literal),
LIFETIME_IDENT => {
);
}
+#[test]
+fn test_underscore() {
+ parse_macro(
+ r#"
+ macro_rules! foo {
+ ($_:tt) => { 0 }
+ }
+ "#,
+ )
+ .assert_expand_items(r#"foo! { => }"#, r#"0"#);
+}
+
#[test]
fn test_lifetime() {
parse_macro(