@@ -368,34 +368,43 @@ impl Resolver {
368368 for scope in self . scopes ( ) {
369369 scope. process_names ( & mut res, db) ;
370370 }
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+ }
372399 res. map
373400 }
374401
375402 pub fn traits_in_scope ( & self , db : & dyn DefDatabase ) -> FxHashSet < TraitId > {
376403 let mut traits = FxHashSet :: default ( ) ;
377404
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-
396405 for scope in self . scopes ( ) {
397406 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 ( ) ) ,
399408 & Scope :: ImplDefScope ( impl_) => {
400409 if let Some ( target_trait) = & db. impl_data ( impl_) . target_trait {
401410 if let Some ( TypeNs :: TraitId ( trait_) ) =
@@ -409,7 +418,13 @@ impl Resolver {
409418 }
410419 }
411420
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 ( ) ) ;
413428 traits
414429 }
415430
@@ -493,42 +508,22 @@ pub enum ScopeDef {
493508 Label ( LabelId ) ,
494509}
495510
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-
528511impl Scope {
529512 fn process_names ( & self , acc : & mut ScopeNames , db : & dyn DefDatabase ) {
530513 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+ }
532527 Scope :: GenericParams { params, def : parent } => {
533528 let parent = * parent;
534529 for ( local_id, param) in params. type_or_consts . iter ( ) {
0 commit comments