From 28e4b10f46d97127f6b029d6121c5be0b24cba2c Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Thu, 1 Jul 2021 19:20:42 +0200 Subject: [PATCH] Fix nested macro in block defining items --- crates/hir_def/src/body/tests/block.rs | 32 ++++++++++++++++++++++++++ crates/hir_def/src/item_tree/lower.rs | 9 ++++++++ 2 files changed, 41 insertions(+) diff --git a/crates/hir_def/src/body/tests/block.rs b/crates/hir_def/src/body/tests/block.rs index 15c10d053f2..9e4d72d4898 100644 --- a/crates/hir_def/src/body/tests/block.rs +++ b/crates/hir_def/src/body/tests/block.rs @@ -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 + "#]], + ) +} diff --git a/crates/hir_def/src/item_tree/lower.rs b/crates/hir_def/src/item_tree/lower.rs index 5b1386406b8..ac841c37a15 100644 --- a/crates/hir_def/src/item_tree/lower.rs +++ b/crates/hir_def/src/item_tree/lower.rs @@ -51,6 +51,15 @@ impl<'a> Ctx<'a> { .statements() .filter_map(|stmt| match stmt { 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, }) .flat_map(|item| self.lower_mod_item(&item, false))