@@ -48,7 +48,7 @@ use session::config::nightly_options;
4848use util:: common:: FN_OUTPUT_NAME ;
4949use util:: nodemap:: { DefIdMap , NodeMap } ;
5050
51- use std:: collections:: BTreeMap ;
51+ use std:: collections:: { BTreeSet , BTreeMap } ;
5252use std:: fmt:: Debug ;
5353use std:: mem;
5454use smallvec:: SmallVec ;
@@ -90,6 +90,8 @@ pub struct LoweringContext<'a> {
9090 trait_impls : BTreeMap < DefId , Vec < NodeId > > ,
9191 trait_auto_impl : BTreeMap < DefId , NodeId > ,
9292
93+ modules : BTreeMap < NodeId , hir:: ModuleItems > ,
94+
9395 is_generator : bool ,
9496
9597 catch_scopes : Vec < NodeId > ,
@@ -124,6 +126,8 @@ pub struct LoweringContext<'a> {
124126 // needs to be created for it.
125127 in_scope_lifetimes : Vec < Ident > ,
126128
129+ current_module : NodeId ,
130+
127131 type_def_lifetime_params : DefIdMap < usize > ,
128132
129133 current_hir_id_owner : Vec < ( DefIndex , u32 ) > ,
@@ -228,12 +232,14 @@ pub fn lower_crate(
228232 bodies : BTreeMap :: new ( ) ,
229233 trait_impls : BTreeMap :: new ( ) ,
230234 trait_auto_impl : BTreeMap :: new ( ) ,
235+ modules : BTreeMap :: new ( ) ,
231236 exported_macros : Vec :: new ( ) ,
232237 catch_scopes : Vec :: new ( ) ,
233238 loop_scopes : Vec :: new ( ) ,
234239 is_in_loop_condition : false ,
235240 anonymous_lifetime_mode : AnonymousLifetimeMode :: PassThrough ,
236241 type_def_lifetime_params : Default :: default ( ) ,
242+ current_module : CRATE_NODE_ID ,
237243 current_hir_id_owner : vec ! [ ( CRATE_DEF_INDEX , 0 ) ] ,
238244 item_local_id_counters : Default :: default ( ) ,
239245 node_id_to_hir_id : IndexVec :: new ( ) ,
@@ -356,6 +362,15 @@ impl<'a> LoweringContext<'a> {
356362 }
357363
358364 impl < ' lcx , ' interner > Visitor < ' lcx > for MiscCollector < ' lcx , ' interner > {
365+ fn visit_mod ( & mut self , m : & ' lcx Mod , _s : Span , _attrs : & [ Attribute ] , n : NodeId ) {
366+ self . lctx . modules . insert ( n, hir:: ModuleItems {
367+ items : BTreeSet :: new ( ) ,
368+ trait_items : BTreeSet :: new ( ) ,
369+ impl_items : BTreeSet :: new ( ) ,
370+ } ) ;
371+ visit:: walk_mod ( self , m) ;
372+ }
373+
359374 fn visit_item ( & mut self , item : & ' lcx Item ) {
360375 self . lctx . allocate_hir_id_counter ( item. id , item) ;
361376
@@ -414,11 +429,18 @@ impl<'a> LoweringContext<'a> {
414429 }
415430
416431 impl < ' lcx , ' interner > Visitor < ' lcx > for ItemLowerer < ' lcx , ' interner > {
432+ fn visit_mod ( & mut self , m : & ' lcx Mod , _s : Span , _attrs : & [ Attribute ] , n : NodeId ) {
433+ let old = self . lctx . current_module ;
434+ self . lctx . current_module = n;
435+ visit:: walk_mod ( self , m) ;
436+ self . lctx . current_module = old;
437+ }
438+
417439 fn visit_item ( & mut self , item : & ' lcx Item ) {
418440 let mut item_lowered = true ;
419441 self . lctx . with_hir_id_owner ( item. id , |lctx| {
420442 if let Some ( hir_item) = lctx. lower_item ( item) {
421- lctx. items . insert ( item. id , hir_item) ;
443+ lctx. insert_item ( item. id , hir_item) ;
422444 } else {
423445 item_lowered = false ;
424446 }
@@ -451,6 +473,7 @@ impl<'a> LoweringContext<'a> {
451473 let id = hir:: TraitItemId { node_id : item. id } ;
452474 let hir_item = lctx. lower_trait_item ( item) ;
453475 lctx. trait_items . insert ( id, hir_item) ;
476+ lctx. modules . get_mut ( & lctx. current_module ) . unwrap ( ) . trait_items . insert ( id) ;
454477 } ) ;
455478
456479 visit:: walk_trait_item ( self , item) ;
@@ -461,6 +484,7 @@ impl<'a> LoweringContext<'a> {
461484 let id = hir:: ImplItemId { node_id : item. id } ;
462485 let hir_item = lctx. lower_impl_item ( item) ;
463486 lctx. impl_items . insert ( id, hir_item) ;
487+ lctx. modules . get_mut ( & lctx. current_module ) . unwrap ( ) . impl_items . insert ( id) ;
464488 } ) ;
465489 visit:: walk_impl_item ( self , item) ;
466490 }
@@ -492,9 +516,15 @@ impl<'a> LoweringContext<'a> {
492516 body_ids,
493517 trait_impls : self . trait_impls ,
494518 trait_auto_impl : self . trait_auto_impl ,
519+ modules : self . modules ,
495520 }
496521 }
497522
523+ fn insert_item ( & mut self , id : NodeId , item : hir:: Item ) {
524+ self . items . insert ( id, item) ;
525+ self . modules . get_mut ( & self . current_module ) . unwrap ( ) . items . insert ( id) ;
526+ }
527+
498528 fn allocate_hir_id_counter < T : Debug > ( & mut self , owner : NodeId , debug : & T ) -> LoweredNodeId {
499529 if self . item_local_id_counters . insert ( owner, 0 ) . is_some ( ) {
500530 bug ! (
@@ -1370,7 +1400,7 @@ impl<'a> LoweringContext<'a> {
13701400 // Insert the item into the global list. This usually happens
13711401 // automatically for all AST items. But this existential type item
13721402 // does not actually exist in the AST.
1373- lctx. items . insert ( exist_ty_id. node_id , exist_ty_item) ;
1403+ lctx. insert_item ( exist_ty_id. node_id , exist_ty_item) ;
13741404
13751405 // `impl Trait` now just becomes `Foo<'a, 'b, ..>`.
13761406 hir:: TyKind :: Def ( hir:: ItemId { id : exist_ty_id. node_id } , lifetimes)
@@ -3026,7 +3056,7 @@ impl<'a> LoweringContext<'a> {
30263056 } ;
30273057 let vis = respan ( vis. span , vis_kind) ;
30283058
3029- this. items . insert (
3059+ this. insert_item (
30303060 new_id. node_id ,
30313061 hir:: Item {
30323062 id : new_id. node_id ,
@@ -3133,7 +3163,7 @@ impl<'a> LoweringContext<'a> {
31333163 } ;
31343164 let vis = respan ( vis. span , vis_kind) ;
31353165
3136- this. items . insert (
3166+ this. insert_item (
31373167 new_id,
31383168 hir:: Item {
31393169 id : new_id,
0 commit comments