9379: internal: remove one more accidentally quadratic code-path r=matklad a=matklad

bors r+
🤖

Co-authored-by: Aleksey Kladov <aleksey.kladov@gmail.com>
This commit is contained in:
bors[bot] 2021-06-22 18:26:30 +00:00 committed by GitHub
commit 9b29573a4b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 26 deletions

View File

@ -303,26 +303,6 @@ impl ModuleDef {
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> {
match self {
ModuleDef::Adt(it) => Some(it.name(db)),
@ -893,6 +873,16 @@ impl Adt {
}
}
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)]
pub enum VariantDef {
Struct(Struct),

View File

@ -43,13 +43,29 @@ impl Definition {
pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> {
match self {
Definition::Macro(_) => None,
Definition::Field(sf) => Some(sf.visibility(db)),
Definition::ModuleDef(def) => def.definition_visibility(db),
Definition::SelfType(_) => None,
Definition::Local(_) => None,
Definition::GenericParam(_) => None,
Definition::Label(_) => None,
Definition::ModuleDef(def) => match def {
ModuleDef::Module(it) => {
// FIXME: should work like other cases here.
let parent = it.parent(db)?;
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,
}
}