Skip to content

Commit 8e0630e

Browse files
committed
internal: remove one usage of a slow method
1 parent 5fee2be commit 8e0630e

File tree

3 files changed

+20
-4
lines changed

3 files changed

+20
-4
lines changed

crates/hir/src/lib.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ impl Module {
436436
module_data.visibility
437437
}
438438

439+
/// XXX: this O(N) rather O(1) method, avoid using it if you can.
439440
pub fn visibility_of(self, db: &dyn HirDatabase, def: &ModuleDef) -> Option<Visibility> {
440441
let def_map = self.id.def_map(db.upcast());
441442
let module_data = &def_map[self.id.local_id];
@@ -841,6 +842,13 @@ impl Variant {
841842
}
842843
}
843844

845+
/// Variants inherit visibility from the parent enum.
846+
impl HasVisibility for Variant {
847+
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
848+
self.parent_enum(db).visibility(db)
849+
}
850+
}
851+
844852
/// A Data Type
845853
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
846854
pub enum Adt {

crates/ide_assists/src/handlers/fix_visibility.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,17 @@ fn add_vis_to_referenced_module_def(acc: &mut Assists, ctx: &AssistContext) -> O
4646
let current_module = ctx.sema.scope(path.syntax()).module()?;
4747
let target_module = def.module(ctx.db())?;
4848

49-
let vis = target_module.visibility_of(ctx.db(), &def)?;
49+
let vis = match def {
50+
hir::ModuleDef::Module(it) => it.visibility(ctx.db()),
51+
hir::ModuleDef::Function(it) => it.visibility(ctx.db()),
52+
hir::ModuleDef::Adt(it) => it.visibility(ctx.db()),
53+
hir::ModuleDef::Variant(it) => it.visibility(ctx.db()),
54+
hir::ModuleDef::Const(it) => it.visibility(ctx.db()),
55+
hir::ModuleDef::Static(it) => it.visibility(ctx.db()),
56+
hir::ModuleDef::Trait(it) => it.visibility(ctx.db()),
57+
hir::ModuleDef::TypeAlias(it) => it.visibility(ctx.db()),
58+
hir::ModuleDef::BuiltinType(_) => return None,
59+
};
5060
if vis.is_visible_from(ctx.db(), current_module.into()) {
5161
return None;
5262
};

crates/ide_db/src/defs.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,7 @@ impl Definition {
5252
ModuleDef::Static(it) => Some(it.visibility(db)),
5353
ModuleDef::Trait(it) => Some(it.visibility(db)),
5454
ModuleDef::TypeAlias(it) => Some(it.visibility(db)),
55-
// NB: Variants don't have their own visibility, and just inherit
56-
// one from the parent. Not sure if that's the right thing to do.
57-
ModuleDef::Variant(it) => Some(it.parent_enum(db).visibility(db)),
55+
ModuleDef::Variant(it) => Some(it.visibility(db)),
5856
ModuleDef::BuiltinType(_) => None,
5957
},
6058
Definition::Macro(_)

0 commit comments

Comments
 (0)