@@ -16,7 +16,8 @@ use rustc_data_structures::stable_hash::{StableHash, StableHashCtxt, StableHashe
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 , StableHash } ;
@@ -72,7 +73,7 @@ impl<'hir> Crate<'hir> {
7273 tcx. ensure_done ( ) . lower_delayed_owner ( def_id) ;
7374 }
7475
75- tcx. delayed_owner ( def_id)
76+ tcx. hir_delayed_owner ( def_id)
7677 }
7778}
7879
@@ -422,8 +423,7 @@ impl<'tcx> TyCtxt<'tcx> {
422423 HirId {
423424 owner : parent_owner_id,
424425 local_id : self
425- . hir_crate ( ( ) )
426- . owner ( self , parent_owner_id. def_id )
426+ . hir_owner ( parent_owner_id. def_id )
427427 . unwrap ( )
428428 . parenting
429429 . get ( & owner_id. def_id )
@@ -452,23 +452,75 @@ pub struct Hashes {
452452 pub attrs_hash : Option < Fingerprint > ,
453453}
454454
455+ /// Unites some of `OwnerInfo`'s fields into same struct that is used by `hir_owner` query.
456+ /// `AttributeMap` is handled separately as placing it in this struct led to perf regressions:
457+ /// <https://github.com/rust-lang/rust/pull/155678#issuecomment-4304597871>.
458+ /// This struct is created mainly for uniting/splitting fields of `OwnerInfo` so they are
459+ /// stored/invalidated together in incremental compilation.
460+ /// For comments about each field see `OwnerInfo` struct.
461+ #[ derive( Clone , Copy , Debug , StableHash ) ]
462+ pub struct ProjectedOwnerInfo < ' tcx > {
463+ nodes : & ' tcx OwnerNodes < ' tcx > ,
464+ parenting : & ' tcx LocalDefIdMap < ItemLocalId > ,
465+ trait_map : & ' tcx ItemLocalMap < & ' tcx [ TraitCandidate < ' tcx > ] > ,
466+
467+ #[ stable_hash( ignore) ]
468+ delayed_lints : & ' tcx Steal < DelayedLints > ,
469+ }
470+
471+ impl < ' tcx > ProjectedOwnerInfo < ' tcx > {
472+ pub fn new (
473+ nodes : & ' tcx OwnerNodes < ' tcx > ,
474+ parenting : & ' tcx LocalDefIdMap < ItemLocalId > ,
475+ trait_map : & ' tcx ItemLocalMap < & ' tcx [ TraitCandidate < ' tcx > ] > ,
476+ delayed_lints : & ' tcx Steal < DelayedLints > ,
477+ ) -> ProjectedOwnerInfo < ' tcx > {
478+ ProjectedOwnerInfo { nodes, parenting, trait_map, delayed_lints }
479+ }
480+ }
481+
482+ #[ derive( Clone , Copy , Debug , StableHash ) ]
483+ pub enum ProjectedMaybeOwner < ' tcx > {
484+ Owner ( ProjectedOwnerInfo < ' tcx > ) ,
485+ NonOwner ( HirId ) ,
486+ }
487+
488+ impl < ' tcx > ProjectedMaybeOwner < ' tcx > {
489+ pub fn new ( value : MaybeOwner < ' tcx > , def_id : LocalDefId ) -> Self {
490+ match value {
491+ MaybeOwner :: Owner ( o) => ProjectedMaybeOwner :: Owner ( ProjectedOwnerInfo {
492+ nodes : & o. nodes ,
493+ parenting : & o. parenting ,
494+ trait_map : & o. trait_map ,
495+ delayed_lints : & o. delayed_lints ,
496+ } ) ,
497+ MaybeOwner :: NonOwner ( hir_id) => ProjectedMaybeOwner :: NonOwner ( hir_id) ,
498+ MaybeOwner :: Phantom => bug ! ( "No HirId for {:?}" , def_id) ,
499+ }
500+ }
501+
502+ pub fn as_owner ( & self ) -> Option < & 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+
455514pub fn provide ( providers : & mut Providers ) {
456515 providers. hir_crate_items = map:: hir_crate_items;
457516 providers. crate_hash = map:: crate_hash;
458517 providers. hir_module_items = map:: hir_module_items;
459- providers. local_def_id_to_hir_id = |tcx, def_id| match tcx. hir_crate ( ( ) ) . owner ( tcx, def_id) {
460- MaybeOwner :: Owner ( _) => HirId :: make_owner ( def_id) ,
461- MaybeOwner :: NonOwner ( hir_id) => hir_id,
462- MaybeOwner :: Phantom => bug ! ( "No HirId for {:?}" , def_id) ,
463- } ;
464- providers. opt_hir_owner_nodes =
465- |tcx, id| tcx. hir_crate ( ( ) ) . owner ( tcx, id) . as_owner ( ) . map ( |i| & i. nodes ) ;
466- providers. hir_owner_parent_q = |tcx, owner_id| tcx. hir_owner_parent_impl ( owner_id) ;
467518 providers. hir_attr_map = |tcx, id| {
468519 tcx. hir_crate ( ( ) ) . owner ( tcx, id. def_id ) . as_owner ( ) . map_or ( AttributeMap :: EMPTY , |o| & o. attrs )
469520 } ;
470- providers. opt_ast_lowering_delayed_lints =
471- |tcx, id| tcx. hir_crate ( ( ) ) . owner ( tcx, id. def_id ) . as_owner ( ) . map ( |o| & o. delayed_lints ) ;
521+ providers. hir_owner =
522+ |tcx, def_id| ProjectedMaybeOwner :: new ( tcx. hir_crate ( ( ) ) . owner ( tcx, def_id) , def_id) ;
523+ providers. hir_owner_parent_q = |tcx, owner_id| tcx. hir_owner_parent_impl ( owner_id) ;
472524 providers. def_span = |tcx, def_id| tcx. hir_span ( tcx. local_def_id_to_hir_id ( def_id) ) ;
473525 providers. def_ident_span = |tcx, def_id| {
474526 let hir_id = tcx. local_def_id_to_hir_id ( def_id) ;
@@ -508,7 +560,4 @@ pub fn provide(providers: &mut Providers) {
508560 |tcx, trait_id| tcx. resolutions ( ( ) ) . trait_impls . get ( & trait_id) . map_or ( & [ ] , |xs| & xs[ ..] ) ;
509561 providers. expn_that_defined =
510562 |tcx, id| tcx. resolutions ( ( ) ) . expn_that_defined . get ( & id) . copied ( ) . unwrap_or ( ExpnId :: root ( ) ) ;
511- providers. in_scope_traits_map = |tcx, id| {
512- tcx. hir_crate ( ( ) ) . owner ( tcx, id. def_id ) . as_owner ( ) . map ( |owner_info| & owner_info. trait_map )
513- } ;
514563}
0 commit comments