@@ -150,51 +150,31 @@ pub struct TraitData {
150
150
151
151
impl TraitData {
152
152
pub ( crate ) fn trait_data_query ( db : & dyn DefDatabase , tr : TraitId ) -> Arc < TraitData > {
153
- let src = tr. lookup ( db) . source ( db) ;
153
+ let tr_loc = tr. lookup ( db) ;
154
+ let src = tr_loc. source ( db) ;
154
155
let name = src. value . name ( ) . map_or_else ( Name :: missing, |n| n. as_name ( ) ) ;
155
156
let auto = src. value . auto_token ( ) . is_some ( ) ;
156
- let ast_id_map = db . ast_id_map ( src . file_id ) ;
157
+ let module_id = tr_loc . container . module ( db ) ;
157
158
158
159
let container = AssocContainerId :: TraitId ( tr) ;
159
- let items = if let Some ( item_list) = src. value . item_list ( ) {
160
- item_list
161
- . impl_items ( )
162
- . map ( |item_node| match item_node {
163
- ast:: ImplItem :: FnDef ( it) => {
164
- let name = it. name ( ) . map_or_else ( Name :: missing, |it| it. as_name ( ) ) ;
165
- let def = FunctionLoc {
166
- container,
167
- ast_id : AstId :: new ( src. file_id , ast_id_map. ast_id ( & it) ) ,
168
- }
169
- . intern ( db)
170
- . into ( ) ;
171
- ( name, def)
172
- }
173
- ast:: ImplItem :: ConstDef ( it) => {
174
- let name = it. name ( ) . map_or_else ( Name :: missing, |it| it. as_name ( ) ) ;
175
- let def = ConstLoc {
176
- container,
177
- ast_id : AstId :: new ( src. file_id , ast_id_map. ast_id ( & it) ) ,
178
- }
179
- . intern ( db)
180
- . into ( ) ;
181
- ( name, def)
182
- }
183
- ast:: ImplItem :: TypeAliasDef ( it) => {
184
- let name = it. name ( ) . map_or_else ( Name :: missing, |it| it. as_name ( ) ) ;
185
- let def = TypeAliasLoc {
186
- container,
187
- ast_id : AstId :: new ( src. file_id , ast_id_map. ast_id ( & it) ) ,
188
- }
189
- . intern ( db)
190
- . into ( ) ;
191
- ( name, def)
192
- }
193
- } )
194
- . collect ( )
195
- } else {
196
- Vec :: new ( )
197
- } ;
160
+ let mut items = Vec :: new ( ) ;
161
+
162
+ if let Some ( item_list) = src. value . item_list ( ) {
163
+ let mut expander = Expander :: new ( db, tr_loc. ast_id . file_id , module_id) ;
164
+ items. extend ( collect_items (
165
+ db,
166
+ & mut expander,
167
+ item_list. impl_items ( ) ,
168
+ src. file_id ,
169
+ container,
170
+ ) ) ;
171
+ items. extend ( collect_items_in_macros (
172
+ db,
173
+ & mut expander,
174
+ & src. with_value ( item_list) ,
175
+ container,
176
+ ) ) ;
177
+ }
198
178
Arc :: new ( TraitData { name, items, auto } )
199
179
}
200
180
@@ -232,24 +212,22 @@ impl ImplData {
232
212
let target_type = TypeRef :: from_ast_opt ( & lower_ctx, src. value . target_type ( ) ) ;
233
213
let is_negative = src. value . excl_token ( ) . is_some ( ) ;
234
214
let module_id = impl_loc. container . module ( db) ;
215
+ let container = AssocContainerId :: ImplId ( id) ;
235
216
236
- let mut items = Vec :: new ( ) ;
217
+ let mut items: Vec < AssocItemId > = Vec :: new ( ) ;
237
218
238
219
if let Some ( item_list) = src. value . item_list ( ) {
239
220
let mut expander = Expander :: new ( db, impl_loc. ast_id . file_id , module_id) ;
240
- items. extend ( collect_impl_items (
241
- db,
242
- & mut expander,
243
- item_list. impl_items ( ) ,
244
- src. file_id ,
245
- id,
246
- ) ) ;
247
- items. extend ( collect_impl_items_in_macros (
248
- db,
249
- & mut expander,
250
- & src. with_value ( item_list) ,
251
- id,
252
- ) ) ;
221
+ items. extend (
222
+ collect_items ( db, & mut expander, item_list. impl_items ( ) , src. file_id , container)
223
+ . into_iter ( )
224
+ . map ( |( _, item) | item) ,
225
+ ) ;
226
+ items. extend (
227
+ collect_items_in_macros ( db, & mut expander, & src. with_value ( item_list) , container)
228
+ . into_iter ( )
229
+ . map ( |( _, item) | item) ,
230
+ ) ;
253
231
}
254
232
255
233
let res = ImplData { target_trait, target_type, items, is_negative } ;
@@ -292,49 +270,50 @@ impl ConstData {
292
270
}
293
271
}
294
272
295
- fn collect_impl_items_in_macros (
273
+ fn collect_items_in_macros (
296
274
db : & dyn DefDatabase ,
297
275
expander : & mut Expander ,
298
276
impl_def : & InFile < ast:: ItemList > ,
299
- id : ImplId ,
300
- ) -> Vec < AssocItemId > {
277
+ container : AssocContainerId ,
278
+ ) -> Vec < ( Name , AssocItemId ) > {
301
279
let mut res = Vec :: new ( ) ;
302
280
303
281
// We set a limit to protect against infinite recursion
304
282
let limit = 100 ;
305
283
306
284
for m in impl_def. value . syntax ( ) . children ( ) . filter_map ( ast:: MacroCall :: cast) {
307
- res. extend ( collect_impl_items_in_macro ( db, expander, m, id , limit) )
285
+ res. extend ( collect_items_in_macro ( db, expander, m, container , limit) )
308
286
}
309
287
310
288
res
311
289
}
312
290
313
- fn collect_impl_items_in_macro (
291
+ fn collect_items_in_macro (
314
292
db : & dyn DefDatabase ,
315
293
expander : & mut Expander ,
316
294
m : ast:: MacroCall ,
317
- id : ImplId ,
295
+ container : AssocContainerId ,
318
296
limit : usize ,
319
- ) -> Vec < AssocItemId > {
297
+ ) -> Vec < ( Name , AssocItemId ) > {
320
298
if limit == 0 {
321
299
return Vec :: new ( ) ;
322
300
}
323
301
324
302
if let Some ( ( mark, items) ) = expander. enter_expand ( db, None , m) {
325
303
let items: InFile < ast:: MacroItems > = expander. to_source ( items) ;
326
- let mut res = collect_impl_items (
304
+ let mut res = collect_items (
327
305
db,
328
306
expander,
329
307
items. value . items ( ) . filter_map ( |it| ImplItem :: cast ( it. syntax ( ) . clone ( ) ) ) ,
330
308
items. file_id ,
331
- id ,
309
+ container ,
332
310
) ;
311
+
333
312
// Recursive collect macros
334
313
// Note that ast::ModuleItem do not include ast::MacroCall
335
314
// We cannot use ModuleItemOwner::items here
336
315
for it in items. value . syntax ( ) . children ( ) . filter_map ( ast:: MacroCall :: cast) {
337
- res. extend ( collect_impl_items_in_macro ( db, expander, it, id , limit - 1 ) )
316
+ res. extend ( collect_items_in_macro ( db, expander, it, container , limit - 1 ) )
338
317
}
339
318
expander. exit ( db, mark) ;
340
319
res
@@ -343,44 +322,39 @@ fn collect_impl_items_in_macro(
343
322
}
344
323
}
345
324
346
- fn collect_impl_items (
325
+ fn collect_items (
347
326
db : & dyn DefDatabase ,
348
327
expander : & mut Expander ,
349
328
impl_items : impl Iterator < Item = ImplItem > ,
350
329
file_id : crate :: HirFileId ,
351
- id : ImplId ,
352
- ) -> Vec < AssocItemId > {
330
+ container : AssocContainerId ,
331
+ ) -> Vec < ( Name , AssocItemId ) > {
353
332
let items = db. ast_id_map ( file_id) ;
354
333
355
334
impl_items
356
335
. filter_map ( |item_node| match item_node {
357
336
ast:: ImplItem :: FnDef ( it) => {
337
+ let name = it. name ( ) . map_or_else ( Name :: missing, |it| it. as_name ( ) ) ;
358
338
let attrs = expander. parse_attrs ( & it) ;
359
339
if !expander. is_cfg_enabled ( & attrs) {
360
340
return None ;
361
341
}
362
- let def = FunctionLoc {
363
- container : AssocContainerId :: ImplId ( id) ,
364
- ast_id : AstId :: new ( file_id, items. ast_id ( & it) ) ,
365
- }
366
- . intern ( db) ;
367
- Some ( def. into ( ) )
342
+ let def = FunctionLoc { container, ast_id : AstId :: new ( file_id, items. ast_id ( & it) ) }
343
+ . intern ( db) ;
344
+ Some ( ( name, def. into ( ) ) )
368
345
}
369
346
ast:: ImplItem :: ConstDef ( it) => {
370
- let def = ConstLoc {
371
- container : AssocContainerId :: ImplId ( id) ,
372
- ast_id : AstId :: new ( file_id, items. ast_id ( & it) ) ,
373
- }
374
- . intern ( db) ;
375
- Some ( def. into ( ) )
347
+ let name = it. name ( ) . map_or_else ( Name :: missing, |it| it. as_name ( ) ) ;
348
+ let def = ConstLoc { container, ast_id : AstId :: new ( file_id, items. ast_id ( & it) ) }
349
+ . intern ( db) ;
350
+ Some ( ( name, def. into ( ) ) )
376
351
}
377
352
ast:: ImplItem :: TypeAliasDef ( it) => {
378
- let def = TypeAliasLoc {
379
- container : AssocContainerId :: ImplId ( id) ,
380
- ast_id : AstId :: new ( file_id, items. ast_id ( & it) ) ,
381
- }
382
- . intern ( db) ;
383
- Some ( def. into ( ) )
353
+ let name = it. name ( ) . map_or_else ( Name :: missing, |it| it. as_name ( ) ) ;
354
+ let def =
355
+ TypeAliasLoc { container, ast_id : AstId :: new ( file_id, items. ast_id ( & it) ) }
356
+ . intern ( db) ;
357
+ Some ( ( name, def. into ( ) ) )
384
358
}
385
359
} )
386
360
. collect ( )
0 commit comments