9445: fix: Fix nested macro in block defining items r=jonas-schievink a=jonas-schievink

Fixes https://github.com/rust-analyzer/rust-analyzer/issues/8930

bors r+

Co-authored-by: Jonas Schievink <jonasschievink@gmail.com>
This commit is contained in:
bors[bot] 2021-07-01 17:21:34 +00:00 committed by GitHub
commit 920b2c8630
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 41 additions and 0 deletions

View File

@ -312,3 +312,35 @@ mod m {
"#]], "#]],
); );
} }
#[test]
fn nested_macro_item_decl() {
cov_mark::check!(macro_call_in_macro_stmts_is_added_to_item_tree);
check_at(
r#"
macro_rules! inner_declare {
($ident:ident) => {
static $ident: u32 = 0;
};
}
macro_rules! declare {
($ident:ident) => {
inner_declare!($ident);
};
}
fn foo() {
declare!(bar);
bar;
$0
}
"#,
expect![[r#"
block scope
bar: v
crate
foo: v
"#]],
)
}

View File

@ -51,6 +51,15 @@ impl<'a> Ctx<'a> {
.statements() .statements()
.filter_map(|stmt| match stmt { .filter_map(|stmt| match stmt {
ast::Stmt::Item(item) => Some(item), ast::Stmt::Item(item) => Some(item),
// Macro calls can be both items and expressions. The syntax library always treats
// them as expressions here, so we undo that.
ast::Stmt::ExprStmt(es) => match es.expr()? {
ast::Expr::MacroCall(call) => {
cov_mark::hit!(macro_call_in_macro_stmts_is_added_to_item_tree);
Some(call.into())
}
_ => None,
},
_ => None, _ => None,
}) })
.flat_map(|item| self.lower_mod_item(&item, false)) .flat_map(|item| self.lower_mod_item(&item, false))