New definition_visibility method

This commit is contained in:
Fedor Sakharov 2020-05-11 14:28:14 +03:00
parent 753e1e679c
commit 3d66aa0542
No known key found for this signature in database
GPG key ID: 93D436E666BF0FEE
2 changed files with 22 additions and 13 deletions

View file

@ -148,6 +148,26 @@ impl ModuleDef {
ModuleDef::BuiltinType(_) => None,
}
}
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::EnumVariant(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 use hir_def::{

View file

@ -6,7 +6,7 @@
// FIXME: this badly needs rename/rewrite (matklad, 2020-02-06).
use hir::{
Adt, Field, HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution,
Field, HasVisibility, ImplDef, Local, MacroDef, Module, ModuleDef, Name, PathResolution,
Semantics, TypeParam, Visibility,
};
use ra_prof::profile;
@ -42,21 +42,10 @@ impl Definition {
}
pub fn visibility(&self, db: &RootDatabase) -> Option<Visibility> {
let module = self.module(db);
match self {
Definition::Macro(_) => None,
Definition::Field(sf) => Some(sf.visibility(db)),
Definition::ModuleDef(def) => match def {
ModuleDef::EnumVariant(id) => {
let parent = id.parent_enum(db);
module?.visibility_of(db, &ModuleDef::Adt(Adt::Enum(parent)))
}
ModuleDef::Function(f) => Some(f.visibility(db)),
ModuleDef::Const(c) => Some(c.visibility(db)),
ModuleDef::TypeAlias(t) => Some(t.visibility(db)),
_ => module?.visibility_of(db, def),
},
Definition::ModuleDef(def) => def.definition_visibility(db),
Definition::SelfType(_) => None,
Definition::Local(_) => None,
Definition::TypeParam(_) => None,