Skip to content

Commit 5916da2

Browse files
committed
Handle macro_rules! as MACRO_CALL
It's a call of the third token is neither IDENT or TRY
1 parent 2b02df2 commit 5916da2

File tree

5 files changed

+142
-2
lines changed

5 files changed

+142
-2
lines changed

crates/parser/src/grammar/items.rs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,21 @@ pub(super) fn item_or_macro(p: &mut Parser<'_>, stop_on_r_curly: bool) {
5858
Err(m) => m,
5959
};
6060

61-
if paths::is_use_path_start(p) {
61+
// test macro_rules_as_macro_name
62+
// macro_rules! {}
63+
// macro_rules! {};
64+
// macro_rules! ();
65+
// macro_rules! [];
66+
// fn main() {
67+
// let foo = macro_rules!();
68+
// }
69+
70+
// test_err macro_rules_as_macro_name
71+
// macro_rules! ()
72+
// macro_rules! []
73+
if paths::is_use_path_start(p)
74+
|| (p.at_contextual_kw(T![macro_rules]) && p.nth_at(1, BANG) && !p.nth_at(2, IDENT))
75+
{
6276
match macro_call(p) {
6377
BlockLike::Block => (),
6478
BlockLike::NotBlock => {
@@ -228,7 +242,15 @@ fn opt_item_without_modifiers(p: &mut Parser<'_>, m: Marker) -> Result<(), Marke
228242
IDENT if p.at_contextual_kw(T![union]) && p.nth(1) == IDENT => adt::union(p, m),
229243

230244
T![macro] => macro_def(p, m),
231-
IDENT if p.at_contextual_kw(T![macro_rules]) && p.nth(1) == BANG => macro_rules(p, m),
245+
// check if current token is "macro_rules" followed by "!" followed by an identifier or "try"
246+
// try is keyword since the 2018 edition and the parser is not edition aware (yet!)
247+
IDENT
248+
if p.at_contextual_kw(T![macro_rules])
249+
&& p.nth_at(1, BANG)
250+
&& (p.nth_at(2, IDENT) || p.nth_at(2, T![try])) =>
251+
{
252+
macro_rules(p, m)
253+
}
232254

233255
T![const] if (la == IDENT || la == T![_] || la == T![mut]) => consts::konst(p, m),
234256
T![static] if (la == IDENT || la == T![_] || la == T![mut]) => consts::static_(p, m),
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
SOURCE_FILE
2+
MACRO_CALL
3+
PATH
4+
PATH_SEGMENT
5+
NAME_REF
6+
IDENT "macro_rules"
7+
BANG "!"
8+
WHITESPACE " "
9+
TOKEN_TREE
10+
L_PAREN "("
11+
R_PAREN ")"
12+
WHITESPACE "\n"
13+
MACRO_CALL
14+
PATH
15+
PATH_SEGMENT
16+
NAME_REF
17+
IDENT "macro_rules"
18+
BANG "!"
19+
WHITESPACE " "
20+
TOKEN_TREE
21+
L_BRACK "["
22+
R_BRACK "]"
23+
WHITESPACE "\n"
24+
error 15: expected SEMICOLON
25+
error 31: expected SEMICOLON
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
macro_rules! ()
2+
macro_rules! []
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
SOURCE_FILE
2+
MACRO_CALL
3+
PATH
4+
PATH_SEGMENT
5+
NAME_REF
6+
IDENT "macro_rules"
7+
BANG "!"
8+
WHITESPACE " "
9+
TOKEN_TREE
10+
L_CURLY "{"
11+
R_CURLY "}"
12+
WHITESPACE "\n"
13+
MACRO_CALL
14+
PATH
15+
PATH_SEGMENT
16+
NAME_REF
17+
IDENT "macro_rules"
18+
BANG "!"
19+
WHITESPACE " "
20+
TOKEN_TREE
21+
L_CURLY "{"
22+
R_CURLY "}"
23+
SEMICOLON ";"
24+
WHITESPACE "\n"
25+
MACRO_CALL
26+
PATH
27+
PATH_SEGMENT
28+
NAME_REF
29+
IDENT "macro_rules"
30+
BANG "!"
31+
WHITESPACE " "
32+
TOKEN_TREE
33+
L_PAREN "("
34+
R_PAREN ")"
35+
SEMICOLON ";"
36+
WHITESPACE "\n"
37+
MACRO_CALL
38+
PATH
39+
PATH_SEGMENT
40+
NAME_REF
41+
IDENT "macro_rules"
42+
BANG "!"
43+
WHITESPACE " "
44+
TOKEN_TREE
45+
L_BRACK "["
46+
R_BRACK "]"
47+
SEMICOLON ";"
48+
WHITESPACE "\n"
49+
FN
50+
FN_KW "fn"
51+
WHITESPACE " "
52+
NAME
53+
IDENT "main"
54+
PARAM_LIST
55+
L_PAREN "("
56+
R_PAREN ")"
57+
WHITESPACE " "
58+
BLOCK_EXPR
59+
STMT_LIST
60+
L_CURLY "{"
61+
WHITESPACE "\n "
62+
LET_STMT
63+
LET_KW "let"
64+
WHITESPACE " "
65+
IDENT_PAT
66+
NAME
67+
IDENT "foo"
68+
WHITESPACE " "
69+
EQ "="
70+
WHITESPACE " "
71+
MACRO_EXPR
72+
MACRO_CALL
73+
PATH
74+
PATH_SEGMENT
75+
NAME_REF
76+
IDENT "macro_rules"
77+
BANG "!"
78+
TOKEN_TREE
79+
L_PAREN "("
80+
R_PAREN ")"
81+
SEMICOLON ";"
82+
WHITESPACE "\n"
83+
R_CURLY "}"
84+
WHITESPACE "\n"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
macro_rules! {}
2+
macro_rules! {};
3+
macro_rules! ();
4+
macro_rules! [];
5+
fn main() {
6+
let foo = macro_rules!();
7+
}

0 commit comments

Comments
 (0)