5
5
//! node for a *child*, and get its hir.
6
6
7
7
use either:: Either ;
8
+ use hir_expand:: HirFileId ;
8
9
9
10
use crate :: {
10
11
db:: DefDatabase ,
@@ -17,145 +18,196 @@ use crate::{
17
18
} ;
18
19
19
20
pub trait ChildBySource {
20
- fn child_by_source ( & self , db : & dyn DefDatabase ) -> DynMap {
21
+ fn child_by_source ( & self , db : & dyn DefDatabase , file_id : HirFileId ) -> DynMap {
21
22
let mut res = DynMap :: default ( ) ;
22
- self . child_by_source_to ( db, & mut res) ;
23
+ self . child_by_source_to ( db, & mut res, file_id ) ;
23
24
res
24
25
}
25
- fn child_by_source_to ( & self , db : & dyn DefDatabase , map : & mut DynMap ) ;
26
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , map : & mut DynMap , file_id : HirFileId ) ;
26
27
}
27
28
28
29
impl ChildBySource for TraitId {
29
- fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
30
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId ) {
30
31
let data = db. trait_data ( * self ) ;
31
32
for ( _name, item) in data. items . iter ( ) {
32
33
match * item {
33
34
AssocItemId :: FunctionId ( func) => {
34
- let src = func. lookup ( db) . source ( db) ;
35
- res[ keys:: FUNCTION ] . insert ( src, func)
35
+ let loc = func. lookup ( db) ;
36
+ if loc. id . file_id ( ) == file_id {
37
+ let src = loc. source ( db) ;
38
+ res[ keys:: FUNCTION ] . insert ( src, func)
39
+ }
36
40
}
37
41
AssocItemId :: ConstId ( konst) => {
38
- let src = konst. lookup ( db) . source ( db) ;
39
- res[ keys:: CONST ] . insert ( src, konst)
42
+ let loc = konst. lookup ( db) ;
43
+ if loc. id . file_id ( ) == file_id {
44
+ let src = loc. source ( db) ;
45
+ res[ keys:: CONST ] . insert ( src, konst)
46
+ }
40
47
}
41
48
AssocItemId :: TypeAliasId ( ty) => {
42
- let src = ty. lookup ( db) . source ( db) ;
43
- res[ keys:: TYPE_ALIAS ] . insert ( src, ty)
49
+ let loc = ty. lookup ( db) ;
50
+ if loc. id . file_id ( ) == file_id {
51
+ let src = loc. source ( db) ;
52
+ res[ keys:: TYPE_ALIAS ] . insert ( src, ty)
53
+ }
44
54
}
45
55
}
46
56
}
47
57
}
48
58
}
49
59
50
60
impl ChildBySource for ImplId {
51
- fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
61
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId ) {
52
62
let data = db. impl_data ( * self ) ;
53
63
for & item in data. items . iter ( ) {
54
64
match item {
55
65
AssocItemId :: FunctionId ( func) => {
56
- let src = func. lookup ( db) . source ( db) ;
57
- res[ keys:: FUNCTION ] . insert ( src, func)
66
+ let loc = func. lookup ( db) ;
67
+ if loc. id . file_id ( ) == file_id {
68
+ let src = loc. source ( db) ;
69
+ res[ keys:: FUNCTION ] . insert ( src, func)
70
+ }
58
71
}
59
72
AssocItemId :: ConstId ( konst) => {
60
- let src = konst. lookup ( db) . source ( db) ;
61
- res[ keys:: CONST ] . insert ( src, konst)
73
+ let loc = konst. lookup ( db) ;
74
+ if loc. id . file_id ( ) == file_id {
75
+ let src = loc. source ( db) ;
76
+ res[ keys:: CONST ] . insert ( src, konst)
77
+ }
62
78
}
63
79
AssocItemId :: TypeAliasId ( ty) => {
64
- let src = ty. lookup ( db) . source ( db) ;
65
- res[ keys:: TYPE_ALIAS ] . insert ( src, ty)
80
+ let loc = ty. lookup ( db) ;
81
+ if loc. id . file_id ( ) == file_id {
82
+ let src = loc. source ( db) ;
83
+ res[ keys:: TYPE_ALIAS ] . insert ( src, ty)
84
+ }
66
85
}
67
86
}
68
87
}
69
88
}
70
89
}
71
90
72
91
impl ChildBySource for ModuleId {
73
- fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
92
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId ) {
74
93
let def_map = self . def_map ( db) ;
75
94
let module_data = & def_map[ self . local_id ] ;
76
- module_data. scope . child_by_source_to ( db, res) ;
95
+ module_data. scope . child_by_source_to ( db, res, file_id ) ;
77
96
}
78
97
}
79
98
80
99
impl ChildBySource for ItemScope {
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) ) ;
100
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId ) {
101
+ self . declarations ( ) . for_each ( |item| add_module_def ( db, file_id , res, item) ) ;
83
102
self . unnamed_consts ( ) . for_each ( |konst| {
84
103
let src = konst. lookup ( db) . source ( db) ;
85
104
res[ keys:: CONST ] . insert ( src, konst) ;
86
105
} ) ;
87
- self . impls ( ) . for_each ( |imp| add_impl ( db, res, imp) ) ;
106
+ self . impls ( ) . for_each ( |imp| add_impl ( db, file_id , res, imp) ) ;
88
107
self . attr_macro_invocs ( ) . for_each ( |( ast_id, call_id) | {
89
108
let item = ast_id. with_value ( ast_id. to_node ( db. upcast ( ) ) ) ;
90
109
res[ keys:: ATTR_MACRO ] . insert ( item, call_id) ;
91
110
} ) ;
92
111
93
- fn add_module_def ( db : & dyn DefDatabase , map : & mut DynMap , item : ModuleDefId ) {
112
+ fn add_module_def (
113
+ db : & dyn DefDatabase ,
114
+ file_id : HirFileId ,
115
+ map : & mut DynMap ,
116
+ item : ModuleDefId ,
117
+ ) {
94
118
match item {
95
119
ModuleDefId :: FunctionId ( func) => {
96
- let src = func. lookup ( db) . source ( db) ;
97
- map[ keys:: FUNCTION ] . insert ( src, func)
120
+ let loc = func. lookup ( db) ;
121
+ if loc. id . file_id ( ) == file_id {
122
+ let src = loc. source ( db) ;
123
+ map[ keys:: FUNCTION ] . insert ( src, func)
124
+ }
98
125
}
99
126
ModuleDefId :: ConstId ( konst) => {
100
- let src = konst. lookup ( db) . source ( db) ;
101
- map[ keys:: CONST ] . insert ( src, konst)
127
+ let loc = konst. lookup ( db) ;
128
+ if loc. id . file_id ( ) == file_id {
129
+ let src = loc. source ( db) ;
130
+ map[ keys:: CONST ] . insert ( src, konst)
131
+ }
102
132
}
103
133
ModuleDefId :: StaticId ( statik) => {
104
- let src = statik. lookup ( db) . source ( db) ;
105
- map[ keys:: STATIC ] . insert ( src, statik)
134
+ let loc = statik. lookup ( db) ;
135
+ if loc. id . file_id ( ) == file_id {
136
+ let src = loc. source ( db) ;
137
+ map[ keys:: STATIC ] . insert ( src, statik)
138
+ }
106
139
}
107
140
ModuleDefId :: TypeAliasId ( ty) => {
108
- let src = ty. lookup ( db) . source ( db) ;
109
- map[ keys:: TYPE_ALIAS ] . insert ( src, ty)
141
+ let loc = ty. lookup ( db) ;
142
+ if loc. id . file_id ( ) == file_id {
143
+ let src = loc. source ( db) ;
144
+ map[ keys:: TYPE_ALIAS ] . insert ( src, ty)
145
+ }
110
146
}
111
147
ModuleDefId :: TraitId ( trait_) => {
112
- let src = trait_. lookup ( db) . source ( db) ;
113
- map[ keys:: TRAIT ] . insert ( src, trait_)
148
+ let loc = trait_. lookup ( db) ;
149
+ if loc. id . file_id ( ) == file_id {
150
+ let src = loc. source ( db) ;
151
+ map[ keys:: TRAIT ] . insert ( src, trait_)
152
+ }
114
153
}
115
154
ModuleDefId :: AdtId ( adt) => match adt {
116
155
AdtId :: StructId ( strukt) => {
117
- let src = strukt. lookup ( db) . source ( db) ;
118
- map[ keys:: STRUCT ] . insert ( src, strukt)
156
+ let loc = strukt. lookup ( db) ;
157
+ if loc. id . file_id ( ) == file_id {
158
+ let src = loc. source ( db) ;
159
+ map[ keys:: STRUCT ] . insert ( src, strukt)
160
+ }
119
161
}
120
162
AdtId :: UnionId ( union_) => {
121
- let src = union_. lookup ( db) . source ( db) ;
122
- map[ keys:: UNION ] . insert ( src, union_)
163
+ let loc = union_. lookup ( db) ;
164
+ if loc. id . file_id ( ) == file_id {
165
+ let src = loc. source ( db) ;
166
+ map[ keys:: UNION ] . insert ( src, union_)
167
+ }
123
168
}
124
169
AdtId :: EnumId ( enum_) => {
125
- let src = enum_. lookup ( db) . source ( db) ;
126
- map[ keys:: ENUM ] . insert ( src, enum_)
170
+ let loc = enum_. lookup ( db) ;
171
+ if loc. id . file_id ( ) == file_id {
172
+ let src = loc. source ( db) ;
173
+ map[ keys:: ENUM ] . insert ( src, enum_)
174
+ }
127
175
}
128
176
} ,
129
177
_ => ( ) ,
130
178
}
131
179
}
132
- fn add_impl ( db : & dyn DefDatabase , map : & mut DynMap , imp : ImplId ) {
133
- let src = imp. lookup ( db) . source ( db) ;
134
- map[ keys:: IMPL ] . insert ( src, imp)
180
+ fn add_impl ( db : & dyn DefDatabase , file_id : HirFileId , map : & mut DynMap , imp : ImplId ) {
181
+ let loc = imp. lookup ( db) ;
182
+ if loc. id . file_id ( ) == file_id {
183
+ let src = loc. source ( db) ;
184
+ map[ keys:: IMPL ] . insert ( src, imp)
185
+ }
135
186
}
136
187
}
137
188
}
138
189
139
190
impl ChildBySource for VariantId {
140
- fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
191
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , _ : HirFileId ) {
141
192
let arena_map = self . child_source ( db) ;
142
193
let arena_map = arena_map. as_ref ( ) ;
194
+ let parent = * self ;
143
195
for ( local_id, source) in arena_map. value . iter ( ) {
144
- let id = FieldId { parent : * self , local_id } ;
145
- match source {
196
+ let id = FieldId { parent, local_id } ;
197
+ match source. clone ( ) {
146
198
Either :: Left ( source) => {
147
- res[ keys:: TUPLE_FIELD ] . insert ( arena_map. with_value ( source. clone ( ) ) , id)
199
+ res[ keys:: TUPLE_FIELD ] . insert ( arena_map. with_value ( source) , id)
148
200
}
149
201
Either :: Right ( source) => {
150
- res[ keys:: RECORD_FIELD ] . insert ( arena_map. with_value ( source. clone ( ) ) , id)
202
+ res[ keys:: RECORD_FIELD ] . insert ( arena_map. with_value ( source) , id)
151
203
}
152
204
}
153
205
}
154
206
}
155
207
}
156
208
157
209
impl ChildBySource for EnumId {
158
- fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
210
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , _ : HirFileId ) {
159
211
let arena_map = self . child_source ( db) ;
160
212
let arena_map = arena_map. as_ref ( ) ;
161
213
for ( local_id, source) in arena_map. value . iter ( ) {
@@ -166,12 +218,12 @@ impl ChildBySource for EnumId {
166
218
}
167
219
168
220
impl ChildBySource for DefWithBodyId {
169
- fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap ) {
221
+ fn child_by_source_to ( & self , db : & dyn DefDatabase , res : & mut DynMap , file_id : HirFileId ) {
170
222
let body = db. body ( * self ) ;
171
223
for ( _, def_map) in body. blocks ( db) {
172
224
// All block expressions are merged into the same map, because they logically all add
173
225
// inner items to the containing `DefWithBodyId`.
174
- def_map[ def_map. root ( ) ] . scope . child_by_source_to ( db, res) ;
226
+ def_map[ def_map. root ( ) ] . scope . child_by_source_to ( db, res, file_id ) ;
175
227
}
176
228
}
177
229
}
0 commit comments