Skip to content

Commit 7988c80

Browse files
bors[bot]matklad
andauthored
Merge #9583
9583: internal: get rid of a call to slow O(N) visibility_of function r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents c8d19fe + 6f26970 commit 7988c80

File tree

4 files changed

+29
-13
lines changed

4 files changed

+29
-13
lines changed

crates/hir/src/lib.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -430,8 +430,16 @@ impl Module {
430430
.collect()
431431
}
432432

433+
pub fn visibility(self, db: &dyn HirDatabase) -> Visibility {
434+
let def_map = self.id.def_map(db.upcast());
435+
let module_data = &def_map[self.id.local_id];
436+
module_data.visibility
437+
}
438+
433439
pub fn visibility_of(self, db: &dyn HirDatabase, def: &ModuleDef) -> Option<Visibility> {
434-
self.id.def_map(db.upcast())[self.id.local_id].scope.visibility_of((*def).into())
440+
let def_map = self.id.def_map(db.upcast());
441+
let module_data = &def_map[self.id.local_id];
442+
module_data.scope.visibility_of((*def).into())
435443
}
436444

437445
pub fn diagnostics(self, db: &dyn HirDatabase, acc: &mut Vec<AnyDiagnostic>) {

crates/hir_def/src/nameres.rs

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ use crate::{
7272
nameres::{diagnostics::DefDiagnostic, path_resolution::ResolveMode},
7373
path::ModPath,
7474
per_ns::PerNs,
75+
visibility::Visibility,
7576
AstId, BlockId, BlockLoc, LocalModuleId, ModuleDefId, ModuleId,
7677
};
7778

@@ -192,12 +193,14 @@ impl ModuleOrigin {
192193

193194
#[derive(Debug, PartialEq, Eq)]
194195
pub struct ModuleData {
196+
/// Where does this module come from?
197+
pub origin: ModuleOrigin,
198+
/// Declared visibility of this module.
199+
pub visibility: Visibility,
200+
195201
pub parent: Option<LocalModuleId>,
196202
pub children: FxHashMap<Name, LocalModuleId>,
197203
pub scope: ItemScope,
198-
199-
/// Where does this module come from?
200-
pub origin: ModuleOrigin,
201204
}
202205

203206
impl DefMap {
@@ -243,7 +246,15 @@ impl DefMap {
243246

244247
fn empty(krate: CrateId, edition: Edition, root_module_origin: ModuleOrigin) -> DefMap {
245248
let mut modules: Arena<ModuleData> = Arena::default();
246-
let root = modules.alloc(ModuleData::new(root_module_origin));
249+
250+
let local_id = LocalModuleId::from_raw(la_arena::RawIdx::from(0));
251+
// NB: we use `None` as block here, which would be wrong for implicit
252+
// modules declared by blocks with items. At the moment, we don't use
253+
// this visibility for anything outside IDE, so that's probably OK.
254+
let visibility = Visibility::Module(ModuleId { krate, local_id, block: None });
255+
let root = modules.alloc(ModuleData::new(root_module_origin, visibility));
256+
assert_eq!(local_id, root);
257+
247258
DefMap {
248259
_c: Count::new(),
249260
block: None,
@@ -448,12 +459,13 @@ impl DefMap {
448459
}
449460

450461
impl ModuleData {
451-
pub(crate) fn new(origin: ModuleOrigin) -> Self {
462+
pub(crate) fn new(origin: ModuleOrigin, visibility: Visibility) -> Self {
452463
ModuleData {
464+
origin,
465+
visibility,
453466
parent: None,
454467
children: FxHashMap::default(),
455468
scope: ItemScope::default(),
456-
origin,
457469
}
458470
}
459471

crates/hir_def/src/nameres/collector.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1629,7 +1629,7 @@ impl ModCollector<'_, '_> {
16291629
ModuleOrigin::File { declaration, definition, is_mod_rs }
16301630
}
16311631
};
1632-
let res = modules.alloc(ModuleData::new(origin));
1632+
let res = modules.alloc(ModuleData::new(origin, vis));
16331633
modules[res].parent = Some(self.module_id);
16341634
for (name, mac) in modules[self.module_id].scope.collect_legacy_macros() {
16351635
modules[res].scope.define_legacy_macro(name, mac)

crates/ide_db/src/defs.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,7 @@ impl Definition {
4545
match self {
4646
Definition::Field(sf) => Some(sf.visibility(db)),
4747
Definition::ModuleDef(def) => match def {
48-
ModuleDef::Module(it) => {
49-
// FIXME: should work like other cases here.
50-
let parent = it.parent(db)?;
51-
parent.visibility_of(db, def)
52-
}
48+
ModuleDef::Module(it) => Some(it.visibility(db)),
5349
ModuleDef::Function(it) => Some(it.visibility(db)),
5450
ModuleDef::Adt(it) => Some(it.visibility(db)),
5551
ModuleDef::Const(it) => Some(it.visibility(db)),

0 commit comments

Comments
 (0)