@@ -98,7 +98,7 @@ struct LoweringContext<'a, 'hir: 'a> {
98
98
arena : & ' hir Arena < ' hir > ,
99
99
100
100
/// 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 > > > ,
102
102
/// Bodies inside the owner being lowered.
103
103
bodies : Vec < ( hir:: ItemLocalId , & ' hir hir:: Body < ' hir > ) > ,
104
104
/// Attributes inside the owner being lowered.
@@ -291,7 +291,8 @@ pub fn lower_crate<'a, 'hir>(
291
291
) -> & ' hir hir:: Crate < ' hir > {
292
292
let _prof_timer = sess. prof . verbose_generic_activity ( "hir_lowering" ) ;
293
293
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 ( ) ) ;
295
296
LoweringContext {
296
297
sess,
297
298
resolver,
@@ -402,19 +403,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
402
403
403
404
let hir_hash = self . compute_hir_hash ( ) ;
404
405
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
-
418
406
let krate = hir:: Crate { owners : self . owners , hir_hash } ;
419
407
self . arena . alloc ( krate)
420
408
}
@@ -427,7 +415,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
427
415
. owners
428
416
. iter_enumerated ( )
429
417
. filter_map ( |( def_id, info) | {
430
- let info = info. as_ref ( ) ?;
418
+ let info = info. as_owner ( ) ?;
431
419
let def_path_hash = definitions. def_path_hash ( def_id) ;
432
420
Some ( ( def_path_hash, info) )
433
421
} )
@@ -469,8 +457,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
469
457
self . current_hir_id_owner = current_owner;
470
458
self . item_local_id_counter = current_local_counter;
471
459
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 ) ) ;
474
462
475
463
def_id
476
464
}
@@ -483,11 +471,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
483
471
let local_id_to_def_id = local_node_ids
484
472
. iter ( )
485
473
. filter_map ( |& node_id| {
474
+ let def_id = self . resolver . opt_local_def_id ( node_id) ?;
486
475
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
+
487
483
if hir_id. local_id == hir:: ItemLocalId :: new ( 0 ) {
488
484
None
489
485
} else {
490
- let def_id = self . resolver . opt_local_def_id ( node_id) ?;
491
486
Some ( ( hir_id. local_id , def_id) )
492
487
}
493
488
} )
0 commit comments