@@ -16,7 +16,8 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
1616use rustc_data_structures:: steal:: Steal ;
1717use rustc_data_structures:: sync:: { DynSend , DynSync , try_par_for_each_in} ;
1818use rustc_hir:: def:: { DefKind , Res } ;
19- use rustc_hir:: def_id:: { DefId , LocalDefId , LocalModDefId } ;
19+ use rustc_hir:: def_id:: { DefId , LocalDefId , LocalDefIdMap , LocalModDefId } ;
20+ use rustc_hir:: lints:: DelayedLints ;
2021use rustc_hir:: * ;
2122use rustc_index:: IndexVec ;
2223use rustc_macros:: { Decodable , Encodable , HashStable } ;
@@ -53,6 +54,27 @@ impl<'hir> Crate<'hir> {
5354 ) -> Crate < ' hir > {
5455 Crate { owners, delayed_ids, delayed_resolver, opt_hir_hash }
5556 }
57+
58+ /// Serves as an entry point for getting `MaybeOwner`. As owner can either be in
59+ /// `owners` of `hir_crate` or it can be delayed AST owner (i.e., delegations)
60+ /// we need to firstly check in `hir_crate` and then delayed AST owners.
61+ /// This method can be invoked when not all delayed AST owners are lowered.
62+ pub fn owner ( & ' hir self , tcx : TyCtxt < ' hir > , def_id : LocalDefId ) -> & ' hir MaybeOwner < ' hir > {
63+ // Delayed LocalDefId can be in `self.owners` if there exists non-delayed LocalDefId
64+ // which is greater than delayed LocalDefId, we use IndexVec for owners,
65+ // so we will call ensure_contains_elem which will grow it.
66+ if let Some ( owner) = self . owners . get ( def_id)
67+ && ( self . delayed_ids . is_empty ( ) || !matches ! ( owner, MaybeOwner :: Phantom ) )
68+ {
69+ return owner;
70+ }
71+
72+ if self . delayed_ids . contains ( & def_id) {
73+ tcx. ensure_done ( ) . lower_delayed_owner ( def_id) ;
74+ }
75+
76+ tcx. delayed_owner ( def_id)
77+ }
5678}
5779
5880impl < Hcx : HashStableContext > HashStable < Hcx > for Crate < ' _ > {
@@ -430,33 +452,65 @@ pub struct Hashes {
430452 pub attrs_hash : Option < Fingerprint > ,
431453}
432454
433- pub fn provide ( providers : & mut Providers ) {
434- providers. hir_crate_items = map:: hir_crate_items;
435- providers. crate_hash = map:: crate_hash;
436- providers. hir_module_items = map:: hir_module_items;
437- providers. hir_attr_map =
438- |tcx, id| tcx. owner ( id. def_id ) . as_owner ( ) . map_or ( AttributeMap :: EMPTY , |o| & o. attrs ) ;
439- // Serves as an entry point for getting `MaybeOwner`. As owner can either be in
440- // `owners` of `hir_crate` or it can be delayed AST owner (i.e., delegations)
441- // we need to firstly check in `hir_crate` and then delayed AST owners.
442- // This method can be invoked when not all delayed AST owners are lowered.
443- providers. owner = |tcx, def_id| {
444- // Delayed LocalDefId can be in `self.owners` if there exists non-delayed LocalDefId
445- // which is greater than delayed LocalDefId, we use IndexVec for owners,
446- // so we will call ensure_contains_elem which will grow it.
447- let krate = tcx. hir_crate ( ( ) ) ;
448- if let Some ( owner) = krate. owners . get ( def_id)
449- && ( krate. delayed_ids . is_empty ( ) || !matches ! ( owner, MaybeOwner :: Phantom ) )
450- {
451- return * owner;
455+ #[ derive( Debug , HashStable ) ]
456+ pub struct ProjectedOwnerInfo < ' tcx > {
457+ /// Contents of the HIR.
458+ pub nodes : & ' tcx OwnerNodes < ' tcx > ,
459+
460+ /// Map from each nested owner to its parent's local id.
461+ #[ stable_hasher( ignore) ]
462+ pub parenting : & ' tcx LocalDefIdMap < ItemLocalId > ,
463+
464+ /// Map indicating what traits are in scope for places where this
465+ /// is relevant; generated by resolve.
466+ pub trait_map : & ' tcx ItemLocalMap < & ' tcx [ TraitCandidate < ' tcx > ] > ,
467+
468+ #[ stable_hasher( ignore) ]
469+ pub delayed_lints : & ' tcx DelayedLints ,
470+ }
471+
472+ #[ derive( Debug , HashStable ) ]
473+ pub enum ProjectedMaybeOwner < ' tcx > {
474+ Owner ( ProjectedOwnerInfo < ' tcx > ) ,
475+ NonOwner ( HirId ) ,
476+ }
477+
478+ impl < ' tcx > From < & ' tcx MaybeOwner < ' tcx > > for ProjectedMaybeOwner < ' tcx > {
479+ fn from ( value : & ' tcx MaybeOwner < ' tcx > ) -> Self {
480+ match value {
481+ MaybeOwner :: Owner ( o) => ProjectedMaybeOwner :: Owner ( ProjectedOwnerInfo {
482+ nodes : & o. nodes ,
483+ parenting : & o. parenting ,
484+ trait_map : & o. trait_map ,
485+ delayed_lints : & o. delayed_lints ,
486+ } ) ,
487+ MaybeOwner :: NonOwner ( hir_id) => ProjectedMaybeOwner :: NonOwner ( * hir_id) ,
488+ MaybeOwner :: Phantom => panic ! ( ) ,
452489 }
490+ }
491+ }
453492
454- if krate. delayed_ids . contains ( & def_id) {
455- tcx. ensure_done ( ) . lower_delayed_owner ( def_id) ;
493+ impl < ' tcx > ProjectedMaybeOwner < ' tcx > {
494+ pub fn as_owner ( & ' tcx self ) -> Option < & ' tcx ProjectedOwnerInfo < ' tcx > > {
495+ match self {
496+ ProjectedMaybeOwner :: Owner ( i) => Some ( i) ,
497+ ProjectedMaybeOwner :: NonOwner ( _) => None ,
456498 }
499+ }
457500
458- tcx. delayed_owner ( def_id)
501+ pub fn unwrap ( & ' tcx self ) -> & ' tcx ProjectedOwnerInfo < ' tcx > {
502+ self . as_owner ( ) . unwrap_or_else ( || panic ! ( "Not a HIR owner" ) )
503+ }
504+ }
505+
506+ pub fn provide ( providers : & mut Providers ) {
507+ providers. hir_crate_items = map:: hir_crate_items;
508+ providers. crate_hash = map:: crate_hash;
509+ providers. hir_module_items = map:: hir_module_items;
510+ providers. hir_attr_map = |tcx, id| {
511+ tcx. hir_crate ( ( ) ) . owner ( tcx, id. def_id ) . as_owner ( ) . map_or ( AttributeMap :: EMPTY , |o| & o. attrs )
459512 } ;
513+ providers. owner = |tcx, def_id| ProjectedMaybeOwner :: from ( tcx. hir_crate ( ( ) ) . owner ( tcx, def_id) ) ;
460514 providers. hir_owner_parent_q = |tcx, owner_id| tcx. hir_owner_parent_impl ( owner_id) ;
461515 providers. def_span = |tcx, def_id| tcx. hir_span ( tcx. local_def_id_to_hir_id ( def_id) ) ;
462516 providers. def_ident_span = |tcx, def_id| {
0 commit comments