@@ -98,7 +98,7 @@ struct LoweringContext<'a, 'hir: 'a> {
9898 arena : & ' hir Arena < ' hir > ,
9999
100100 /// The items being lowered are collected here.
101- owners : IndexVec < LocalDefId , Option < hir:: OwnerInfo < ' hir > > > ,
101+ owners : IndexVec < LocalDefId , hir :: MaybeOwner < & ' hir hir:: OwnerInfo < ' hir > > > ,
102102 /// Bodies inside the owner being lowered.
103103 bodies : Vec < ( hir:: ItemLocalId , & ' hir hir:: Body < ' hir > ) > ,
104104 /// Attributes inside the owner being lowered.
@@ -291,7 +291,8 @@ pub fn lower_crate<'a, 'hir>(
291291) -> & ' hir hir:: Crate < ' hir > {
292292 let _prof_timer = sess. prof . verbose_generic_activity ( "hir_lowering" ) ;
293293
294- let owners = IndexVec :: from_fn_n ( |_| None , resolver. definitions ( ) . def_index_count ( ) ) ;
294+ let owners =
295+ IndexVec :: from_fn_n ( |_| hir:: MaybeOwner :: Phantom , resolver. definitions ( ) . def_index_count ( ) ) ;
295296 LoweringContext {
296297 sess,
297298 resolver,
@@ -402,19 +403,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
402403
403404 let hir_hash = self . compute_hir_hash ( ) ;
404405
405- let mut def_id_to_hir_id = IndexVec :: default ( ) ;
406-
407- for ( node_id, hir_id) in self . node_id_to_hir_id . into_iter_enumerated ( ) {
408- if let Some ( def_id) = self . resolver . opt_local_def_id ( node_id) {
409- if def_id_to_hir_id. len ( ) <= def_id. index ( ) {
410- def_id_to_hir_id. resize ( def_id. index ( ) + 1 , None ) ;
411- }
412- def_id_to_hir_id[ def_id] = hir_id;
413- }
414- }
415-
416- self . resolver . definitions ( ) . init_def_id_to_hir_id_mapping ( def_id_to_hir_id) ;
417-
418406 let krate = hir:: Crate { owners : self . owners , hir_hash } ;
419407 self . arena . alloc ( krate)
420408 }
@@ -427,7 +415,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
427415 . owners
428416 . iter_enumerated ( )
429417 . filter_map ( |( def_id, info) | {
430- let info = info. as_ref ( ) ?;
418+ let info = info. as_owner ( ) ?;
431419 let def_path_hash = definitions. def_path_hash ( def_id) ;
432420 Some ( ( def_path_hash, info) )
433421 } )
@@ -469,8 +457,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
469457 self . current_hir_id_owner = current_owner;
470458 self . item_local_id_counter = current_local_counter;
471459
472- let _old = self . owners . insert ( def_id, info ) ;
473- debug_assert ! ( _old . is_none ( ) ) ;
460+ self . owners . ensure_contains_elem ( def_id, || hir :: MaybeOwner :: Phantom ) ;
461+ self . owners [ def_id ] = hir :: MaybeOwner :: Owner ( self . arena . alloc ( info ) ) ;
474462
475463 def_id
476464 }
@@ -483,11 +471,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
483471 let local_id_to_def_id = local_node_ids
484472 . iter ( )
485473 . filter_map ( |& node_id| {
474+ let def_id = self . resolver . opt_local_def_id ( node_id) ?;
486475 let hir_id = self . node_id_to_hir_id [ node_id] ?;
476+
477+ self . owners . ensure_contains_elem ( def_id, || hir:: MaybeOwner :: Phantom ) ;
478+ if let o @ hir:: MaybeOwner :: Phantom = & mut self . owners [ def_id] {
479+ // Do not override a `MaybeOwner::Owner` that may already here.
480+ * o = hir:: MaybeOwner :: NonOwner ( hir_id) ;
481+ }
482+
487483 if hir_id. local_id == hir:: ItemLocalId :: new ( 0 ) {
488484 None
489485 } else {
490- let def_id = self . resolver . opt_local_def_id ( node_id) ?;
491486 Some ( ( hir_id. local_id , def_id) )
492487 }
493488 } )
0 commit comments