aboutsummaryrefslogtreecommitdiff
path: root/crates/hir/src/attrs.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir/src/attrs.rs')
-rw-r--r--crates/hir/src/attrs.rs81
1 files changed, 42 insertions, 39 deletions
diff --git a/crates/hir/src/attrs.rs b/crates/hir/src/attrs.rs
index 953960e14..36027d183 100644
--- a/crates/hir/src/attrs.rs
+++ b/crates/hir/src/attrs.rs
@@ -4,60 +4,63 @@ use hir_def::{
4 db::DefDatabase, 4 db::DefDatabase,
5 docs::Documentation, 5 docs::Documentation,
6 resolver::{HasResolver, Resolver}, 6 resolver::{HasResolver, Resolver},
7 AdtId, FunctionId, GenericDefId, ModuleId, StaticId, TraitId, VariantId, 7 AdtId, AttrDefId, FunctionId, GenericDefId, ModuleId, StaticId, TraitId, VariantId,
8}; 8};
9use hir_ty::db::HirDatabase; 9use hir_ty::db::HirDatabase;
10use stdx::impl_from;
11 10
12use crate::{ 11use crate::{
13 doc_links::Resolvable, Adt, Const, Enum, EnumVariant, Field, Function, GenericDef, ImplDef, 12 doc_links::Resolvable, Adt, Const, Enum, EnumVariant, Field, Function, GenericDef, ImplDef,
14 Local, MacroDef, Module, ModuleDef, Static, Struct, Trait, TypeAlias, TypeParam, Union, 13 Local, MacroDef, Module, ModuleDef, Static, Struct, Trait, TypeAlias, TypeParam, Union,
15}; 14};
16 15
17#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
18pub enum AttrDef {
19 Module(Module),
20 Field(Field),
21 Adt(Adt),
22 Function(Function),
23 EnumVariant(EnumVariant),
24 Static(Static),
25 Const(Const),
26 Trait(Trait),
27 TypeAlias(TypeAlias),
28 MacroDef(MacroDef),
29}
30
31impl_from!(
32 Module,
33 Field,
34 Adt(Struct, Enum, Union),
35 EnumVariant,
36 Static,
37 Const,
38 Function,
39 Trait,
40 TypeAlias,
41 MacroDef
42 for AttrDef
43);
44
45pub trait HasAttrs { 16pub trait HasAttrs {
46 fn attrs(self, db: &dyn HirDatabase) -> Attrs; 17 fn attrs(self, db: &dyn HirDatabase) -> Attrs;
47 fn docs(self, db: &dyn HirDatabase) -> Option<Documentation>; 18 fn docs(self, db: &dyn HirDatabase) -> Option<Documentation>;
48} 19}
49 20
50impl<T: Into<AttrDef>> HasAttrs for T { 21macro_rules! impl_has_attrs {
51 fn attrs(self, db: &dyn HirDatabase) -> Attrs { 22 ($(($def:ident, $def_id:ident),)*) => {$(
52 let def: AttrDef = self.into(); 23 impl HasAttrs for $def {
53 db.attrs(def.into()) 24 fn attrs(self, db: &dyn HirDatabase) -> Attrs {
54 } 25 let def = AttrDefId::$def_id(self.into());
55 fn docs(self, db: &dyn HirDatabase) -> Option<Documentation> { 26 db.attrs(def)
56 let def: AttrDef = self.into(); 27 }
57 db.documentation(def.into()) 28 fn docs(self, db: &dyn HirDatabase) -> Option<Documentation> {
58 } 29 let def = AttrDefId::$def_id(self.into());
30 db.documentation(def)
31 }
32 }
33 )*};
34}
35
36impl_has_attrs![
37 (Field, FieldId),
38 (EnumVariant, EnumVariantId),
39 (Static, StaticId),
40 (Const, ConstId),
41 (Trait, TraitId),
42 (TypeAlias, TypeAliasId),
43 (MacroDef, MacroDefId),
44 (Function, FunctionId),
45 (Adt, AdtId),
46 (Module, ModuleId),
47];
48
49macro_rules! impl_has_attrs_adt {
50 ($($adt:ident),*) => {$(
51 impl HasAttrs for $adt {
52 fn attrs(self, db: &dyn HirDatabase) -> Attrs {
53 Adt::$adt(self).attrs(db)
54 }
55 fn docs(self, db: &dyn HirDatabase) -> Option<Documentation> {
56 Adt::$adt(self).docs(db)
57 }
58 }
59 )*};
59} 60}
60 61
62impl_has_attrs_adt![Struct, Union, Enum];
63
61impl Resolvable for ModuleDef { 64impl Resolvable for ModuleDef {
62 fn resolver<D: DefDatabase + HirDatabase>(&self, db: &D) -> Option<Resolver> { 65 fn resolver<D: DefDatabase + HirDatabase>(&self, db: &D) -> Option<Resolver> {
63 Some(match self { 66 Some(match self {