@@ -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 } ;
@@ -62,6 +63,27 @@ impl<'hir> Crate<'hir> {
6263 ) -> Crate < ' hir > {
6364 Crate { owners, delayed_ids, delayed_resolver, opt_hir_hash }
6465 }
66+
67+ /// Serves as an entry point for getting `MaybeOwner`. As owner can either be in
68+ /// `owners` of `hir_crate` or it can be delayed AST owner (i.e., delegations)
69+ /// we need to firstly check in `hir_crate` and then delayed AST owners.
70+ /// This method can be invoked when not all delayed AST owners are lowered.
71+ pub fn owner ( & ' hir self , tcx : TyCtxt < ' hir > , def_id : LocalDefId ) -> & ' hir MaybeOwner < ' hir > {
72+ // Delayed LocalDefId can be in `self.owners` if there exists non-delayed LocalDefId
73+ // which is greater than delayed LocalDefId, we use IndexVec for owners,
74+ // so we will call ensure_contains_elem which will grow it.
75+ if let Some ( owner) = self . owners . get ( def_id)
76+ && ( self . delayed_ids . is_empty ( ) || !matches ! ( owner, MaybeOwner :: Phantom ) )
77+ {
78+ return owner;
79+ }
80+
81+ if self . delayed_ids . contains ( & def_id) {
82+ tcx. ensure_done ( ) . lower_delayed_owner ( def_id) ;
83+ }
84+
85+ tcx. delayed_owner ( def_id)
86+ }
6587}
6688
6789impl < Hcx : HashStableContext > HashStable < Hcx > for Crate < ' _ > {
@@ -439,33 +461,65 @@ pub struct Hashes {
439461 pub attrs_hash : Option < Fingerprint > ,
440462}
441463
442- pub fn provide ( providers : & mut Providers ) {
443- providers. hir_crate_items = map:: hir_crate_items;
444- providers. crate_hash = map:: crate_hash;
445- providers. hir_module_items = map:: hir_module_items;
446- providers. hir_attr_map =
447- |tcx, id| tcx. owner ( id. def_id ) . as_owner ( ) . map_or ( AttributeMap :: EMPTY , |o| & o. attrs ) ;
448- // Serves as an entry point for getting `MaybeOwner`. As owner can either be in
449- // `owners` of `hir_crate` or it can be delayed AST owner (i.e., delegations)
450- // we need to firstly check in `hir_crate` and then delayed AST owners.
451- // This method can be invoked when not all delayed AST owners are lowered.
452- providers. owner = |tcx, def_id| {
453- // Delayed LocalDefId can be in `self.owners` if there exists non-delayed LocalDefId
454- // which is greater than delayed LocalDefId, we use IndexVec for owners,
455- // so we will call ensure_contains_elem which will grow it.
456- let krate = tcx. hir_crate ( ( ) ) ;
457- if let Some ( owner) = krate. owners . get ( def_id)
458- && ( krate. delayed_ids . is_empty ( ) || !matches ! ( owner, MaybeOwner :: Phantom ) )
459- {
460- return * owner;
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+ #[ stable_hasher( ignore) ]
471+ pub parenting : & ' tcx LocalDefIdMap < ItemLocalId > ,
472+
473+ /// Map indicating what traits are in scope for places where this
474+ /// is relevant; generated by resolve.
475+ pub trait_map : & ' tcx ItemLocalMap < & ' tcx [ TraitCandidate < ' tcx > ] > ,
476+
477+ #[ stable_hasher( ignore) ]
478+ pub delayed_lints : & ' tcx DelayedLints ,
479+ }
480+
481+ #[ derive( Debug , HashStable ) ]
482+ pub enum ProjectedMaybeOwner < ' tcx > {
483+ Owner ( ProjectedOwnerInfo < ' tcx > ) ,
484+ NonOwner ( HirId ) ,
485+ }
486+
487+ impl < ' tcx > From < & ' tcx MaybeOwner < ' tcx > > for ProjectedMaybeOwner < ' tcx > {
488+ fn from ( value : & ' tcx MaybeOwner < ' tcx > ) -> Self {
489+ match value {
490+ MaybeOwner :: Owner ( o) => ProjectedMaybeOwner :: Owner ( ProjectedOwnerInfo {
491+ nodes : & o. nodes ,
492+ parenting : & o. parenting ,
493+ trait_map : & o. trait_map ,
494+ delayed_lints : & o. delayed_lints ,
495+ } ) ,
496+ MaybeOwner :: NonOwner ( hir_id) => ProjectedMaybeOwner :: NonOwner ( * hir_id) ,
497+ MaybeOwner :: Phantom => panic ! ( ) ,
461498 }
499+ }
500+ }
462501
463- if krate. delayed_ids . contains ( & def_id) {
464- tcx. ensure_done ( ) . lower_delayed_owner ( def_id) ;
502+ impl < ' tcx > ProjectedMaybeOwner < ' tcx > {
503+ pub fn as_owner ( & ' tcx self ) -> Option < & ' tcx ProjectedOwnerInfo < ' tcx > > {
504+ match self {
505+ ProjectedMaybeOwner :: Owner ( i) => Some ( i) ,
506+ ProjectedMaybeOwner :: NonOwner ( _) => None ,
465507 }
508+ }
466509
467- tcx. delayed_owner ( def_id)
510+ pub fn unwrap ( & ' tcx self ) -> & ' tcx ProjectedOwnerInfo < ' tcx > {
511+ self . as_owner ( ) . unwrap_or_else ( || panic ! ( "Not a HIR owner" ) )
512+ }
513+ }
514+
515+ pub fn provide ( providers : & mut Providers ) {
516+ providers. hir_crate_items = map:: hir_crate_items;
517+ providers. crate_hash = map:: crate_hash;
518+ providers. hir_module_items = map:: hir_module_items;
519+ providers. hir_attr_map = |tcx, id| {
520+ tcx. hir_crate ( ( ) ) . owner ( tcx, id. def_id ) . as_owner ( ) . map_or ( AttributeMap :: EMPTY , |o| & o. attrs )
468521 } ;
522+ providers. owner = |tcx, def_id| ProjectedMaybeOwner :: from ( tcx. hir_crate ( ( ) ) . owner ( tcx, def_id) ) ;
469523 providers. hir_owner_parent_q = |tcx, owner_id| tcx. hir_owner_parent_impl ( owner_id) ;
470524 providers. def_span = |tcx, def_id| tcx. hir_span ( tcx. local_def_id_to_hir_id ( def_id) ) ;
471525 providers. def_ident_span = |tcx, def_id| {
0 commit comments