diff --git a/crates/hir_def/src/nameres.rs b/crates/hir_def/src/nameres.rs index 6169b3bbcbd..5efc2fe470a 100644 --- a/crates/hir_def/src/nameres.rs +++ b/crates/hir_def/src/nameres.rs @@ -258,6 +258,10 @@ impl DefMap { self.krate } + pub(crate) fn block_id(&self) -> Option { + self.block.as_ref().map(|block| block.block) + } + pub(crate) fn prelude(&self) -> Option { self.prelude } diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index fcc8e2607ea..6e86cc4a7ab 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs @@ -592,7 +592,13 @@ impl DefCollector<'_> { // glob import from same crate => we do an initial // import, and then need to propagate any further // additions - let scope = &self.def_map[m.local_id].scope; + let def_map; + let scope = if m.block == self.def_map.block_id() { + &self.def_map[m.local_id].scope + } else { + def_map = m.def_map(self.db); + &def_map[m.local_id].scope + }; // Module scoped macros is included let items = scope diff --git a/crates/hir_def/src/nameres/path_resolution.rs b/crates/hir_def/src/nameres/path_resolution.rs index 2a0f8ec2bc8..2d1477160e4 100644 --- a/crates/hir_def/src/nameres/path_resolution.rs +++ b/crates/hir_def/src/nameres/path_resolution.rs @@ -271,8 +271,16 @@ impl DefMap { ); } + let def_map; + let module_data = if module.block == self.block_id() { + &self[module.local_id] + } else { + def_map = module.def_map(db); + &def_map[module.local_id] + }; + // Since it is a qualified path here, it should not contains legacy macros - self[module.local_id].scope.get(&segment) + module_data.scope.get(&segment) } ModuleDefId::AdtId(AdtId::EnumId(e)) => { // enum variant