mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-28 04:44:57 +00:00
implement inherited_visibility in collector
This commit is contained in:
parent
3f60e71a12
commit
ded412d56b
6 changed files with 153 additions and 85 deletions
|
@ -15,8 +15,8 @@ use crate::{
|
|||
type_ref::{TraitRef, TypeBound, TypeRef},
|
||||
visibility::RawVisibility,
|
||||
AssocItemId, AstIdWithPath, ConstId, ConstLoc, FunctionId, FunctionLoc, HasModule, ImplId,
|
||||
Intern, ItemContainerId, Lookup, Macro2Id, MacroRulesId, ModuleId, ProcMacroId, StaticId,
|
||||
TraitId, TypeAliasId, TypeAliasLoc,
|
||||
InheritedVisibilityLoc, Intern, ItemContainerId, Lookup, Macro2Id, MacroRulesId, ModuleId,
|
||||
ProcMacroId, StaticId, TraitId, TypeAliasId, TypeAliasLoc,
|
||||
};
|
||||
|
||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||
|
@ -41,6 +41,12 @@ impl FunctionData {
|
|||
let item_tree = loc.id.item_tree(db);
|
||||
let func = &item_tree[loc.id.value];
|
||||
|
||||
let visibility = if let Some(inherited_vis) = loc.inherited_visibility {
|
||||
inherited_vis.tree_id.item_tree(db)[inherited_vis.raw_visibility_id].clone()
|
||||
} else {
|
||||
item_tree[func.visibility].clone()
|
||||
};
|
||||
|
||||
let enabled_params = func
|
||||
.params
|
||||
.clone()
|
||||
|
@ -93,7 +99,7 @@ impl FunctionData {
|
|||
ret_type: func.ret_type.clone(),
|
||||
async_ret_type: func.async_ret_type.clone(),
|
||||
attrs: item_tree.attrs(db, krate, ModItem::from(loc.id.value).into()),
|
||||
visibility: item_tree[func.visibility].clone(),
|
||||
visibility,
|
||||
abi: func.abi.clone(),
|
||||
legacy_const_generics_indices,
|
||||
flags,
|
||||
|
@ -171,11 +177,16 @@ impl TypeAliasData {
|
|||
let loc = typ.lookup(db);
|
||||
let item_tree = loc.id.item_tree(db);
|
||||
let typ = &item_tree[loc.id.value];
|
||||
let visibility = if let Some(inherited_vis) = loc.inherited_visibility {
|
||||
inherited_vis.tree_id.item_tree(db)[inherited_vis.raw_visibility_id].clone()
|
||||
} else {
|
||||
item_tree[typ.visibility].clone()
|
||||
};
|
||||
|
||||
Arc::new(TypeAliasData {
|
||||
name: typ.name.clone(),
|
||||
type_ref: typ.type_ref.clone(),
|
||||
visibility: item_tree[typ.visibility].clone(),
|
||||
visibility,
|
||||
is_extern: matches!(loc.container, ItemContainerId::ExternBlockId(_)),
|
||||
bounds: typ.bounds.to_vec(),
|
||||
})
|
||||
|
@ -221,6 +232,7 @@ impl TraitData {
|
|||
module_id,
|
||||
tr_loc.id.file_id(),
|
||||
ItemContainerId::TraitId(tr),
|
||||
Some(InheritedVisibilityLoc::new(tr_def.visibility, tr_loc.id.tree_id())),
|
||||
);
|
||||
collector.collect(tr_loc.id.tree_id(), &tr_def.items);
|
||||
|
||||
|
@ -288,6 +300,7 @@ impl ImplData {
|
|||
module_id,
|
||||
impl_loc.id.file_id(),
|
||||
ItemContainerId::ImplId(id),
|
||||
None,
|
||||
);
|
||||
collector.collect(impl_loc.id.tree_id(), &impl_def.items);
|
||||
|
||||
|
@ -385,11 +398,16 @@ impl ConstData {
|
|||
let loc = konst.lookup(db);
|
||||
let item_tree = loc.id.item_tree(db);
|
||||
let konst = &item_tree[loc.id.value];
|
||||
let visibility = if let Some(inherited_vis) = loc.inherited_visibility {
|
||||
inherited_vis.tree_id.item_tree(db)[inherited_vis.raw_visibility_id].clone()
|
||||
} else {
|
||||
item_tree[konst.visibility].clone()
|
||||
};
|
||||
|
||||
Arc::new(ConstData {
|
||||
name: konst.name.clone(),
|
||||
type_ref: konst.type_ref.clone(),
|
||||
visibility: item_tree[konst.visibility].clone(),
|
||||
visibility,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -428,6 +446,8 @@ struct AssocItemCollector<'a> {
|
|||
|
||||
items: Vec<(Name, AssocItemId)>,
|
||||
attr_calls: Vec<(AstId<ast::Item>, MacroCallId)>,
|
||||
|
||||
inherited_visibility: Option<InheritedVisibilityLoc>,
|
||||
}
|
||||
|
||||
impl<'a> AssocItemCollector<'a> {
|
||||
|
@ -436,6 +456,7 @@ impl<'a> AssocItemCollector<'a> {
|
|||
module_id: ModuleId,
|
||||
file_id: HirFileId,
|
||||
container: ItemContainerId,
|
||||
inherited_visibility: Option<InheritedVisibilityLoc>,
|
||||
) -> Self {
|
||||
Self {
|
||||
db,
|
||||
|
@ -446,6 +467,8 @@ impl<'a> AssocItemCollector<'a> {
|
|||
|
||||
items: Vec::new(),
|
||||
attr_calls: Vec::new(),
|
||||
|
||||
inherited_visibility,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -488,9 +511,12 @@ impl<'a> AssocItemCollector<'a> {
|
|||
match item {
|
||||
AssocItem::Function(id) => {
|
||||
let item = &item_tree[id];
|
||||
let def =
|
||||
FunctionLoc { container: self.container, id: ItemTreeId::new(tree_id, id) }
|
||||
.intern(self.db);
|
||||
let def = FunctionLoc {
|
||||
container: self.container,
|
||||
id: ItemTreeId::new(tree_id, id),
|
||||
inherited_visibility: self.inherited_visibility,
|
||||
}
|
||||
.intern(self.db);
|
||||
self.items.push((item.name.clone(), def.into()));
|
||||
}
|
||||
AssocItem::Const(id) => {
|
||||
|
@ -499,9 +525,12 @@ impl<'a> AssocItemCollector<'a> {
|
|||
Some(name) => name,
|
||||
None => continue,
|
||||
};
|
||||
let def =
|
||||
ConstLoc { container: self.container, id: ItemTreeId::new(tree_id, id) }
|
||||
.intern(self.db);
|
||||
let def = ConstLoc {
|
||||
container: self.container,
|
||||
id: ItemTreeId::new(tree_id, id),
|
||||
inherited_visibility: self.inherited_visibility,
|
||||
}
|
||||
.intern(self.db);
|
||||
self.items.push((name, def.into()));
|
||||
}
|
||||
AssocItem::TypeAlias(id) => {
|
||||
|
@ -509,6 +538,7 @@ impl<'a> AssocItemCollector<'a> {
|
|||
let def = TypeAliasLoc {
|
||||
container: self.container,
|
||||
id: ItemTreeId::new(tree_id, id),
|
||||
inherited_visibility: self.inherited_visibility,
|
||||
}
|
||||
.intern(self.db);
|
||||
self.items.push((item.name.clone(), def.into()));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue