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
} ;
61
62
use rustc_index:: { Idx , IndexSlice , IndexVec } ;
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 } ;
@@ -152,7 +153,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
152
153
Self {
153
154
// Pseudo-globals.
154
155
tcx,
155
- resolver : PerOwnerResolver { general : resolver } ,
156
+ resolver : PerOwnerResolver {
157
+ general : resolver,
158
+ item : PerOwnerResolverData :: new ( DUMMY_NODE_ID ) ,
159
+ } ,
156
160
arena : tcx. hir_arena ,
157
161
158
162
// HirId handling.
@@ -202,6 +206,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
202
206
203
207
pub ( crate ) struct PerOwnerResolver < ' a > {
204
208
pub general : & ' a mut ResolverAstLowering ,
209
+ pub item : PerOwnerResolverData ,
210
+ }
211
+
212
+ impl < ' a > std:: ops:: Deref for PerOwnerResolver < ' a > {
213
+ type Target = PerOwnerResolverData ;
214
+
215
+ fn deref ( & self ) -> & Self :: Target {
216
+ & self . item
217
+ }
205
218
}
206
219
207
220
impl PerOwnerResolver < ' _ > {
@@ -369,17 +382,22 @@ enum AstOwner<'a> {
369
382
}
370
383
371
384
fn index_crate < ' a > (
372
- node_id_to_def_id : & NodeMap < LocalDefId > ,
385
+ owners : & NodeMap < PerOwnerResolverData > ,
373
386
krate : & ' a Crate ,
374
387
) -> IndexVec < LocalDefId , AstOwner < ' a > > {
375
- let mut indexer = Indexer { node_id_to_def_id, index : IndexVec :: new ( ) } ;
388
+ let mut indexer = Indexer {
389
+ owners,
390
+ node_id_to_def_id : & owners[ & CRATE_NODE_ID ] . node_id_to_def_id ,
391
+ index : IndexVec :: new ( ) ,
392
+ } ;
376
393
* indexer. index . ensure_contains_elem ( CRATE_DEF_ID , || AstOwner :: NonOwner ) =
377
394
AstOwner :: Crate ( krate) ;
378
395
visit:: walk_crate ( & mut indexer, krate) ;
379
396
return indexer. index ;
380
397
381
398
struct Indexer < ' s , ' a > {
382
399
node_id_to_def_id : & ' s NodeMap < LocalDefId > ,
400
+ owners : & ' s NodeMap < PerOwnerResolverData > ,
383
401
index : IndexVec < LocalDefId , AstOwner < ' a > > ,
384
402
}
385
403
@@ -390,23 +408,38 @@ fn index_crate<'a>(
390
408
}
391
409
392
410
fn visit_item ( & mut self , item : & ' a ast:: Item ) {
411
+ let old = std:: mem:: replace (
412
+ & mut self . node_id_to_def_id ,
413
+ & self . owners [ & item. id ] . node_id_to_def_id ,
414
+ ) ;
393
415
let def_id = self . node_id_to_def_id [ & item. id ] ;
394
416
* self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) = AstOwner :: Item ( item) ;
395
- visit:: walk_item ( self , item)
417
+ visit:: walk_item ( self , item) ;
418
+ self . node_id_to_def_id = old;
396
419
}
397
420
398
421
fn visit_assoc_item ( & mut self , item : & ' a ast:: AssocItem , ctxt : visit:: AssocCtxt ) {
422
+ let old = std:: mem:: replace (
423
+ & mut self . node_id_to_def_id ,
424
+ & self . owners [ & item. id ] . node_id_to_def_id ,
425
+ ) ;
399
426
let def_id = self . node_id_to_def_id [ & item. id ] ;
400
427
* self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
401
428
AstOwner :: AssocItem ( item, ctxt) ;
402
429
visit:: walk_assoc_item ( self , item, ctxt) ;
430
+ self . node_id_to_def_id = old;
403
431
}
404
432
405
433
fn visit_foreign_item ( & mut self , item : & ' a ast:: ForeignItem ) {
434
+ let old = std:: mem:: replace (
435
+ & mut self . node_id_to_def_id ,
436
+ & self . owners [ & item. id ] . node_id_to_def_id ,
437
+ ) ;
406
438
let def_id = self . node_id_to_def_id [ & item. id ] ;
407
439
* self . index . ensure_contains_elem ( def_id, || AstOwner :: NonOwner ) =
408
440
AstOwner :: ForeignItem ( item) ;
409
441
visit:: walk_item ( self , item) ;
442
+ self . node_id_to_def_id = old;
410
443
}
411
444
}
412
445
}
@@ -443,7 +476,7 @@ pub fn lower_to_hir(tcx: TyCtxt<'_>, (): ()) -> hir::Crate<'_> {
443
476
tcx. ensure_done ( ) . get_lang_items ( ( ) ) ;
444
477
let ( mut resolver, krate) = tcx. resolver_for_lowering ( ) . steal ( ) ;
445
478
446
- let ast_index = index_crate ( & resolver. node_id_to_def_id , & krate) ;
479
+ let ast_index = index_crate ( & resolver. owners , & krate) ;
447
480
let mut owners = IndexVec :: from_fn_n (
448
481
|_| hir:: MaybeOwner :: Phantom ,
449
482
tcx. definitions_untracked ( ) . def_index_count ( ) ,
@@ -518,7 +551,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
518
551
self . tcx . at ( span) . create_def ( self . current_hir_id_owner . def_id , name, def_kind) . def_id ( ) ;
519
552
520
553
debug ! ( "create_def: def_id_to_node_id[{:?}] <-> {:?}" , def_id, node_id) ;
521
- self . resolver . general . node_id_to_def_id . insert ( node_id, def_id) ;
554
+ self . resolver . item . node_id_to_def_id . insert ( node_id, def_id) ;
522
555
523
556
def_id
524
557
}
@@ -533,16 +566,29 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
533
566
/// Given the id of some node in the AST, finds the `LocalDefId` associated with it by the name
534
567
/// resolver (if any).
535
568
fn opt_local_def_id ( & self , node : NodeId ) -> Option < LocalDefId > {
536
- self . resolver . general . node_id_to_def_id . get ( & node) . copied ( )
569
+ self . resolver . node_id_to_def_id . get ( & node) . copied ( )
537
570
}
538
571
539
572
fn local_def_id ( & self , node : NodeId ) -> LocalDefId {
540
- self . opt_local_def_id ( node) . unwrap_or_else ( || panic ! ( "no entry for node id: `{node:?}`" ) )
573
+ self . opt_local_def_id ( node) . unwrap_or_else ( || {
574
+ self . resolver . general . owners . items ( ) . any ( |( id, items) | {
575
+ items. node_id_to_def_id . items ( ) . any ( |( node_id, def_id) | {
576
+ if * node_id == node {
577
+ panic ! (
578
+ "{def_id:?} ({node_id}) was found in {:?} ({id})" ,
579
+ items. node_id_to_def_id. get( id) ,
580
+ )
581
+ }
582
+ false
583
+ } )
584
+ } ) ;
585
+ panic ! ( "no entry for node id: `{node:?}`" ) ;
586
+ } )
541
587
}
542
588
543
589
/// Given the id of an owner node in the AST, returns the corresponding `OwnerId`.
544
590
fn owner_id ( & self , node : NodeId ) -> hir:: OwnerId {
545
- hir:: OwnerId { def_id : self . local_def_id ( node) }
591
+ hir:: OwnerId { def_id : self . resolver . general . owners [ & node] . node_id_to_def_id [ & node ] }
546
592
}
547
593
548
594
/// Freshen the `LoweringContext` and ready it to lower a nested item.
@@ -561,6 +607,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
561
607
let current_attrs = std:: mem:: take ( & mut self . attrs ) ;
562
608
let current_bodies = std:: mem:: take ( & mut self . bodies ) ;
563
609
let current_define_opaque = std:: mem:: take ( & mut self . define_opaque ) ;
610
+ let current_ast_owner = std:: mem:: replace (
611
+ & mut self . resolver . item ,
612
+ self . resolver . general . owners . remove ( & owner) . unwrap ( ) ,
613
+ ) ;
564
614
let current_ident_and_label_to_local_id =
565
615
std:: mem:: take ( & mut self . ident_and_label_to_local_id ) ;
566
616
@@ -606,6 +656,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
606
656
self . impl_trait_defs = current_impl_trait_defs;
607
657
self . impl_trait_bounds = current_impl_trait_bounds;
608
658
659
+ let _prev_owner_data = std:: mem:: replace ( & mut self . resolver . item , current_ast_owner) ;
660
+ #[ cfg( debug_assertions) ]
661
+ self . resolver . general . owners . insert ( owner, _prev_owner_data) ;
662
+
609
663
debug_assert ! ( !self . children. iter( ) . any( |( id, _) | id == & owner_id. def_id) ) ;
610
664
self . children . push ( ( owner_id. def_id , hir:: MaybeOwner :: Owner ( info) ) ) ;
611
665
}
0 commit comments