@@ -8,8 +8,8 @@ use rustc_hash::FxHashMap;
8
8
use syntax:: SmolStr ;
9
9
10
10
use crate :: {
11
- db:: DefDatabase , AdtId , AttrDefId , CrateId , EnumId , FunctionId , ImplId , ModuleDefId , StaticId ,
12
- StructId , TraitId ,
11
+ db:: DefDatabase , AdtId , AttrDefId , CrateId , EnumId , EnumVariantId , FunctionId , ImplId ,
12
+ ModuleDefId , StaticId , StructId , TraitId ,
13
13
} ;
14
14
15
15
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Hash ) ]
@@ -20,6 +20,7 @@ pub enum LangItemTarget {
20
20
StaticId ( StaticId ) ,
21
21
StructId ( StructId ) ,
22
22
TraitId ( TraitId ) ,
23
+ EnumVariantId ( EnumVariantId ) ,
23
24
}
24
25
25
26
impl LangItemTarget {
@@ -64,6 +65,13 @@ impl LangItemTarget {
64
65
_ => None ,
65
66
}
66
67
}
68
+
69
+ pub fn as_enum_variant ( self ) -> Option < EnumVariantId > {
70
+ match self {
71
+ LangItemTarget :: EnumVariantId ( id) => Some ( id) ,
72
+ _ => None ,
73
+ }
74
+ }
67
75
}
68
76
69
77
#[ derive( Default , Debug , Clone , PartialEq , Eq ) ]
@@ -92,19 +100,31 @@ impl LangItems {
92
100
for def in module_data. scope . declarations ( ) {
93
101
match def {
94
102
ModuleDefId :: TraitId ( trait_) => {
95
- lang_items. collect_lang_item ( db, trait_, LangItemTarget :: TraitId )
103
+ lang_items. collect_lang_item ( db, trait_, LangItemTarget :: TraitId ) ;
104
+ db. trait_data ( trait_) . items . iter ( ) . for_each ( |& ( _, assoc_id) | {
105
+ if let crate :: AssocItemId :: FunctionId ( f) = assoc_id {
106
+ lang_items. collect_lang_item ( db, f, LangItemTarget :: FunctionId ) ;
107
+ }
108
+ } ) ;
96
109
}
97
110
ModuleDefId :: AdtId ( AdtId :: EnumId ( e) ) => {
98
- lang_items. collect_lang_item ( db, e, LangItemTarget :: EnumId )
111
+ lang_items. collect_lang_item ( db, e, LangItemTarget :: EnumId ) ;
112
+ db. enum_data ( e) . variants . iter ( ) . for_each ( |( local_id, _) | {
113
+ lang_items. collect_lang_item (
114
+ db,
115
+ EnumVariantId { parent : e, local_id } ,
116
+ LangItemTarget :: EnumVariantId ,
117
+ ) ;
118
+ } ) ;
99
119
}
100
120
ModuleDefId :: AdtId ( AdtId :: StructId ( s) ) => {
101
- lang_items. collect_lang_item ( db, s, LangItemTarget :: StructId )
121
+ lang_items. collect_lang_item ( db, s, LangItemTarget :: StructId ) ;
102
122
}
103
123
ModuleDefId :: FunctionId ( f) => {
104
- lang_items. collect_lang_item ( db, f, LangItemTarget :: FunctionId )
124
+ lang_items. collect_lang_item ( db, f, LangItemTarget :: FunctionId ) ;
105
125
}
106
126
ModuleDefId :: StaticId ( s) => {
107
- lang_items. collect_lang_item ( db, s, LangItemTarget :: StaticId )
127
+ lang_items. collect_lang_item ( db, s, LangItemTarget :: StaticId ) ;
108
128
}
109
129
_ => { }
110
130
}
0 commit comments