@@ -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:: ItemTreeNode ,
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 , DefWithBodyId , EnumId , FieldId , ImplId , ItemTreeLoc , Lookup , MacroId ,
21+ ModuleDefId , ModuleId , TraitId , VariantId ,
1822} ;
1923
2024pub trait ChildBySource {
@@ -57,24 +61,9 @@ impl ChildBySource for ImplId {
5761
5862fn add_assoc_item ( db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId , item : AssocItemId ) {
5963 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 ) ,
7867 }
7968}
8069
@@ -89,15 +78,12 @@ impl ChildBySource for ModuleId {
8978impl ChildBySource for ItemScope {
9079 fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId ) {
9180 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 ) ) ;
10187 self . attr_macro_invocs ( ) . filter ( |( id, _) | id. file_id == file_id) . for_each (
10288 |( ast_id, call_id) | {
10389 res[ keys:: ATTR_MACRO_CALL ] . insert ( ast_id. to_node ( db. upcast ( ) ) , call_id) ;
@@ -141,16 +127,22 @@ impl ChildBySource for ItemScope {
141127 } } ;
142128 }
143129 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+ }
150142 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 ) ,
154146 } ,
155147 ModuleDefId :: MacroId ( id) => match id {
156148 MacroId :: Macro2Id ( id) => insert ! ( map[ keys:: MACRO2 ] . insert( id) ) ,
@@ -162,29 +154,6 @@ impl ChildBySource for ItemScope {
162154 | ModuleDefId :: BuiltinType ( _) => ( ) ,
163155 }
164156 }
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- }
188157 }
189158}
190159
@@ -237,3 +206,21 @@ impl ChildBySource for DefWithBodyId {
237206 }
238207 }
239208}
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