36
36
#![ doc( rust_logo) ]
37
37
#![ feature( assert_matches) ]
38
38
#![ feature( box_patterns) ]
39
+ #![ feature( closure_track_caller) ]
39
40
#![ feature( exact_size_is_empty) ]
40
41
#![ feature( if_let_guard) ]
41
42
#![ feature( let_chains) ]
@@ -60,7 +61,7 @@ use rustc_hir::{
60
61
use rustc_index:: { Idx , IndexSlice , IndexVec } ;
61
62
use rustc_macros:: extension;
62
63
use rustc_middle:: span_bug;
63
- use rustc_middle:: ty:: { ResolverAstLowering , TyCtxt } ;
64
+ use rustc_middle:: ty:: { PerOwnerResolverData , ResolverAstLowering , TyCtxt } ;
64
65
use rustc_session:: parse:: { add_feature_diagnostics, feature_err} ;
65
66
use rustc_span:: symbol:: { Ident , Symbol , kw, sym} ;
66
67
use rustc_span:: { DUMMY_SP , DesugaringKind , Span } ;
@@ -124,6 +125,7 @@ struct LoweringContext<'a, 'hir> {
124
125
is_in_dyn_type : bool ,
125
126
126
127
current_hir_id_owner : hir:: OwnerId ,
128
+ current_ast_id_owner : NodeId ,
127
129
item_local_id_counter : hir:: ItemLocalId ,
128
130
trait_map : ItemLocalMap < Box < [ TraitCandidate ] > > ,
129
131
@@ -162,6 +164,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
162
164
children : Vec :: default ( ) ,
163
165
contract_ensures : None ,
164
166
current_hir_id_owner : hir:: CRATE_OWNER_ID ,
167
+ current_ast_id_owner : CRATE_NODE_ID ,
165
168
item_local_id_counter : hir:: ItemLocalId :: ZERO ,
166
169
ident_and_label_to_local_id : Default :: default ( ) ,
167
170
#[ cfg( debug_assertions) ]
@@ -253,7 +256,7 @@ impl ResolverAstLowering {
253
256
///
254
257
/// The extra lifetimes that appear from the parenthesized `Fn`-trait desugaring
255
258
/// should appear at the enclosing `PolyTraitRef`.
256
- fn extra_lifetime_params ( & mut self , id : NodeId ) -> Vec < ( Ident , NodeId , LifetimeRes ) > {
259
+ fn extra_lifetime_params ( & self , id : NodeId ) -> Vec < ( Ident , NodeId , LifetimeRes ) > {
257
260
self . extra_lifetime_params_map . get ( & id) . cloned ( ) . unwrap_or_default ( )
258
261
}
259
262
}
@@ -364,17 +367,22 @@ enum AstOwner<'a> {
364
367
}
365
368
366
369
fn index_crate < ' a > (
367
- node_id_to_def_id : & NodeMap < LocalDefId > ,
370
+ owners : & NodeMap < PerOwnerResolverData > ,
368
371
krate : & ' a Crate ,
369
372
) -> IndexVec < LocalDefId , AstOwner < ' a > > {
370
- let mut indexer = Indexer { node_id_to_def_id, index : IndexVec :: new ( ) } ;
373
+ let mut indexer = Indexer {
374
+ owners,
375
+ node_id_to_def_id : & owners[ & CRATE_NODE_ID ] . node_id_to_def_id ,
376
+ index : IndexVec :: new ( ) ,
377
+ } ;
371
378
* indexer. index . ensure_contains_elem ( CRATE_DEF_ID , || AstOwner :: NonOwner ) =
372
379
AstOwner :: Crate ( krate) ;
373
380
visit:: walk_crate ( & mut indexer, krate) ;
374
381
return indexer. index ;
375
382
376
383
struct Indexer < ' s , ' a > {
377
384
node_id_to_def_id : & ' s NodeMap < LocalDefId > ,
385
+ owners : & ' s NodeMap < PerOwnerResolverData > ,
378
386
index : IndexVec < LocalDefId , AstOwner < ' a > > ,
379
387
}
380
388
@@ -385,23 +393,38 @@ fn index_crate<'a>(
385
393
}
386
394
387
395
fn visit_item ( & mut self , item : & ' a ast:: Item ) {
396
+ let old = std:: mem:: replace (
397
+ & mut self . node_id_to_def_id ,
398
+ & self . owners [ & item. id ] . node_id_to_def_id ,
399
+ ) ;
388
400
let def_id = self . node_id_to_def_id [ & item. id ] ;
389
401
* self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) = AstOwner :: Item ( item) ;
390
- visit:: walk_item ( self , item)
402
+ visit:: walk_item ( self , item) ;
403
+ self . node_id_to_def_id = old;
391
404
}
392
405
393
406
fn visit_assoc_item ( & mut self , item : & ' a ast:: AssocItem , ctxt : visit:: AssocCtxt ) {
407
+ let old = std:: mem:: replace (
408
+ & mut self . node_id_to_def_id ,
409
+ & self . owners [ & item. id ] . node_id_to_def_id ,
410
+ ) ;
394
411
let def_id = self . node_id_to_def_id [ & item. id ] ;
395
412
* self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
396
413
AstOwner :: AssocItem ( item, ctxt) ;
397
414
visit:: walk_assoc_item ( self , item, ctxt) ;
415
+ self . node_id_to_def_id = old;
398
416
}
399
417
400
418
fn visit_foreign_item ( & mut self , item : & ' a ast:: ForeignItem ) {
419
+ let old = std:: mem:: replace (
420
+ & mut self . node_id_to_def_id ,
421
+ & self . owners [ & item. id ] . node_id_to_def_id ,
422
+ ) ;
401
423
let def_id = self . node_id_to_def_id [ & item. id ] ;
402
424
* self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
403
425
AstOwner :: ForeignItem ( item) ;
404
426
visit:: walk_item ( self , item) ;
427
+ self . node_id_to_def_id = old;
405
428
}
406
429
}
407
430
}
@@ -438,7 +461,7 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
438
461
tcx. ensure_done ( ) . get_lang_items ( ( ) ) ;
439
462
let ( mut resolver, krate) = tcx. resolver_for_lowering ( ) . steal ( ) ;
440
463
441
- let ast_index = index_crate ( & resolver. node_id_to_def_id , & krate) ;
464
+ let ast_index = index_crate ( & resolver. owners , & krate) ;
442
465
let mut owners = IndexVec :: from_fn_n (
443
466
|_| hir:: MaybeOwner :: Phantom ,
444
467
tcx. definitions_untracked ( ) . def_index_count ( ) ,
@@ -494,7 +517,6 @@ enum GenericArgsMode {
494
517
impl < ' a , ' hir > LoweringContext < ' a , ' hir > {
495
518
fn create_def (
496
519
& mut self ,
497
- parent : LocalDefId ,
498
520
node_id : ast:: NodeId ,
499
521
name : Option < Symbol > ,
500
522
def_kind : DefKind ,
@@ -509,10 +531,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
509
531
self . tcx. hir_def_key( self . local_def_id( node_id) ) ,
510
532
) ;
511
533
512
- let def_id = self . tcx . at ( span) . create_def ( parent, name, def_kind) . def_id ( ) ;
534
+ let def_id =
535
+ self . tcx . at ( span) . create_def ( self . current_hir_id_owner . def_id , name, def_kind) . def_id ( ) ;
513
536
514
537
debug ! ( "create_def: def_id_to_node_id[{:?}] <-> {:?}" , def_id, node_id) ;
515
- self . resolver . node_id_to_def_id . insert ( node_id, def_id) ;
538
+ self . resolver
539
+ . owners
540
+ . get_mut ( & self . current_ast_id_owner )
541
+ . unwrap ( )
542
+ . node_id_to_def_id
543
+ . insert ( node_id, def_id) ;
516
544
517
545
def_id
518
546
}
@@ -527,16 +555,31 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
527
555
/// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
528
556
/// resolver (if any).
529
557
fn opt_local_def_id ( & self , node : NodeId ) -> Option < LocalDefId > {
530
- self . resolver . node_id_to_def_id . get ( & node) . copied ( )
558
+ self . resolver . owners [ & self . current_ast_id_owner ] . node_id_to_def_id . get ( & node) . copied ( )
531
559
}
532
560
533
561
fn local_def_id ( & self , node : NodeId ) -> LocalDefId {
534
- self . opt_local_def_id ( node) . unwrap_or_else ( || panic ! ( "no entry for node id: `{node:?}`" ) )
562
+ self . opt_local_def_id ( node) . unwrap_or_else ( || {
563
+ self . resolver . owners . items ( ) . any ( |( id, items) | {
564
+ items. node_id_to_def_id . items ( ) . any ( |( node_id, def_id) | {
565
+ if * node_id == node {
566
+ panic ! (
567
+ "{def_id:?} ({node_id}) was found in {:?} ({id}) instead of in {:?} ({})" ,
568
+ items. node_id_to_def_id. get( id) ,
569
+ self . resolver. owners[ & self . current_ast_id_owner] . node_id_to_def_id[ & self . current_ast_id_owner] ,
570
+ self . current_ast_id_owner,
571
+ )
572
+ }
573
+ false
574
+ } )
575
+ } ) ;
576
+ panic ! ( "no entry for node id: `{node:?}`" ) ;
577
+ } )
535
578
}
536
579
537
580
/// Given the id of an owner node in the AST, returns the corresponding `OwnerId`.
538
581
fn owner_id ( & self , node : NodeId ) -> hir:: OwnerId {
539
- hir:: OwnerId { def_id : self . local_def_id ( node) }
582
+ hir:: OwnerId { def_id : self . resolver . owners [ & node] . node_id_to_def_id [ & node ] }
540
583
}
541
584
542
585
/// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -555,6 +598,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
555
598
let current_attrs = std:: mem:: take ( & mut self . attrs ) ;
556
599
let current_bodies = std:: mem:: take ( & mut self . bodies ) ;
557
600
let current_define_opaque = std:: mem:: take ( & mut self . define_opaque ) ;
601
+ let current_ast_owner = std:: mem:: replace ( & mut self . current_ast_id_owner , owner) ;
558
602
let current_ident_and_label_to_local_id =
559
603
std:: mem:: take ( & mut self . ident_and_label_to_local_id ) ;
560
604
@@ -599,6 +643,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
599
643
self . item_local_id_counter = current_local_counter;
600
644
self . impl_trait_defs = current_impl_trait_defs;
601
645
self . impl_trait_bounds = current_impl_trait_bounds;
646
+ self . current_ast_id_owner = current_ast_owner;
602
647
603
648
debug_assert ! ( !self . children. iter( ) . any( |( id, _) | id == & owner_id. def_id) ) ;
604
649
self . children . push ( ( owner_id. def_id , hir:: MaybeOwner :: Owner ( info) ) ) ;
@@ -781,7 +826,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
781
826
LifetimeRes :: Fresh { param, kind, .. } => {
782
827
// Late resolution delegates to us the creation of the `LocalDefId`.
783
828
let _def_id = self . create_def (
784
- self . current_hir_id_owner . def_id ,
785
829
param,
786
830
Some ( kw:: UnderscoreLifetime ) ,
787
831
DefKind :: LifetimeParam ,
@@ -2069,15 +2113,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
2069
2113
} else {
2070
2114
// Construct an AnonConst where the expr is the "ty"'s path.
2071
2115
2072
- let parent_def_id = self . current_hir_id_owner . def_id ;
2073
2116
let node_id = self . next_node_id ( ) ;
2074
2117
let span = self . lower_span ( span) ;
2075
2118
2076
2119
// Add a definition for the in-band const def.
2077
2120
// We're lowering a const argument that was originally thought to be a type argument,
2078
2121
// so the def collector didn't create the def ahead of time. That's why we have to do
2079
2122
// it here.
2080
- let def_id = self . create_def ( parent_def_id , node_id, None , DefKind :: AnonConst , span) ;
2123
+ let def_id = self . create_def ( node_id, None , DefKind :: AnonConst , span) ;
2081
2124
let hir_id = self . lower_node_id ( node_id) ;
2082
2125
2083
2126
let path_expr = Expr {
0 commit comments