From ec448ca4b33202e384eb034b4e15ed751355488c Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sat, 2 Jan 2021 00:42:07 +0100 Subject: Impl HasAttrs for GenericParam --- crates/hir_def/src/attr.rs | 21 ++++++++++++++++++++- crates/hir_def/src/lib.rs | 22 +++++++++++++++++++++- 2 files changed, 41 insertions(+), 2 deletions(-) (limited to 'crates/hir_def') diff --git a/crates/hir_def/src/attr.rs b/crates/hir_def/src/attr.rs index 042e119b1..86ae2f0fa 100644 --- a/crates/hir_def/src/attr.rs +++ b/crates/hir_def/src/attr.rs @@ -21,7 +21,7 @@ use crate::{ nameres::ModuleSource, path::{ModPath, PathKind}, src::HasChildSource, - AdtId, AttrDefId, Lookup, + AdtId, AttrDefId, GenericParamId, Lookup, }; /// Holds documentation @@ -235,6 +235,25 @@ impl Attrs { AttrDefId::StaticId(it) => attrs_from_item_tree(it.lookup(db).id, db), AttrDefId::FunctionId(it) => attrs_from_item_tree(it.lookup(db).id, db), AttrDefId::TypeAliasId(it) => attrs_from_item_tree(it.lookup(db).id, db), + AttrDefId::GenericParamId(it) => match it { + GenericParamId::TypeParamId(it) => { + let src = it.parent.child_source(db); + RawAttrs::from_attrs_owner( + db, + src.with_value( + src.value[it.local_id].as_ref().either(|it| it as _, |it| it as _), + ), + ) + } + GenericParamId::LifetimeParamId(it) => { + let src = it.parent.child_source(db); + RawAttrs::from_attrs_owner(db, src.with_value(&src.value[it.local_id])) + } + GenericParamId::ConstParamId(it) => { + let src = it.parent.child_source(db); + RawAttrs::from_attrs_owner(db, src.with_value(&src.value[it.local_id])) + } + }, }; raw_attrs.filter(db, def.krate(db)) diff --git a/crates/hir_def/src/lib.rs b/crates/hir_def/src/lib.rs index 25f460504..211cb2faf 100644 --- a/crates/hir_def/src/lib.rs +++ b/crates/hir_def/src/lib.rs @@ -261,6 +261,15 @@ pub enum AdtId { } impl_from!(StructId, UnionId, EnumId for AdtId); +/// A generic param +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum GenericParamId { + TypeParamId(TypeParamId), + LifetimeParamId(LifetimeParamId), + ConstParamId(ConstParamId), +} +impl_from!(TypeParamId, LifetimeParamId, ConstParamId for GenericParamId); + /// The defs which can be visible in the module. #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum ModuleDefId { @@ -357,6 +366,7 @@ pub enum AttrDefId { TypeAliasId(TypeAliasId), MacroDefId(MacroDefId), ImplId(ImplId), + GenericParamId(GenericParamId), } impl_from!( @@ -370,7 +380,8 @@ impl_from!( TraitId, TypeAliasId, MacroDefId, - ImplId + ImplId, + GenericParamId for AttrDefId ); @@ -495,6 +506,15 @@ impl AttrDefId { AttrDefId::TraitId(it) => it.lookup(db).container.module(db).krate, AttrDefId::TypeAliasId(it) => it.lookup(db).module(db).krate, AttrDefId::ImplId(it) => it.lookup(db).container.module(db).krate, + AttrDefId::GenericParamId(it) => { + match it { + GenericParamId::TypeParamId(it) => it.parent, + GenericParamId::LifetimeParamId(it) => it.parent, + GenericParamId::ConstParamId(it) => it.parent, + } + .module(db) + .krate + } // FIXME: `MacroDefId` should store the defining module, then this can implement // `HasModule` AttrDefId::MacroDefId(it) => it.krate, -- cgit v1.2.3