mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-28 05:53:45 +00:00
Auto merge of #16314 - Urhengulas:macro_rule-as-macro-name, r=Veykril
`macro_rules` as macro name This PR makes RA parse `macro_rules! {}` (note the missing identifier) as a `MACRO_CALL` instead of `MACRO_RULES`. Fixes #15969.
This commit is contained in:
commit
c820980648
5 changed files with 144 additions and 2 deletions
|
@ -58,7 +58,21 @@ pub(super) fn item_or_macro(p: &mut Parser<'_>, stop_on_r_curly: bool) {
|
||||||
Err(m) => m,
|
Err(m) => m,
|
||||||
};
|
};
|
||||||
|
|
||||||
if paths::is_use_path_start(p) {
|
// test macro_rules_as_macro_name
|
||||||
|
// macro_rules! {}
|
||||||
|
// macro_rules! ();
|
||||||
|
// macro_rules! [];
|
||||||
|
// fn main() {
|
||||||
|
// let foo = macro_rules!();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// test_err macro_rules_as_macro_name
|
||||||
|
// macro_rules! {};
|
||||||
|
// macro_rules! ()
|
||||||
|
// macro_rules! []
|
||||||
|
if paths::is_use_path_start(p)
|
||||||
|
|| (p.at_contextual_kw(T![macro_rules]) && p.nth_at(1, BANG) && !p.nth_at(2, IDENT))
|
||||||
|
{
|
||||||
match macro_call(p) {
|
match macro_call(p) {
|
||||||
BlockLike::Block => (),
|
BlockLike::Block => (),
|
||||||
BlockLike::NotBlock => {
|
BlockLike::NotBlock => {
|
||||||
|
@ -228,7 +242,15 @@ fn opt_item_without_modifiers(p: &mut Parser<'_>, m: Marker) -> Result<(), Marke
|
||||||
IDENT if p.at_contextual_kw(T![union]) && p.nth(1) == IDENT => adt::union(p, m),
|
IDENT if p.at_contextual_kw(T![union]) && p.nth(1) == IDENT => adt::union(p, m),
|
||||||
|
|
||||||
T![macro] => macro_def(p, m),
|
T![macro] => macro_def(p, m),
|
||||||
IDENT if p.at_contextual_kw(T![macro_rules]) && p.nth(1) == BANG => macro_rules(p, m),
|
// check if current token is "macro_rules" followed by "!" followed by an identifier or "try"
|
||||||
|
// try is keyword since the 2018 edition and the parser is not edition aware (yet!)
|
||||||
|
IDENT
|
||||||
|
if p.at_contextual_kw(T![macro_rules])
|
||||||
|
&& p.nth_at(1, BANG)
|
||||||
|
&& (p.nth_at(2, IDENT) || p.nth_at(2, T![try])) =>
|
||||||
|
{
|
||||||
|
macro_rules(p, m)
|
||||||
|
}
|
||||||
|
|
||||||
T![const] if (la == IDENT || la == T![_] || la == T![mut]) => consts::konst(p, m),
|
T![const] if (la == IDENT || la == T![_] || la == T![mut]) => consts::konst(p, m),
|
||||||
T![static] if (la == IDENT || la == T![_] || la == T![mut]) => consts::static_(p, m),
|
T![static] if (la == IDENT || la == T![_] || la == T![mut]) => consts::static_(p, m),
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
SOURCE_FILE
|
||||||
|
MACRO_CALL
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "macro_rules"
|
||||||
|
BANG "!"
|
||||||
|
WHITESPACE " "
|
||||||
|
TOKEN_TREE
|
||||||
|
L_CURLY "{"
|
||||||
|
R_CURLY "}"
|
||||||
|
ERROR
|
||||||
|
SEMICOLON ";"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
MACRO_CALL
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "macro_rules"
|
||||||
|
BANG "!"
|
||||||
|
WHITESPACE " "
|
||||||
|
TOKEN_TREE
|
||||||
|
L_PAREN "("
|
||||||
|
R_PAREN ")"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
MACRO_CALL
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "macro_rules"
|
||||||
|
BANG "!"
|
||||||
|
WHITESPACE " "
|
||||||
|
TOKEN_TREE
|
||||||
|
L_BRACK "["
|
||||||
|
R_BRACK "]"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
error 15: expected an item
|
||||||
|
error 32: expected SEMICOLON
|
||||||
|
error 48: expected SEMICOLON
|
|
@ -0,0 +1,3 @@
|
||||||
|
macro_rules! {};
|
||||||
|
macro_rules! ()
|
||||||
|
macro_rules! []
|
|
@ -0,0 +1,72 @@
|
||||||
|
SOURCE_FILE
|
||||||
|
MACRO_CALL
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "macro_rules"
|
||||||
|
BANG "!"
|
||||||
|
WHITESPACE " "
|
||||||
|
TOKEN_TREE
|
||||||
|
L_CURLY "{"
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
MACRO_CALL
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "macro_rules"
|
||||||
|
BANG "!"
|
||||||
|
WHITESPACE " "
|
||||||
|
TOKEN_TREE
|
||||||
|
L_PAREN "("
|
||||||
|
R_PAREN ")"
|
||||||
|
SEMICOLON ";"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
MACRO_CALL
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "macro_rules"
|
||||||
|
BANG "!"
|
||||||
|
WHITESPACE " "
|
||||||
|
TOKEN_TREE
|
||||||
|
L_BRACK "["
|
||||||
|
R_BRACK "]"
|
||||||
|
SEMICOLON ";"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
FN
|
||||||
|
FN_KW "fn"
|
||||||
|
WHITESPACE " "
|
||||||
|
NAME
|
||||||
|
IDENT "main"
|
||||||
|
PARAM_LIST
|
||||||
|
L_PAREN "("
|
||||||
|
R_PAREN ")"
|
||||||
|
WHITESPACE " "
|
||||||
|
BLOCK_EXPR
|
||||||
|
STMT_LIST
|
||||||
|
L_CURLY "{"
|
||||||
|
WHITESPACE "\n "
|
||||||
|
LET_STMT
|
||||||
|
LET_KW "let"
|
||||||
|
WHITESPACE " "
|
||||||
|
IDENT_PAT
|
||||||
|
NAME
|
||||||
|
IDENT "foo"
|
||||||
|
WHITESPACE " "
|
||||||
|
EQ "="
|
||||||
|
WHITESPACE " "
|
||||||
|
MACRO_EXPR
|
||||||
|
MACRO_CALL
|
||||||
|
PATH
|
||||||
|
PATH_SEGMENT
|
||||||
|
NAME_REF
|
||||||
|
IDENT "macro_rules"
|
||||||
|
BANG "!"
|
||||||
|
TOKEN_TREE
|
||||||
|
L_PAREN "("
|
||||||
|
R_PAREN ")"
|
||||||
|
SEMICOLON ";"
|
||||||
|
WHITESPACE "\n"
|
||||||
|
R_CURLY "}"
|
||||||
|
WHITESPACE "\n"
|
|
@ -0,0 +1,6 @@
|
||||||
|
macro_rules! {}
|
||||||
|
macro_rules! ();
|
||||||
|
macro_rules! [];
|
||||||
|
fn main() {
|
||||||
|
let foo = macro_rules!();
|
||||||
|
}
|
Loading…
Reference in a new issue