@@ -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:: ItemTreeNode ,
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 , DefWithBodyId , EnumId , FieldId , ImplId , ItemTreeLoc , Lookup , MacroId ,
21
+ ModuleDefId , ModuleId , TraitId , VariantId ,
18
22
} ;
19
23
20
24
pub trait ChildBySource {
@@ -57,24 +61,9 @@ impl ChildBySource for ImplId {
57
61
58
62
fn add_assoc_item ( db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId , item : AssocItemId ) {
59
63
match item {
60
- 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
- }
71
- }
72
- 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
- }
77
- }
64
+ AssocItemId :: FunctionId ( func) => insert_item_loc ( db, res, file_id, func, keys:: FUNCTION ) ,
65
+ AssocItemId :: ConstId ( konst) => insert_item_loc ( db, res, file_id, konst, keys:: CONST ) ,
66
+ AssocItemId :: TypeAliasId ( ty) => insert_item_loc ( db, res, file_id, ty, keys:: TYPE_ALIAS ) ,
78
67
}
79
68
}
80
69
@@ -89,15 +78,12 @@ impl ChildBySource for ModuleId {
89
78
impl ChildBySource for ItemScope {
90
79
fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId ) {
91
80
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
- } ) ;
81
+ self . impls ( ) . for_each ( |imp| insert_item_loc ( db, res, file_id, imp, keys:: IMPL ) ) ;
82
+ self . extern_crate_decls ( )
83
+ . for_each ( |ext| insert_item_loc ( db, res, file_id, ext, keys:: EXTERN_CRATE ) ) ;
84
+ self . use_decls ( ) . for_each ( |ext| insert_item_loc ( db, res, file_id, ext, keys:: USE ) ) ;
85
+ self . unnamed_consts ( db)
86
+ . for_each ( |konst| insert_item_loc ( db, res, file_id, konst, keys:: CONST ) ) ;
101
87
self . attr_macro_invocs ( ) . filter ( |( id, _) | id. file_id == file_id) . for_each (
102
88
|( ast_id, call_id) | {
103
89
res[ keys:: ATTR_MACRO_CALL ] . insert ( ast_id. to_node ( db. upcast ( ) ) , call_id) ;
@@ -141,16 +127,22 @@ impl ChildBySource for ItemScope {
141
127
} } ;
142
128
}
143
129
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) ) ,
130
+ ModuleDefId :: FunctionId ( id) => {
131
+ insert_item_loc ( db, map, file_id, id, keys:: FUNCTION )
132
+ }
133
+ ModuleDefId :: ConstId ( id) => insert_item_loc ( db, map, file_id, id, keys:: CONST ) ,
134
+ ModuleDefId :: TypeAliasId ( id) => {
135
+ insert_item_loc ( db, map, file_id, id, keys:: TYPE_ALIAS )
136
+ }
137
+ ModuleDefId :: StaticId ( id) => insert_item_loc ( db, map, file_id, id, keys:: STATIC ) ,
138
+ ModuleDefId :: TraitId ( id) => insert_item_loc ( db, map, file_id, id, keys:: TRAIT ) ,
139
+ ModuleDefId :: TraitAliasId ( id) => {
140
+ insert_item_loc ( db, map, file_id, id, keys:: TRAIT_ALIAS )
141
+ }
150
142
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 ) ) ,
143
+ AdtId :: StructId ( id) => insert_item_loc ( db , map, file_id , id , keys:: STRUCT ) ,
144
+ AdtId :: UnionId ( id) => insert_item_loc ( db , map, file_id , id , keys:: UNION ) ,
145
+ AdtId :: EnumId ( id) => insert_item_loc ( db , map, file_id , id , keys:: ENUM ) ,
154
146
} ,
155
147
ModuleDefId :: MacroId ( id) => match id {
156
148
MacroId :: Macro2Id ( id) => insert ! ( map[ keys:: MACRO2 ] . insert( id) ) ,
@@ -162,29 +154,6 @@ impl ChildBySource for ItemScope {
162
154
| ModuleDefId :: BuiltinType ( _) => ( ) ,
163
155
}
164
156
}
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
157
}
189
158
}
190
159
@@ -237,3 +206,21 @@ impl ChildBySource for DefWithBodyId {
237
206
}
238
207
}
239
208
}
209
+
210
+ fn insert_item_loc < ID , N , Data > (
211
+ db : & dyn DefDatabase ,
212
+ res : & mut DynMap ,
213
+ file_id : HirFileId ,
214
+ id : ID ,
215
+ key : Key < N :: Source , ID > ,
216
+ ) where
217
+ ID : for < ' db > Lookup < Database < ' db > = dyn DefDatabase + ' db , Data = Data > + ' static ,
218
+ Data : ItemTreeLoc < Id = N > ,
219
+ N : ItemTreeNode ,
220
+ N :: Source : ' static ,
221
+ {
222
+ let loc = id. lookup ( db) ;
223
+ if loc. item_tree_id ( ) . file_id ( ) == file_id {
224
+ res[ key] . insert ( loc. source ( db) . value , id)
225
+ }
226
+ }
0 commit comments