diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index 46a3c60cdd8..28b73c3a18d 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs @@ -1467,12 +1467,13 @@ impl ModCollector<'_, '_> { }, ) { Ok(Ok(macro_call_id)) => { - self.def_collector.unexpanded_macros.push(MacroDirective { - module_id: self.module_id, - ast_id, - legacy: Some(macro_call_id), - depth: self.macro_depth + 1, - }); + // Legacy macros need to be expanded immediately, so that any macros they produce + // are in scope. + self.def_collector.collect_macro_expansion( + self.module_id, + macro_call_id, + self.macro_depth + 1, + ); return; } diff --git a/crates/hir_def/src/nameres/tests/macros.rs b/crates/hir_def/src/nameres/tests/macros.rs index d59d3c0db1d..6d3cb8d7afa 100644 --- a/crates/hir_def/src/nameres/tests/macros.rs +++ b/crates/hir_def/src/nameres/tests/macros.rs @@ -712,6 +712,27 @@ b! { static = #[] ();} ); } +#[test] +fn macros_defining_macros() { + check( + r#" +macro_rules! item { + ($item:item) => { $item } +} + +item! { + macro_rules! indirect_macro { () => { struct S {} } } +} + +indirect_macro!(); + "#, + expect![[r#" + crate + S: t + "#]], + ); +} + #[test] fn resolves_proc_macros() { check(