Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 11b9371

Browse files
committed
Skip extern prelude path resolution in block def maps
1 parent 54e3ef6 commit 11b9371

File tree

4 files changed

+21
-32
lines changed

4 files changed

+21
-32
lines changed

crates/hir-def/src/find_path.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ fn find_path_inner(
8181
}
8282

8383
let def_map = from.def_map(db);
84-
let crate_root = def_map.crate_root(db);
84+
let crate_root = def_map.crate_root();
8585
// - if the item is a module, jump straight to module search
8686
if let ItemInNs::Types(ModuleDefId::ModuleId(module_id)) = item {
8787
let mut visited_modules = FxHashSet::default();
@@ -454,7 +454,7 @@ fn find_local_import_locations(
454454
worklist.push(ancestor);
455455
}
456456

457-
let def_map = def_map.crate_root(db).def_map(db);
457+
let def_map = def_map.crate_root().def_map(db);
458458

459459
let mut seen: FxHashSet<_> = FxHashSet::default();
460460

crates/hir-def/src/nameres.rs

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -431,15 +431,8 @@ impl DefMap {
431431
ModuleId { krate: self.krate, local_id, block }
432432
}
433433

434-
pub(crate) fn crate_root(&self, db: &dyn DefDatabase) -> ModuleId {
435-
self.with_ancestor_maps(db, Self::ROOT, &mut |def_map, _module| {
436-
if def_map.block.is_none() {
437-
Some(def_map.module_id(Self::ROOT))
438-
} else {
439-
None
440-
}
441-
})
442-
.expect("DefMap chain without root")
434+
pub(crate) fn crate_root(&self) -> ModuleId {
435+
ModuleId { krate: self.krate, block: None, local_id: DefMap::ROOT }
443436
}
444437

445438
pub(crate) fn resolve_path(

crates/hir-def/src/nameres/collector.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -834,11 +834,7 @@ impl DefCollector<'_> {
834834
fn resolve_extern_crate(&self, name: &Name) -> Option<ModuleId> {
835835
if *name == name!(self) {
836836
cov_mark::hit!(extern_crate_self_as);
837-
let root = match self.def_map.block {
838-
Some(_) => self.def_map.crate_root(self.db),
839-
None => self.def_map.module_id(DefMap::ROOT),
840-
};
841-
Some(root)
837+
Some(self.def_map.crate_root())
842838
} else {
843839
self.deps.get(name).map(|dep| ModuleId {
844840
krate: dep.crate_id,

crates/hir-def/src/nameres/path_resolution.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use crate::{
2020
path::{ModPath, PathKind},
2121
per_ns::PerNs,
2222
visibility::{RawVisibility, Visibility},
23-
AdtId, CrateId, EnumVariantId, LocalModuleId, ModuleDefId, ModuleId,
23+
AdtId, CrateId, EnumVariantId, LocalModuleId, ModuleDefId,
2424
};
2525

2626
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
@@ -74,17 +74,6 @@ impl PerNs {
7474
}
7575

7676
impl DefMap {
77-
pub(super) fn resolve_name_in_extern_prelude(
78-
&self,
79-
db: &dyn DefDatabase,
80-
name: &Name,
81-
) -> Option<ModuleId> {
82-
match self.block {
83-
Some(_) => self.crate_root(db).def_map(db).data.extern_prelude.get(name).copied(),
84-
None => self.data.extern_prelude.get(name).copied(),
85-
}
86-
}
87-
8877
pub(crate) fn resolve_visibility(
8978
&self,
9079
db: &dyn DefDatabase,
@@ -204,15 +193,15 @@ impl DefMap {
204193
PathKind::DollarCrate(krate) => {
205194
if krate == self.krate {
206195
cov_mark::hit!(macro_dollar_crate_self);
207-
PerNs::types(self.crate_root(db).into(), Visibility::Public)
196+
PerNs::types(self.crate_root().into(), Visibility::Public)
208197
} else {
209198
let def_map = db.crate_def_map(krate);
210199
let module = def_map.module_id(Self::ROOT);
211200
cov_mark::hit!(macro_dollar_crate_other);
212201
PerNs::types(module.into(), Visibility::Public)
213202
}
214203
}
215-
PathKind::Crate => PerNs::types(self.crate_root(db).into(), Visibility::Public),
204+
PathKind::Crate => PerNs::types(self.crate_root().into(), Visibility::Public),
216205
// plain import or absolute path in 2015: crate-relative with
217206
// fallback to extern prelude (with the simplification in
218207
// rust-lang/rust#57745)
@@ -453,6 +442,10 @@ impl DefMap {
453442
};
454443

455444
let extern_prelude = || {
445+
if self.block.is_some() {
446+
// Don't resolve extern prelude in block `DefMap`s.
447+
return PerNs::none();
448+
}
456449
self.data
457450
.extern_prelude
458451
.get(name)
@@ -479,13 +472,20 @@ impl DefMap {
479472
) -> PerNs {
480473
let from_crate_root = match self.block {
481474
Some(_) => {
482-
let def_map = self.crate_root(db).def_map(db);
475+
let def_map = self.crate_root().def_map(db);
483476
def_map[Self::ROOT].scope.get(name)
484477
}
485478
None => self[Self::ROOT].scope.get(name),
486479
};
487480
let from_extern_prelude = || {
488-
self.resolve_name_in_extern_prelude(db, name)
481+
if self.block.is_some() {
482+
// Don't resolve extern prelude in block `DefMap`s.
483+
return PerNs::none();
484+
}
485+
self.data
486+
.extern_prelude
487+
.get(name)
488+
.copied()
489489
.map_or(PerNs::none(), |it| PerNs::types(it.into(), Visibility::Public))
490490
};
491491

0 commit comments

Comments
 (0)