@@ -11,8 +11,8 @@ use crate::{
11
11
dyn_map:: DynMap ,
12
12
keys,
13
13
src:: { HasChildSource , HasSource } ,
14
- AdtId , AssocItemId , EnumId , EnumVariantId , ImplId , Lookup , ModuleDefId , ModuleId ,
15
- StructFieldId , TraitId , VariantId ,
14
+ AdtId , AssocItemId , DefWithBodyId , EnumId , EnumVariantId , ImplId , Lookup , ModuleDefId ,
15
+ ModuleId , StructFieldId , TraitId , VariantId ,
16
16
} ;
17
17
18
18
pub trait ChildBySource {
@@ -76,47 +76,11 @@ impl ChildBySource for ModuleId {
76
76
let mut res = DynMap :: default ( ) ;
77
77
78
78
let crate_def_map = db. crate_def_map ( self . krate ) ;
79
- for item in crate_def_map[ self . local_id ] . scope . declarations ( ) {
80
- match item {
81
- ModuleDefId :: FunctionId ( func) => {
82
- let src = func. lookup ( db) . source ( db) ;
83
- res[ keys:: FUNCTION ] . insert ( src, func)
84
- }
85
- ModuleDefId :: ConstId ( konst) => {
86
- let src = konst. lookup ( db) . source ( db) ;
87
- res[ keys:: CONST ] . insert ( src, konst)
88
- }
89
- ModuleDefId :: StaticId ( statik) => {
90
- let src = statik. lookup ( db) . source ( db) ;
91
- res[ keys:: STATIC ] . insert ( src, statik)
92
- }
93
- ModuleDefId :: TypeAliasId ( ty) => {
94
- let src = ty. lookup ( db) . source ( db) ;
95
- res[ keys:: TYPE_ALIAS ] . insert ( src, ty)
96
- }
97
- ModuleDefId :: TraitId ( trait_) => {
98
- let src = trait_. lookup ( db) . source ( db) ;
99
- res[ keys:: TRAIT ] . insert ( src, trait_)
100
- }
101
- ModuleDefId :: AdtId ( adt) => match adt {
102
- AdtId :: StructId ( strukt) => {
103
- let src = strukt. lookup ( db) . source ( db) ;
104
- res[ keys:: STRUCT ] . insert ( src, strukt)
105
- }
106
- AdtId :: UnionId ( union_) => {
107
- let src = union_. lookup ( db) . source ( db) ;
108
- res[ keys:: UNION ] . insert ( src, union_)
109
- }
110
- AdtId :: EnumId ( enum_) => {
111
- let src = enum_. lookup ( db) . source ( db) ;
112
- res[ keys:: ENUM ] . insert ( src, enum_)
113
- }
114
- } ,
115
- _ => ( ) ,
116
- }
117
- }
79
+ let module_data = & crate_def_map[ self . local_id ] ;
118
80
119
- for & impl_ in crate_def_map[ self . local_id ] . impls . iter ( ) {
81
+ module_data. scope . declarations ( ) . for_each ( |item| add_module_def ( db, & mut res, item) ) ;
82
+
83
+ for & impl_ in module_data. impls . iter ( ) {
120
84
let src = impl_. lookup ( db) . source ( db) ;
121
85
res[ keys:: IMPL ] . insert ( src, impl_)
122
86
}
@@ -125,6 +89,46 @@ impl ChildBySource for ModuleId {
125
89
}
126
90
}
127
91
92
+ fn add_module_def ( db : & impl DefDatabase , map : & mut DynMap , item : ModuleDefId ) {
93
+ match item {
94
+ ModuleDefId :: FunctionId ( func) => {
95
+ let src = func. lookup ( db) . source ( db) ;
96
+ map[ keys:: FUNCTION ] . insert ( src, func)
97
+ }
98
+ ModuleDefId :: ConstId ( konst) => {
99
+ let src = konst. lookup ( db) . source ( db) ;
100
+ map[ keys:: CONST ] . insert ( src, konst)
101
+ }
102
+ ModuleDefId :: StaticId ( statik) => {
103
+ let src = statik. lookup ( db) . source ( db) ;
104
+ map[ keys:: STATIC ] . insert ( src, statik)
105
+ }
106
+ ModuleDefId :: TypeAliasId ( ty) => {
107
+ let src = ty. lookup ( db) . source ( db) ;
108
+ map[ keys:: TYPE_ALIAS ] . insert ( src, ty)
109
+ }
110
+ ModuleDefId :: TraitId ( trait_) => {
111
+ let src = trait_. lookup ( db) . source ( db) ;
112
+ map[ keys:: TRAIT ] . insert ( src, trait_)
113
+ }
114
+ ModuleDefId :: AdtId ( adt) => match adt {
115
+ AdtId :: StructId ( strukt) => {
116
+ let src = strukt. lookup ( db) . source ( db) ;
117
+ map[ keys:: STRUCT ] . insert ( src, strukt)
118
+ }
119
+ AdtId :: UnionId ( union_) => {
120
+ let src = union_. lookup ( db) . source ( db) ;
121
+ map[ keys:: UNION ] . insert ( src, union_)
122
+ }
123
+ AdtId :: EnumId ( enum_) => {
124
+ let src = enum_. lookup ( db) . source ( db) ;
125
+ map[ keys:: ENUM ] . insert ( src, enum_)
126
+ }
127
+ } ,
128
+ _ => ( ) ,
129
+ }
130
+ }
131
+
128
132
impl ChildBySource for VariantId {
129
133
fn child_by_source ( & self , db : & impl DefDatabase ) -> DynMap {
130
134
let mut res = DynMap :: default ( ) ;
@@ -160,3 +164,12 @@ impl ChildBySource for EnumId {
160
164
res
161
165
}
162
166
}
167
+
168
+ impl ChildBySource for DefWithBodyId {
169
+ fn child_by_source ( & self , db : & impl DefDatabase ) -> DynMap {
170
+ let mut res = DynMap :: default ( ) ;
171
+ let body = db. body ( * self ) ;
172
+ body. defs . iter ( ) . copied ( ) . for_each ( |item| add_module_def ( db, & mut res, item) ) ;
173
+ res
174
+ }
175
+ }
0 commit comments