Unnamed repository; edit this file 'description' to name the repository.
fix: resolve extern prelude for local mods in block modules
roife 2024-05-17
parent 9bc6873 · commit 55db953
-rw-r--r--crates/hir-def/src/nameres/collector.rs2
-rw-r--r--crates/hir-def/src/nameres/path_resolution.rs17
2 files changed, 12 insertions, 7 deletions
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index 262bc538b9..587997c473 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -395,6 +395,8 @@ impl DefCollector<'_> {
.cfg()
.map_or(true, |cfg| self.cfg_options.check(&cfg) != Some(false));
if is_cfg_enabled {
+ self.inject_prelude();
+
ModCollector {
def_collector: self,
macro_depth: 0,
diff --git a/crates/hir-def/src/nameres/path_resolution.rs b/crates/hir-def/src/nameres/path_resolution.rs
index ee29b89f3d..7776cb7068 100644
--- a/crates/hir-def/src/nameres/path_resolution.rs
+++ b/crates/hir-def/src/nameres/path_resolution.rs
@@ -18,7 +18,9 @@ use crate::{
db::DefDatabase,
item_scope::{ImportOrExternCrate, BUILTIN_SCOPE},
item_tree::Fields,
- nameres::{sub_namespace_match, BlockInfo, BuiltinShadowMode, DefMap, MacroSubNs},
+ nameres::{
+ sub_namespace_match, BlockInfo, BuiltinShadowMode, DefMap, MacroSubNs, ModuleOrigin,
+ },
path::{ModPath, PathKind},
per_ns::PerNs,
visibility::{RawVisibility, Visibility},
@@ -221,7 +223,7 @@ impl DefMap {
None => return ResolvePathResult::empty(ReachedFixedPoint::Yes),
};
tracing::debug!("resolving {:?} in crate root (+ extern prelude)", segment);
- self.resolve_name_in_crate_root_or_extern_prelude(db, segment)
+ self.resolve_name_in_crate_root_or_extern_prelude(db, original_module, segment)
}
PathKind::Plain => {
let (_, segment) = match segments.next() {
@@ -470,9 +472,9 @@ impl DefMap {
};
let extern_prelude = || {
- if self.block.is_some() {
- // Don't resolve extern prelude in block `DefMap`s, defer it to the crate def map so
- // that blocks can properly shadow them
+ if matches!(self[module].origin, ModuleOrigin::BlockExpr { .. }) {
+ // Don't resolve extern prelude in pseudo-modules of blocks, because
+ // they might been shadowed by local names.
return PerNs::none();
}
self.data.extern_prelude.get(name).map_or(PerNs::none(), |&(it, extern_crate)| {
@@ -505,6 +507,7 @@ impl DefMap {
fn resolve_name_in_crate_root_or_extern_prelude(
&self,
db: &dyn DefDatabase,
+ module: LocalModuleId,
name: &Name,
) -> PerNs {
let from_crate_root = match self.block {
@@ -515,8 +518,8 @@ impl DefMap {
None => self[Self::ROOT].scope.get(name),
};
let from_extern_prelude = || {
- if self.block.is_some() {
- // Don't resolve extern prelude in block `DefMap`s.
+ if matches!(self[module].origin, ModuleOrigin::BlockExpr { .. }) {
+ // Don't resolve extern prelude in pseudo-module of a block.
return PerNs::none();
}
self.data.extern_prelude.get(name).copied().map_or(