Handle visibility for assoc item path completion as well

This commit is contained in:
Florian Diebold 2020-03-08 15:11:57 +01:00
parent d9c77c5453
commit 05e1c7b197
3 changed files with 124 additions and 22 deletions

View file

@ -204,19 +204,25 @@ impl Module {
}
/// Returns a `ModuleScope`: a set of items, visible in this module.
pub fn scope(self, db: &impl HirDatabase, visible_from: Option<Module>) -> Vec<(Name, ScopeDef)> {
pub fn scope(
self,
db: &impl HirDatabase,
visible_from: Option<Module>,
) -> Vec<(Name, ScopeDef)> {
db.crate_def_map(self.id.krate)[self.id.local_id]
.scope
.entries()
.filter_map(|(name, def)| if let Some(m) = visible_from {
let filtered = def.filter_visibility(|vis| vis.is_visible_from(db, m.id));
if filtered.is_none() && !def.is_none() {
None
.filter_map(|(name, def)| {
if let Some(m) = visible_from {
let filtered = def.filter_visibility(|vis| vis.is_visible_from(db, m.id));
if filtered.is_none() && !def.is_none() {
None
} else {
Some((name, filtered))
}
} else {
Some((name, filtered))
Some((name, def))
}
} else {
Some((name, def))
})
.map(|(name, def)| (name.clone(), def.into()))
.collect()
@ -608,6 +614,14 @@ impl Const {
}
}
impl HasVisibility for Const {
fn visibility(&self, db: &impl HirDatabase) -> Visibility {
let function_data = db.const_data(self.id);
let visibility = &function_data.visibility;
visibility.resolve(db, &self.id.resolver(db))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Static {
pub(crate) id: StaticId,
@ -682,6 +696,14 @@ impl TypeAlias {
}
}
impl HasVisibility for TypeAlias {
fn visibility(&self, db: &impl HirDatabase) -> Visibility {
let function_data = db.type_alias_data(self.id);
let visibility = &function_data.visibility;
visibility.resolve(db, &self.id.resolver(db))
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct MacroDef {
pub(crate) id: MacroDefId,
@ -769,6 +791,16 @@ impl AssocItem {
}
}
impl HasVisibility for AssocItem {
fn visibility(&self, db: &impl HirDatabase) -> Visibility {
match self {
AssocItem::Function(f) => f.visibility(db),
AssocItem::Const(c) => c.visibility(db),
AssocItem::TypeAlias(t) => t.visibility(db),
}
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
pub enum GenericDef {
Function(Function),