mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-30 13:51:31 +00:00
Handle visibility for assoc item path completion as well
This commit is contained in:
parent
d9c77c5453
commit
05e1c7b197
3 changed files with 124 additions and 22 deletions
|
@ -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),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue