internal: remove one more accidentally quadratic code-path
Definition::visibility was implemented in a rather roundabout way -- by asking the parent module about the effective visibility. This is problematic for a couple of reasons: * first, it doesn't work for local items * second, asking module about visibility of a child is a linear operation (that's a problem in itself, tracked in #9378) Instead, lets ask the declared visibility directly, we have all the code for it, and need only to actually us it.
This commit is contained in:
parent
9239943b84
commit
7be2d2f008
@ -303,26 +303,6 @@ pub fn canonical_path(&self, db: &dyn HirDatabase) -> Option<String> {
|
|||||||
Some(segments.join("::"))
|
Some(segments.join("::"))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn definition_visibility(&self, db: &dyn HirDatabase) -> Option<Visibility> {
|
|
||||||
let module = match self {
|
|
||||||
ModuleDef::Module(it) => it.parent(db)?,
|
|
||||||
ModuleDef::Function(it) => return Some(it.visibility(db)),
|
|
||||||
ModuleDef::Adt(it) => it.module(db),
|
|
||||||
ModuleDef::Variant(it) => {
|
|
||||||
let parent = it.parent_enum(db);
|
|
||||||
let module = it.module(db);
|
|
||||||
return module.visibility_of(db, &ModuleDef::Adt(Adt::Enum(parent)));
|
|
||||||
}
|
|
||||||
ModuleDef::Const(it) => return Some(it.visibility(db)),
|
|
||||||
ModuleDef::Static(it) => it.module(db),
|
|
||||||
ModuleDef::Trait(it) => it.module(db),
|
|
||||||
ModuleDef::TypeAlias(it) => return Some(it.visibility(db)),
|
|
||||||
ModuleDef::BuiltinType(_) => return None,
|
|
||||||
};
|
|
||||||
|
|
||||||
module.visibility_of(db, self)
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn name(self, db: &dyn HirDatabase) -> Option<Name> {
|
pub fn name(self, db: &dyn HirDatabase) -> Option<Name> {
|
||||||
match self {
|
match self {
|
||||||
ModuleDef::Adt(it) => Some(it.name(db)),
|
ModuleDef::Adt(it) => Some(it.name(db)),
|
||||||
@ -893,6 +873,16 @@ pub fn name(self, db: &dyn HirDatabase) -> Name {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl HasVisibility for Adt {
|
||||||
|
fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
|
||||||
|
match self {
|
||||||
|
Adt::Struct(it) => it.visibility(db),
|
||||||
|
Adt::Union(it) => it.visibility(db),
|
||||||
|
Adt::Enum(it) => it.visibility(db),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
||||||
pub enum VariantDef {
|
pub enum VariantDef {
|
||||||
Struct(Struct),
|
Struct(Struct),
|
||||||
|
@ -43,13 +43,29 @@ pub fn module(&self, db: &RootDatabase) -> Option<Module> {
|
|||||||
|
|
||||||
pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> {
|
pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> {
|
||||||
match self {
|
match self {
|
||||||
Definition::Macro(_) => None,
|
|
||||||
Definition::Field(sf) => Some(sf.visibility(db)),
|
Definition::Field(sf) => Some(sf.visibility(db)),
|
||||||
Definition::ModuleDef(def) => def.definition_visibility(db),
|
Definition::ModuleDef(def) => match def {
|
||||||
Definition::SelfType(_) => None,
|
ModuleDef::Module(it) => {
|
||||||
Definition::Local(_) => None,
|
// FIXME: should work like other cases here.
|
||||||
Definition::GenericParam(_) => None,
|
let parent = it.parent(db)?;
|
||||||
Definition::Label(_) => None,
|
parent.visibility_of(db, def)
|
||||||
|
}
|
||||||
|
ModuleDef::Function(it) => Some(it.visibility(db)),
|
||||||
|
ModuleDef::Adt(it) => Some(it.visibility(db)),
|
||||||
|
ModuleDef::Const(it) => Some(it.visibility(db)),
|
||||||
|
ModuleDef::Static(it) => Some(it.visibility(db)),
|
||||||
|
ModuleDef::Trait(it) => Some(it.visibility(db)),
|
||||||
|
ModuleDef::TypeAlias(it) => Some(it.visibility(db)),
|
||||||
|
// NB: Variants don't have their own visibility, and just inherit
|
||||||
|
// one from the parent. Not sure if that's the right thing to do.
|
||||||
|
ModuleDef::Variant(it) => Some(it.parent_enum(db).visibility(db)),
|
||||||
|
ModuleDef::BuiltinType(_) => None,
|
||||||
|
},
|
||||||
|
Definition::Macro(_)
|
||||||
|
| Definition::SelfType(_)
|
||||||
|
| Definition::Local(_)
|
||||||
|
| Definition::GenericParam(_)
|
||||||
|
| Definition::Label(_) => None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user