@@ -830,6 +830,7 @@ pub struct ModuleS<'a> {
830
830
// entry block for `f`.
831
831
module_children : RefCell < NodeMap < Module < ' a > > > ,
832
832
833
+ prelude : RefCell < Option < Module < ' a > > > ,
833
834
shadowed_traits : RefCell < Vec < & ' a NameBinding < ' a > > > ,
834
835
835
836
glob_importers : RefCell < Vec < ( Module < ' a > , & ' a ImportDirective ) > > ,
@@ -865,6 +866,7 @@ impl<'a> ModuleS<'a> {
865
866
resolutions : RefCell :: new ( HashMap :: new ( ) ) ,
866
867
unresolved_imports : RefCell :: new ( Vec :: new ( ) ) ,
867
868
module_children : RefCell :: new ( NodeMap ( ) ) ,
869
+ prelude : RefCell :: new ( None ) ,
868
870
shadowed_traits : RefCell :: new ( Vec :: new ( ) ) ,
869
871
glob_importers : RefCell :: new ( Vec :: new ( ) ) ,
870
872
resolved_globs : RefCell :: new ( ( Vec :: new ( ) , Vec :: new ( ) ) ) ,
@@ -3403,34 +3405,36 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
3403
3405
None => { } // Nothing to do.
3404
3406
}
3405
3407
3406
- // Look for trait children.
3407
- build_reduced_graph:: populate_module_if_necessary ( self , & search_module) ;
3408
+ // Look for shadowed traits.
3409
+ for binding in search_module. shadowed_traits . borrow ( ) . iter ( ) {
3410
+ let did = binding. def ( ) . unwrap ( ) . def_id ( ) ;
3411
+ if self . trait_item_map . contains_key ( & ( name, did) ) {
3412
+ add_trait_info ( & mut found_traits, did, name) ;
3413
+ let trait_name = self . get_trait_name ( did) ;
3414
+ self . record_use ( trait_name, TypeNS , binding) ;
3415
+ }
3416
+ }
3408
3417
3409
- search_module. for_each_child ( |_, ns, name_binding| {
3418
+ // Look for trait children.
3419
+ let mut search_in_module = |module : Module < ' a > | module. for_each_child ( |_, ns, binding| {
3410
3420
if ns != TypeNS { return }
3411
- let trait_def_id = match name_binding . def ( ) {
3421
+ let trait_def_id = match binding . def ( ) {
3412
3422
Some ( Def :: Trait ( trait_def_id) ) => trait_def_id,
3413
3423
Some ( ..) | None => return ,
3414
3424
} ;
3415
3425
if self . trait_item_map . contains_key ( & ( name, trait_def_id) ) {
3416
3426
add_trait_info ( & mut found_traits, trait_def_id, name) ;
3417
3427
let trait_name = self . get_trait_name ( trait_def_id) ;
3418
- self . record_use ( trait_name, TypeNS , name_binding) ;
3419
- }
3420
- } ) ;
3421
-
3422
- // Look for shadowed traits.
3423
- for binding in search_module. shadowed_traits . borrow ( ) . iter ( ) {
3424
- let did = binding. def ( ) . unwrap ( ) . def_id ( ) ;
3425
- if self . trait_item_map . contains_key ( & ( name, did) ) {
3426
- add_trait_info ( & mut found_traits, did, name) ;
3427
- let trait_name = self . get_trait_name ( did) ;
3428
3428
self . record_use ( trait_name, TypeNS , binding) ;
3429
3429
}
3430
- }
3430
+ } ) ;
3431
+ search_in_module ( search_module) ;
3431
3432
3432
3433
match search_module. parent_link {
3433
- NoParentLink | ModuleParentLink ( ..) => break ,
3434
+ NoParentLink | ModuleParentLink ( ..) => {
3435
+ search_module. prelude . borrow ( ) . map ( search_in_module) ;
3436
+ break ;
3437
+ }
3434
3438
BlockParentLink ( parent_module, _) => {
3435
3439
search_module = parent_module;
3436
3440
}
0 commit comments