@@ -368,34 +368,43 @@ impl Resolver {
368
368
for scope in self . scopes ( ) {
369
369
scope. process_names ( & mut res, db) ;
370
370
}
371
- process_module_scope_names ( & mut res, db, & self . module_scope ) ;
371
+ let ModuleItemMap { ref def_map, module_id } = self . module_scope ;
372
+ // FIXME: should we provide `self` here?
373
+ // f(
374
+ // Name::self_param(),
375
+ // PerNs::types(Resolution::Def {
376
+ // def: m.module.into(),
377
+ // }),
378
+ // );
379
+ def_map[ module_id] . scope . entries ( ) . for_each ( |( name, def) | {
380
+ res. add_per_ns ( name, def) ;
381
+ } ) ;
382
+ def_map[ module_id] . scope . legacy_macros ( ) . for_each ( |( name, macs) | {
383
+ macs. iter ( ) . for_each ( |& mac| {
384
+ res. add ( name, ScopeDef :: ModuleDef ( ModuleDefId :: MacroId ( MacroId :: from ( mac) ) ) ) ;
385
+ } )
386
+ } ) ;
387
+ def_map. extern_prelude ( ) . for_each ( |( name, & def) | {
388
+ res. add ( name, ScopeDef :: ModuleDef ( ModuleDefId :: ModuleId ( def) ) ) ;
389
+ } ) ;
390
+ BUILTIN_SCOPE . iter ( ) . for_each ( |( name, & def) | {
391
+ res. add_per_ns ( name, def) ;
392
+ } ) ;
393
+ if let Some ( prelude) = def_map. prelude ( ) {
394
+ let prelude_def_map = prelude. def_map ( db) ;
395
+ for ( name, def) in prelude_def_map[ prelude. local_id ] . scope . entries ( ) {
396
+ res. add_per_ns ( name, def)
397
+ }
398
+ }
372
399
res. map
373
400
}
374
401
375
402
pub fn traits_in_scope ( & self , db : & dyn DefDatabase ) -> FxHashSet < TraitId > {
376
403
let mut traits = FxHashSet :: default ( ) ;
377
404
378
- let collect_module_traits = |traits : & mut FxHashSet < _ > , m : & ModuleItemMap | {
379
- if let Some ( prelude) = m. def_map . prelude ( ) {
380
- let prelude_def_map = prelude. def_map ( db) ;
381
- traits. extend ( prelude_def_map[ prelude. local_id ] . scope . traits ( ) ) ;
382
- }
383
- traits. extend ( m. def_map [ m. module_id ] . scope . traits ( ) ) ;
384
-
385
- // Add all traits that are in scope because of the containing DefMaps
386
- m. def_map . with_ancestor_maps ( db, m. module_id , & mut |def_map, module| {
387
- if let Some ( prelude) = def_map. prelude ( ) {
388
- let prelude_def_map = prelude. def_map ( db) ;
389
- traits. extend ( prelude_def_map[ prelude. local_id ] . scope . traits ( ) ) ;
390
- }
391
- traits. extend ( def_map[ module] . scope . traits ( ) ) ;
392
- None :: < ( ) >
393
- } ) ;
394
- } ;
395
-
396
405
for scope in self . scopes ( ) {
397
406
match scope {
398
- Scope :: BlockScope ( m) => collect_module_traits ( & mut traits, m ) ,
407
+ Scope :: BlockScope ( m) => traits. extend ( m . def_map [ m . module_id ] . scope . traits ( ) ) ,
399
408
& Scope :: ImplDefScope ( impl_) => {
400
409
if let Some ( target_trait) = & db. impl_data ( impl_) . target_trait {
401
410
if let Some ( TypeNs :: TraitId ( trait_) ) =
@@ -409,7 +418,13 @@ impl Resolver {
409
418
}
410
419
}
411
420
412
- collect_module_traits ( & mut traits, & self . module_scope ) ;
421
+ // Fill in the prelude traits
422
+ if let Some ( prelude) = self . module_scope . def_map . prelude ( ) {
423
+ let prelude_def_map = prelude. def_map ( db) ;
424
+ traits. extend ( prelude_def_map[ prelude. local_id ] . scope . traits ( ) ) ;
425
+ }
426
+ // Fill in module visible traits
427
+ traits. extend ( self . module_scope . def_map [ self . module_scope . module_id ] . scope . traits ( ) ) ;
413
428
traits
414
429
}
415
430
@@ -493,42 +508,22 @@ pub enum ScopeDef {
493
508
Label ( LabelId ) ,
494
509
}
495
510
496
- fn process_module_scope_names ( acc : & mut ScopeNames , db : & dyn DefDatabase , m : & ModuleItemMap ) {
497
- // FIXME: should we provide `self` here?
498
- // f(
499
- // Name::self_param(),
500
- // PerNs::types(Resolution::Def {
501
- // def: m.module.into(),
502
- // }),
503
- // );
504
- m. def_map [ m. module_id ] . scope . entries ( ) . for_each ( |( name, def) | {
505
- acc. add_per_ns ( name, def) ;
506
- } ) ;
507
- m. def_map [ m. module_id ] . scope . legacy_macros ( ) . for_each ( |( name, macs) | {
508
- macs. iter ( ) . for_each ( |& mac| {
509
- acc. add ( name, ScopeDef :: ModuleDef ( ModuleDefId :: MacroId ( MacroId :: from ( mac) ) ) ) ;
510
- } )
511
- } ) ;
512
- m. def_map . extern_prelude ( ) . for_each ( |( name, & def) | {
513
- acc. add ( name, ScopeDef :: ModuleDef ( ModuleDefId :: ModuleId ( def) ) ) ;
514
- } ) ;
515
- if m. def_map . block_id ( ) . is_none ( ) {
516
- BUILTIN_SCOPE . iter ( ) . for_each ( |( name, & def) | {
517
- acc. add_per_ns ( name, def) ;
518
- } ) ;
519
- }
520
- if let Some ( prelude) = m. def_map . prelude ( ) {
521
- let prelude_def_map = prelude. def_map ( db) ;
522
- for ( name, def) in prelude_def_map[ prelude. local_id ] . scope . entries ( ) {
523
- acc. add_per_ns ( name, def)
524
- }
525
- }
526
- }
527
-
528
511
impl Scope {
529
512
fn process_names ( & self , acc : & mut ScopeNames , db : & dyn DefDatabase ) {
530
513
match self {
531
- Scope :: BlockScope ( m) => process_module_scope_names ( acc, db, m) ,
514
+ Scope :: BlockScope ( m) => {
515
+ m. def_map [ m. module_id ] . scope . entries ( ) . for_each ( |( name, def) | {
516
+ acc. add_per_ns ( name, def) ;
517
+ } ) ;
518
+ m. def_map [ m. module_id ] . scope . legacy_macros ( ) . for_each ( |( name, macs) | {
519
+ macs. iter ( ) . for_each ( |& mac| {
520
+ acc. add (
521
+ name,
522
+ ScopeDef :: ModuleDef ( ModuleDefId :: MacroId ( MacroId :: from ( mac) ) ) ,
523
+ ) ;
524
+ } )
525
+ } ) ;
526
+ }
532
527
Scope :: GenericParams { params, def : parent } => {
533
528
let parent = * parent;
534
529
for ( local_id, param) in params. type_or_consts . iter ( ) {
0 commit comments