Skip to content

Commit 3561433

Browse files
committed
Auto merge of #13026 - Veykril:nameres, r=Veykril
internal: Make `resolve_name_in_module` a bit more lazy
2 parents 6d62012 + 88b19cc commit 3561433

File tree

2 files changed

+28
-16
lines changed

2 files changed

+28
-16
lines changed

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

+16-16
Original file line numberDiff line numberDiff line change
@@ -399,35 +399,35 @@ impl DefMap {
399399
Some(_) | None => from_scope.or(from_builtin),
400400
},
401401
};
402-
let from_extern_prelude = self
403-
.extern_prelude
404-
.get(name)
405-
.map_or(PerNs::none(), |&it| PerNs::types(it.into(), Visibility::Public));
406402

407-
let from_prelude = self.resolve_in_prelude(db, name);
403+
let extern_prelude = || {
404+
self.extern_prelude
405+
.get(name)
406+
.map_or(PerNs::none(), |&it| PerNs::types(it.into(), Visibility::Public))
407+
};
408+
let prelude = || self.resolve_in_prelude(db, name);
408409

409-
from_legacy_macro.or(from_scope_or_builtin).or(from_extern_prelude).or(from_prelude)
410+
from_legacy_macro.or(from_scope_or_builtin).or_else(extern_prelude).or_else(prelude)
410411
}
411412

412413
fn resolve_name_in_crate_root_or_extern_prelude(
413414
&self,
414415
db: &dyn DefDatabase,
415416
name: &Name,
416417
) -> PerNs {
417-
let arc;
418-
let crate_def_map = match self.block {
418+
let from_crate_root = match self.block {
419419
Some(_) => {
420-
arc = self.crate_root(db).def_map(db);
421-
&arc
420+
let def_map = self.crate_root(db).def_map(db);
421+
def_map[def_map.root].scope.get(name)
422422
}
423-
None => self,
423+
None => self[self.root].scope.get(name),
424+
};
425+
let from_extern_prelude = || {
426+
self.resolve_name_in_extern_prelude(db, name)
427+
.map_or(PerNs::none(), |it| PerNs::types(it.into(), Visibility::Public))
424428
};
425-
let from_crate_root = crate_def_map[crate_def_map.root].scope.get(name);
426-
let from_extern_prelude = self
427-
.resolve_name_in_extern_prelude(db, name)
428-
.map_or(PerNs::none(), |it| PerNs::types(it.into(), Visibility::Public));
429429

430-
from_crate_root.or(from_extern_prelude)
430+
from_crate_root.or_else(from_extern_prelude)
431431
}
432432

433433
fn resolve_in_prelude(&self, db: &dyn DefDatabase, name: &Name) -> PerNs {

crates/hir-def/src/per_ns.rs

+12
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ impl PerNs {
4343
self.types.is_none() && self.values.is_none() && self.macros.is_none()
4444
}
4545

46+
pub fn is_full(&self) -> bool {
47+
self.types.is_some() && self.values.is_some() && self.macros.is_some()
48+
}
49+
4650
pub fn take_types(self) -> Option<ModuleDefId> {
4751
self.types.map(|it| it.0)
4852
}
@@ -84,6 +88,14 @@ impl PerNs {
8488
}
8589
}
8690

91+
pub fn or_else(self, f: impl FnOnce() -> PerNs) -> PerNs {
92+
if self.is_full() {
93+
self
94+
} else {
95+
self.or(f())
96+
}
97+
}
98+
8799
pub fn iter_items(self) -> impl Iterator<Item = ItemInNs> {
88100
let _p = profile::span("PerNs::iter_items");
89101
self.types

0 commit comments

Comments
 (0)