@@ -9,12 +9,16 @@ use hir_expand::{attrs::collect_attrs, HirFileId};
9
9
10
10
use crate :: {
11
11
db:: DefDatabase ,
12
- dyn_map:: { keys, DynMap } ,
12
+ dyn_map:: {
13
+ keys:: { self , Key } ,
14
+ DynMap ,
15
+ } ,
13
16
item_scope:: ItemScope ,
17
+ item_tree:: ItemTreeModItemNode ,
14
18
nameres:: DefMap ,
15
19
src:: { HasChildSource , HasSource } ,
16
- AdtId , AssocItemId , DefWithBodyId , EnumId , ExternCrateId , FieldId , ImplId , Lookup , MacroId ,
17
- ModuleDefId , ModuleId , TraitId , UseId , VariantId ,
20
+ AdtId , AssocItemId , AssocItemLoc , DefWithBodyId , EnumId , FieldId , ImplId , ItemLoc , Lookup ,
21
+ MacroId , ModuleDefId , ModuleId , TraitId , VariantId ,
18
22
} ;
19
23
20
24
pub trait ChildBySource {
@@ -58,22 +62,11 @@ impl ChildBySource for ImplId {
58
62
fn add_assoc_item ( db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId , item : AssocItemId ) {
59
63
match item {
60
64
AssocItemId :: FunctionId ( func) => {
61
- let loc = func. lookup ( db) ;
62
- if loc. id . file_id ( ) == file_id {
63
- res[ keys:: FUNCTION ] . insert ( loc. source ( db) . value , func)
64
- }
65
- }
66
- AssocItemId :: ConstId ( konst) => {
67
- let loc = konst. lookup ( db) ;
68
- if loc. id . file_id ( ) == file_id {
69
- res[ keys:: CONST ] . insert ( loc. source ( db) . value , konst)
70
- }
65
+ insert_assoc_item_loc ( db, res, file_id, func, keys:: FUNCTION )
71
66
}
67
+ AssocItemId :: ConstId ( konst) => insert_assoc_item_loc ( db, res, file_id, konst, keys:: CONST ) ,
72
68
AssocItemId :: TypeAliasId ( ty) => {
73
- let loc = ty. lookup ( db) ;
74
- if loc. id . file_id ( ) == file_id {
75
- res[ keys:: TYPE_ALIAS ] . insert ( loc. source ( db) . value , ty)
76
- }
69
+ insert_assoc_item_loc ( db, res, file_id, ty, keys:: TYPE_ALIAS )
77
70
}
78
71
}
79
72
}
@@ -89,15 +82,12 @@ impl ChildBySource for ModuleId {
89
82
impl ChildBySource for ItemScope {
90
83
fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId ) {
91
84
self . declarations ( ) . for_each ( |item| add_module_def ( db, res, file_id, item) ) ;
92
- self . impls ( ) . for_each ( |imp| add_impl ( db, res, file_id, imp) ) ;
93
- self . extern_crate_decls ( ) . for_each ( |ext| add_extern_crate ( db, res, file_id, ext) ) ;
94
- self . use_decls ( ) . for_each ( |ext| add_use ( db, res, file_id, ext) ) ;
95
- self . unnamed_consts ( db) . for_each ( |konst| {
96
- let loc = konst. lookup ( db) ;
97
- if loc. id . file_id ( ) == file_id {
98
- res[ keys:: CONST ] . insert ( loc. source ( db) . value , konst) ;
99
- }
100
- } ) ;
85
+ self . impls ( ) . for_each ( |imp| insert_item_loc ( db, res, file_id, imp, keys:: IMPL ) ) ;
86
+ self . extern_crate_decls ( )
87
+ . for_each ( |ext| insert_item_loc ( db, res, file_id, ext, keys:: EXTERN_CRATE ) ) ;
88
+ self . use_decls ( ) . for_each ( |ext| insert_item_loc ( db, res, file_id, ext, keys:: USE ) ) ;
89
+ self . unnamed_consts ( db)
90
+ . for_each ( |konst| insert_assoc_item_loc ( db, res, file_id, konst, keys:: CONST ) ) ;
101
91
self . attr_macro_invocs ( ) . filter ( |( id, _) | id. file_id == file_id) . for_each (
102
92
|( ast_id, call_id) | {
103
93
res[ keys:: ATTR_MACRO_CALL ] . insert ( ast_id. to_node ( db. upcast ( ) ) , call_id) ;
@@ -141,16 +131,26 @@ impl ChildBySource for ItemScope {
141
131
} } ;
142
132
}
143
133
match item {
144
- ModuleDefId :: FunctionId ( id) => insert ! ( map[ keys:: FUNCTION ] . insert( id) ) ,
145
- ModuleDefId :: ConstId ( id) => insert ! ( map[ keys:: CONST ] . insert( id) ) ,
146
- ModuleDefId :: StaticId ( id) => insert ! ( map[ keys:: STATIC ] . insert( id) ) ,
147
- ModuleDefId :: TypeAliasId ( id) => insert ! ( map[ keys:: TYPE_ALIAS ] . insert( id) ) ,
148
- ModuleDefId :: TraitId ( id) => insert ! ( map[ keys:: TRAIT ] . insert( id) ) ,
149
- ModuleDefId :: TraitAliasId ( id) => insert ! ( map[ keys:: TRAIT_ALIAS ] . insert( id) ) ,
134
+ ModuleDefId :: FunctionId ( id) => {
135
+ insert_assoc_item_loc ( db, map, file_id, id, keys:: FUNCTION )
136
+ }
137
+ ModuleDefId :: ConstId ( id) => {
138
+ insert_assoc_item_loc ( db, map, file_id, id, keys:: CONST )
139
+ }
140
+ ModuleDefId :: TypeAliasId ( id) => {
141
+ insert_assoc_item_loc ( db, map, file_id, id, keys:: TYPE_ALIAS )
142
+ }
143
+ ModuleDefId :: StaticId ( id) => {
144
+ insert_assoc_item_loc ( db, map, file_id, id, keys:: STATIC )
145
+ }
146
+ ModuleDefId :: TraitId ( id) => insert_item_loc ( db, map, file_id, id, keys:: TRAIT ) ,
147
+ ModuleDefId :: TraitAliasId ( id) => {
148
+ insert_item_loc ( db, map, file_id, id, keys:: TRAIT_ALIAS )
149
+ }
150
150
ModuleDefId :: AdtId ( adt) => match adt {
151
- AdtId :: StructId ( id) => insert ! ( map[ keys:: STRUCT ] . insert ( id ) ) ,
152
- AdtId :: UnionId ( id) => insert ! ( map[ keys:: UNION ] . insert ( id ) ) ,
153
- AdtId :: EnumId ( id) => insert ! ( map[ keys:: ENUM ] . insert ( id ) ) ,
151
+ AdtId :: StructId ( id) => insert_item_loc ( db , map, file_id , id , keys:: STRUCT ) ,
152
+ AdtId :: UnionId ( id) => insert_item_loc ( db , map, file_id , id , keys:: UNION ) ,
153
+ AdtId :: EnumId ( id) => insert_item_loc ( db , map, file_id , id , keys:: ENUM ) ,
154
154
} ,
155
155
ModuleDefId :: MacroId ( id) => match id {
156
156
MacroId :: Macro2Id ( id) => insert ! ( map[ keys:: MACRO2 ] . insert( id) ) ,
@@ -162,29 +162,6 @@ impl ChildBySource for ItemScope {
162
162
| ModuleDefId :: BuiltinType ( _) => ( ) ,
163
163
}
164
164
}
165
- fn add_impl ( db : & dyn DefDatabase , map : & mut DynMap , file_id : HirFileId , imp : ImplId ) {
166
- let loc = imp. lookup ( db) ;
167
- if loc. id . file_id ( ) == file_id {
168
- map[ keys:: IMPL ] . insert ( loc. source ( db) . value , imp)
169
- }
170
- }
171
- fn add_extern_crate (
172
- db : & dyn DefDatabase ,
173
- map : & mut DynMap ,
174
- file_id : HirFileId ,
175
- ext : ExternCrateId ,
176
- ) {
177
- let loc = ext. lookup ( db) ;
178
- if loc. id . file_id ( ) == file_id {
179
- map[ keys:: EXTERN_CRATE ] . insert ( loc. source ( db) . value , ext)
180
- }
181
- }
182
- fn add_use ( db : & dyn DefDatabase , map : & mut DynMap , file_id : HirFileId , ext : UseId ) {
183
- let loc = ext. lookup ( db) ;
184
- if loc. id . file_id ( ) == file_id {
185
- map[ keys:: USE ] . insert ( loc. source ( db) . value , ext)
186
- }
187
- }
188
165
}
189
166
}
190
167
@@ -237,3 +214,37 @@ impl ChildBySource for DefWithBodyId {
237
214
}
238
215
}
239
216
}
217
+
218
+ fn insert_item_loc < ID , N > (
219
+ db : & dyn DefDatabase ,
220
+ res : & mut DynMap ,
221
+ file_id : HirFileId ,
222
+ id : ID ,
223
+ key : Key < N :: Source , ID > ,
224
+ ) where
225
+ ID : for < ' db > Lookup < Database < ' db > = dyn DefDatabase + ' db , Data = ItemLoc < N > > + ' static ,
226
+ N : ItemTreeModItemNode ,
227
+ N :: Source : ' static ,
228
+ {
229
+ let loc = id. lookup ( db) ;
230
+ if loc. id . file_id ( ) == file_id {
231
+ res[ key] . insert ( loc. source ( db) . value , id)
232
+ }
233
+ }
234
+
235
+ fn insert_assoc_item_loc < ID , N > (
236
+ db : & dyn DefDatabase ,
237
+ res : & mut DynMap ,
238
+ file_id : HirFileId ,
239
+ id : ID ,
240
+ key : Key < N :: Source , ID > ,
241
+ ) where
242
+ ID : for < ' db > Lookup < Database < ' db > = dyn DefDatabase + ' db , Data = AssocItemLoc < N > > + ' static ,
243
+ N : ItemTreeModItemNode ,
244
+ N :: Source : ' static ,
245
+ {
246
+ let loc = id. lookup ( db) ;
247
+ if loc. id . file_id ( ) == file_id {
248
+ res[ key] . insert ( loc. source ( db) . value , id)
249
+ }
250
+ }
0 commit comments