@@ -9,12 +9,16 @@ use hir_expand::{attrs::collect_attrs, HirFileId};
99
1010use crate :: {
1111 db:: DefDatabase ,
12- dyn_map:: { keys, DynMap } ,
12+ dyn_map:: {
13+ keys:: { self , Key } ,
14+ DynMap ,
15+ } ,
1316 item_scope:: ItemScope ,
17+ item_tree:: ItemTreeModItemNode ,
1418 nameres:: DefMap ,
1519 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 ,
1822} ;
1923
2024pub trait ChildBySource {
@@ -58,22 +62,11 @@ impl ChildBySource for ImplId {
5862fn add_assoc_item ( db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId , item : AssocItemId ) {
5963 match item {
6064 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 )
7166 }
67+ AssocItemId :: ConstId ( konst) => insert_assoc_item_loc ( db, res, file_id, konst, keys:: CONST ) ,
7268 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 )
7770 }
7871 }
7972}
@@ -89,15 +82,12 @@ impl ChildBySource for ModuleId {
8982impl ChildBySource for ItemScope {
9083 fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId ) {
9184 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 ) ) ;
10191 self . attr_macro_invocs ( ) . filter ( |( id, _) | id. file_id == file_id) . for_each (
10292 |( ast_id, call_id) | {
10393 res[ keys:: ATTR_MACRO_CALL ] . insert ( ast_id. to_node ( db. upcast ( ) ) , call_id) ;
@@ -141,16 +131,26 @@ impl ChildBySource for ItemScope {
141131 } } ;
142132 }
143133 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+ }
150150 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 ) ,
154154 } ,
155155 ModuleDefId :: MacroId ( id) => match id {
156156 MacroId :: Macro2Id ( id) => insert ! ( map[ keys:: MACRO2 ] . insert( id) ) ,
@@ -162,29 +162,6 @@ impl ChildBySource for ItemScope {
162162 | ModuleDefId :: BuiltinType ( _) => ( ) ,
163163 }
164164 }
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- }
188165 }
189166}
190167
@@ -237,3 +214,37 @@ impl ChildBySource for DefWithBodyId {
237214 }
238215 }
239216}
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