@@ -17,13 +17,16 @@ use crate::{
17
17
} ;
18
18
19
19
pub trait ChildBySource {
20
- fn child_by_source ( & self , db : & dyn DefDatabase ) -> DynMap ;
21
- }
22
-
23
- impl ChildBySource for TraitId {
24
20
fn child_by_source ( & self , db : & dyn DefDatabase ) -> DynMap {
25
21
let mut res = DynMap :: default ( ) ;
22
+ self . child_by_source_to ( db, & mut res) ;
23
+ res
24
+ }
25
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , map : & mut DynMap ) ;
26
+ }
26
27
28
+ impl ChildBySource for TraitId {
29
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
27
30
let data = db. trait_data ( * self ) ;
28
31
for ( _name, item) in data. items . iter ( ) {
29
32
match * item {
@@ -41,15 +44,11 @@ impl ChildBySource for TraitId {
41
44
}
42
45
}
43
46
}
44
-
45
- res
46
47
}
47
48
}
48
49
49
50
impl ChildBySource for ImplId {
50
- fn child_by_source ( & self , db : & dyn DefDatabase ) -> DynMap {
51
- let mut res = DynMap :: default ( ) ;
52
-
51
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
53
52
let data = db. impl_data ( * self ) ;
54
53
for & item in data. items . iter ( ) {
55
54
match item {
@@ -67,25 +66,21 @@ impl ChildBySource for ImplId {
67
66
}
68
67
}
69
68
}
70
-
71
- res
72
69
}
73
70
}
74
71
75
72
impl ChildBySource for ModuleId {
76
- fn child_by_source ( & self , db : & dyn DefDatabase ) -> DynMap {
73
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
77
74
let def_map = self . def_map ( db) ;
78
75
let module_data = & def_map[ self . local_id ] ;
79
- module_data. scope . child_by_source ( db)
76
+ module_data. scope . child_by_source_to ( db, res ) ;
80
77
}
81
78
}
82
79
83
80
impl ChildBySource for ItemScope {
84
- fn child_by_source ( & self , db : & dyn DefDatabase ) -> DynMap {
85
- let mut res = DynMap :: default ( ) ;
86
- self . declarations ( ) . for_each ( |item| add_module_def ( db, & mut res, item) ) ;
87
- self . impls ( ) . for_each ( |imp| add_impl ( db, & mut res, imp) ) ;
88
- return res;
81
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
82
+ self . declarations ( ) . for_each ( |item| add_module_def ( db, res, item) ) ;
83
+ self . impls ( ) . for_each ( |imp| add_impl ( db, res, imp) ) ;
89
84
90
85
fn add_module_def ( db : & dyn DefDatabase , map : & mut DynMap , item : ModuleDefId ) {
91
86
match item {
@@ -134,9 +129,7 @@ impl ChildBySource for ItemScope {
134
129
}
135
130
136
131
impl ChildBySource for VariantId {
137
- fn child_by_source ( & self , db : & dyn DefDatabase ) -> DynMap {
138
- let mut res = DynMap :: default ( ) ;
139
-
132
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
140
133
let arena_map = self . child_source ( db) ;
141
134
let arena_map = arena_map. as_ref ( ) ;
142
135
for ( local_id, source) in arena_map. value . iter ( ) {
@@ -150,28 +143,23 @@ impl ChildBySource for VariantId {
150
143
}
151
144
}
152
145
}
153
- res
154
146
}
155
147
}
156
148
157
149
impl ChildBySource for EnumId {
158
- fn child_by_source ( & self , db : & dyn DefDatabase ) -> DynMap {
159
- let mut res = DynMap :: default ( ) ;
160
-
150
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
161
151
let arena_map = self . child_source ( db) ;
162
152
let arena_map = arena_map. as_ref ( ) ;
163
153
for ( local_id, source) in arena_map. value . iter ( ) {
164
154
let id = EnumVariantId { parent : * self , local_id } ;
165
155
res[ keys:: VARIANT ] . insert ( arena_map. with_value ( source. clone ( ) ) , id)
166
156
}
167
-
168
- res
169
157
}
170
158
}
171
159
172
160
impl ChildBySource for DefWithBodyId {
173
- fn child_by_source ( & self , db : & dyn DefDatabase ) -> DynMap {
161
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
174
162
let body = db. body ( * self ) ;
175
- body. item_scope . child_by_source ( db)
163
+ body. item_scope . child_by_source_to ( db, res ) ;
176
164
}
177
165
}
0 commit comments