mbe: treat _ as ident

This commit is contained in:
Laurențiu Nicola 2020-12-18 17:47:48 +02:00
parent f4929fa9cc
commit 75a26f64ff
4 changed files with 18 additions and 3 deletions

View file

@ -97,7 +97,7 @@ fn expand_subtree(
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);

View file

@ -101,7 +101,9 @@ fn next_op<'a>(
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)?;

View file

@ -313,7 +313,7 @@ trait TokenConvertor {
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![')'])),
@ -378,6 +378,7 @@ trait TokenConvertor {
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 => {

View file

@ -991,6 +991,18 @@ fn test_tt_composite2() {
);
}
#[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(