@@ -18,6 +18,7 @@ use rustc_data_structures::sync::{DynSend, DynSync, try_par_for_each_in};
1818use rustc_hir:: def:: { DefKind , Res } ;
1919use rustc_hir:: def_id:: { DefId , LocalDefId , LocalDefIdMap , LocalModDefId } ;
2020use rustc_hir:: definitions:: PerParentDisambiguatorState ;
21+ use rustc_hir:: lints:: DelayedLints ;
2122use rustc_hir:: * ;
2223use rustc_index:: IndexVec ;
2324use rustc_macros:: { Decodable , Encodable , HashStable } ;
@@ -67,14 +68,14 @@ impl<'hir> Crate<'hir> {
6768 /// `owners` of `hir_crate` or it can be delayed AST owner (i.e., delegations)
6869 /// we need to firstly check in `hir_crate` and then delayed AST owners.
6970 /// This method can be invoked when not all delayed AST owners are lowered.
70- pub fn owner ( & self , tcx : TyCtxt < ' hir > , def_id : LocalDefId ) -> MaybeOwner < ' hir > {
71+ pub fn owner ( & ' hir self , tcx : TyCtxt < ' hir > , def_id : LocalDefId ) -> & ' hir MaybeOwner < ' hir > {
7172 // Delayed LocalDefId can be in `self.owners` if there exists non-delayed LocalDefId
7273 // which is greater than delayed LocalDefId, we use IndexVec for owners,
7374 // so we will call ensure_contains_elem which will grow it.
7475 if let Some ( owner) = self . owners . get ( def_id)
7576 && ( self . delayed_ids . is_empty ( ) || !matches ! ( owner, MaybeOwner :: Phantom ) )
7677 {
77- return * owner;
78+ return owner;
7879 }
7980
8081 if self . delayed_ids . contains ( & def_id) {
@@ -431,8 +432,7 @@ impl<'tcx> TyCtxt<'tcx> {
431432 HirId {
432433 owner : parent_owner_id,
433434 local_id : self
434- . hir_crate ( ( ) )
435- . owner ( self , parent_owner_id. def_id )
435+ . owner ( parent_owner_id. def_id )
436436 . unwrap ( )
437437 . parenting
438438 . get ( & owner_id. def_id )
@@ -461,23 +461,65 @@ pub struct Hashes {
461461 pub attrs_hash : Option < Fingerprint > ,
462462}
463463
464+ #[ derive( Debug , HashStable ) ]
465+ pub struct ProjectedOwnerInfo < ' tcx > {
466+ /// Contents of the HIR.
467+ pub nodes : & ' tcx OwnerNodes < ' tcx > ,
468+
469+ /// Map from each nested owner to its parent's local id.
470+ pub parenting : & ' tcx LocalDefIdMap < ItemLocalId > ,
471+
472+ /// Map indicating what traits are in scope for places where this
473+ /// is relevant; generated by resolve.
474+ pub trait_map : & ' tcx ItemLocalMap < & ' tcx [ TraitCandidate < ' tcx > ] > ,
475+
476+ #[ stable_hasher( ignore) ]
477+ pub delayed_lints : & ' tcx DelayedLints ,
478+ }
479+
480+ #[ derive( Debug , HashStable ) ]
481+ pub enum ProjectedMaybeOwner < ' tcx > {
482+ Owner ( ProjectedOwnerInfo < ' tcx > ) ,
483+ NonOwner ( HirId ) ,
484+ }
485+
486+ impl < ' tcx > From < & ' tcx MaybeOwner < ' tcx > > for ProjectedMaybeOwner < ' tcx > {
487+ fn from ( value : & ' tcx MaybeOwner < ' tcx > ) -> Self {
488+ match value {
489+ MaybeOwner :: Owner ( o) => ProjectedMaybeOwner :: Owner ( ProjectedOwnerInfo {
490+ nodes : & o. nodes ,
491+ parenting : & o. parenting ,
492+ trait_map : & o. trait_map ,
493+ delayed_lints : & o. delayed_lints ,
494+ } ) ,
495+ MaybeOwner :: NonOwner ( hir_id) => ProjectedMaybeOwner :: NonOwner ( * hir_id) ,
496+ MaybeOwner :: Phantom => panic ! ( ) ,
497+ }
498+ }
499+ }
500+
501+ impl < ' tcx > ProjectedMaybeOwner < ' tcx > {
502+ pub fn as_owner ( & ' tcx self ) -> Option < & ' tcx ProjectedOwnerInfo < ' tcx > > {
503+ match self {
504+ ProjectedMaybeOwner :: Owner ( i) => Some ( i) ,
505+ ProjectedMaybeOwner :: NonOwner ( _) => None ,
506+ }
507+ }
508+
509+ pub fn unwrap ( & ' tcx self ) -> & ' tcx ProjectedOwnerInfo < ' tcx > {
510+ self . as_owner ( ) . unwrap_or_else ( || panic ! ( "Not a HIR owner" ) )
511+ }
512+ }
513+
464514pub fn provide ( providers : & mut Providers ) {
465515 providers. hir_crate_items = map:: hir_crate_items;
466516 providers. crate_hash = map:: crate_hash;
467517 providers. hir_module_items = map:: hir_module_items;
468- providers. local_def_id_to_hir_id = |tcx, def_id| match tcx. hir_crate ( ( ) ) . owner ( tcx, def_id) {
469- MaybeOwner :: Owner ( _) => HirId :: make_owner ( def_id) ,
470- MaybeOwner :: NonOwner ( hir_id) => hir_id,
471- MaybeOwner :: Phantom => bug ! ( "No HirId for {:?}" , def_id) ,
472- } ;
473- providers. opt_hir_owner_nodes =
474- |tcx, id| tcx. hir_crate ( ( ) ) . owner ( tcx, id) . as_owner ( ) . map ( |i| & i. nodes ) ;
475- providers. hir_owner_parent_q = |tcx, owner_id| tcx. hir_owner_parent_impl ( owner_id) ;
476518 providers. hir_attr_map = |tcx, id| {
477519 tcx. hir_crate ( ( ) ) . owner ( tcx, id. def_id ) . as_owner ( ) . map_or ( AttributeMap :: EMPTY , |o| & o. attrs )
478520 } ;
479- providers. opt_ast_lowering_delayed_lints =
480- |tcx, id | tcx. hir_crate ( ( ) ) . owner ( tcx , id . def_id ) . as_owner ( ) . map ( |o| & o . delayed_lints ) ;
521+ providers. owner = |tcx , def_id| ProjectedMaybeOwner :: from ( tcx . hir_crate ( ( ) ) . owner ( tcx , def_id ) ) ;
522+ providers . hir_owner_parent_q = |tcx, owner_id | tcx. hir_owner_parent_impl ( owner_id ) ;
481523 providers. def_span = |tcx, def_id| tcx. hir_span ( tcx. local_def_id_to_hir_id ( def_id) ) ;
482524 providers. def_ident_span = |tcx, def_id| {
483525 let hir_id = tcx. local_def_id_to_hir_id ( def_id) ;
@@ -517,7 +559,4 @@ pub fn provide(providers: &mut Providers) {
517559 |tcx, trait_id| tcx. resolutions ( ( ) ) . trait_impls . get ( & trait_id) . map_or ( & [ ] , |xs| & xs[ ..] ) ;
518560 providers. expn_that_defined =
519561 |tcx, id| tcx. resolutions ( ( ) ) . expn_that_defined . get ( & id) . copied ( ) . unwrap_or ( ExpnId :: root ( ) ) ;
520- providers. in_scope_traits_map = |tcx, id| {
521- tcx. hir_crate ( ( ) ) . owner ( tcx, id. def_id ) . as_owner ( ) . map ( |owner_info| & owner_info. trait_map )
522- } ;
523562}
0 commit comments