Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/attr.rs')
-rw-r--r--crates/hir-def/src/attr.rs54
1 files changed, 17 insertions, 37 deletions
diff --git a/crates/hir-def/src/attr.rs b/crates/hir-def/src/attr.rs
index bee6f0083b..c91a549726 100644
--- a/crates/hir-def/src/attr.rs
+++ b/crates/hir-def/src/attr.rs
@@ -24,11 +24,11 @@ use triomphe::Arc;
use crate::{
db::DefDatabase,
- item_tree::{AttrOwner, Fields, ItemTreeId, ItemTreeModItemNode},
+ item_tree::{AttrOwner, Fields, ItemTreeNode},
lang_item::LangItem,
nameres::{ModuleOrigin, ModuleSource},
src::{HasChildSource, HasSource},
- AdtId, AssocItemLoc, AttrDefId, GenericParamId, ItemLoc, LocalFieldId, Lookup, MacroId,
+ AdtId, AttrDefId, GenericParamId, HasModule, ItemTreeLoc, LocalFieldId, Lookup, MacroId,
VariantId,
};
@@ -317,7 +317,7 @@ fn parse_comma_sep<S>(subtree: &tt::Subtree<S>) -> Vec<SmolStr> {
}
impl AttrsWithOwner {
- pub fn attrs_with_owner(db: &dyn DefDatabase, owner: AttrDefId) -> Self {
+ pub fn new(db: &dyn DefDatabase, owner: AttrDefId) -> Self {
Self { attrs: db.attrs(owner), owner }
}
@@ -356,12 +356,7 @@ impl AttrsWithOwner {
AttrDefId::FieldId(it) => {
return db.fields_attrs(it.parent)[it.local_id].clone();
}
- // FIXME: DRY this up
- AttrDefId::EnumVariantId(it) => {
- let id = it.lookup(db).id;
- let tree = id.item_tree(db);
- tree.raw_attrs(id.value.into()).clone()
- }
+ AttrDefId::EnumVariantId(it) => attrs_from_item_tree_loc(db, it),
AttrDefId::AdtId(it) => match it {
AdtId::StructId(it) => attrs_from_item_tree_loc(db, it),
AdtId::EnumId(it) => attrs_from_item_tree_loc(db, it),
@@ -370,15 +365,15 @@ impl AttrsWithOwner {
AttrDefId::TraitId(it) => attrs_from_item_tree_loc(db, it),
AttrDefId::TraitAliasId(it) => attrs_from_item_tree_loc(db, it),
AttrDefId::MacroId(it) => match it {
- MacroId::Macro2Id(it) => attrs_from_item_tree(db, it.lookup(db).id),
- MacroId::MacroRulesId(it) => attrs_from_item_tree(db, it.lookup(db).id),
- MacroId::ProcMacroId(it) => attrs_from_item_tree(db, it.lookup(db).id),
+ MacroId::Macro2Id(it) => attrs_from_item_tree_loc(db, it),
+ MacroId::MacroRulesId(it) => attrs_from_item_tree_loc(db, it),
+ MacroId::ProcMacroId(it) => attrs_from_item_tree_loc(db, it),
},
AttrDefId::ImplId(it) => attrs_from_item_tree_loc(db, it),
- AttrDefId::ConstId(it) => attrs_from_item_tree_assoc(db, it),
- AttrDefId::StaticId(it) => attrs_from_item_tree_assoc(db, it),
- AttrDefId::FunctionId(it) => attrs_from_item_tree_assoc(db, it),
- AttrDefId::TypeAliasId(it) => attrs_from_item_tree_assoc(db, it),
+ AttrDefId::ConstId(it) => attrs_from_item_tree_loc(db, it),
+ AttrDefId::StaticId(it) => attrs_from_item_tree_loc(db, it),
+ AttrDefId::FunctionId(it) => attrs_from_item_tree_loc(db, it),
+ AttrDefId::TypeAliasId(it) => attrs_from_item_tree_loc(db, it),
AttrDefId::GenericParamId(it) => match it {
GenericParamId::ConstParamId(it) => {
let src = it.parent().child_source(db);
@@ -603,29 +598,14 @@ fn any_has_attrs<'db>(
id.lookup(db).source(db).map(ast::AnyHasAttrs::new)
}
-fn attrs_from_item_tree<N: ItemTreeModItemNode>(
- db: &dyn DefDatabase,
- id: ItemTreeId<N>,
-) -> RawAttrs {
- let tree = id.item_tree(db);
- let mod_item = N::id_to_mod_item(id.value);
- tree.raw_attrs(mod_item.into()).clone()
-}
-
-fn attrs_from_item_tree_loc<'db, N: ItemTreeModItemNode>(
+fn attrs_from_item_tree_loc<'db, N: ItemTreeNode>(
db: &(dyn DefDatabase + 'db),
- lookup: impl Lookup<Database<'db> = dyn DefDatabase + 'db, Data = ItemLoc<N>>,
+ lookup: impl Lookup<Database<'db> = dyn DefDatabase + 'db, Data = impl ItemTreeLoc<Id = N>>,
) -> RawAttrs {
- let id = lookup.lookup(db).id;
- attrs_from_item_tree(db, id)
-}
-
-fn attrs_from_item_tree_assoc<'db, N: ItemTreeModItemNode>(
- db: &(dyn DefDatabase + 'db),
- lookup: impl Lookup<Database<'db> = dyn DefDatabase + 'db, Data = AssocItemLoc<N>>,
-) -> RawAttrs {
- let id = lookup.lookup(db).id;
- attrs_from_item_tree(db, id)
+ let id = lookup.lookup(db).item_tree_id();
+ let tree = id.item_tree(db);
+ let attr_owner = N::attr_owner(id.value);
+ tree.raw_attrs(attr_owner).clone()
}
pub(crate) fn fields_attrs_source_map(