@@ -14,9 +14,9 @@ use dep_graph::DepGraph;
1414use errors:: DiagnosticBuilder ;
1515use session:: Session ;
1616use middle;
17- use hir:: { TraitCandidate , HirId } ;
17+ use hir:: { TraitCandidate , HirId , ItemLocalId } ;
1818use hir:: def:: { Def , Export } ;
19- use hir:: def_id:: { CrateNum , DefId , LOCAL_CRATE } ;
19+ use hir:: def_id:: { CrateNum , DefId , DefIndex , LOCAL_CRATE } ;
2020use hir:: map as hir_map;
2121use hir:: map:: DefPathHash ;
2222use lint:: { self , Lint } ;
@@ -816,10 +816,10 @@ pub struct GlobalCtxt<'tcx> {
816816
817817 /// Map indicating what traits are in scope for places where this
818818 /// is relevant; generated by resolve.
819- trait_map : FxHashMap < HirId , Rc < Vec < TraitCandidate > > > ,
819+ trait_map : FxHashMap < DefIndex , Rc < FxHashMap < ItemLocalId , Rc < Vec < TraitCandidate > > > > > ,
820820
821821 /// Export map produced by name resolution.
822- export_map : FxHashMap < HirId , Rc < Vec < Export > > > ,
822+ export_map : FxHashMap < DefId , Rc < Vec < Export > > > ,
823823
824824 named_region_map : NamedRegionMap ,
825825
@@ -836,11 +836,11 @@ pub struct GlobalCtxt<'tcx> {
836836 // Records the free variables refrenced by every closure
837837 // expression. Do not track deps for this, just recompute it from
838838 // scratch every time.
839- freevars : FxHashMap < HirId , Rc < Vec < hir:: Freevar > > > ,
839+ freevars : FxHashMap < DefId , Rc < Vec < hir:: Freevar > > > ,
840840
841- maybe_unused_trait_imports : FxHashSet < HirId > ,
841+ maybe_unused_trait_imports : FxHashSet < DefId > ,
842842
843- maybe_unused_extern_crates : Vec < ( HirId , Span ) > ,
843+ maybe_unused_extern_crates : Vec < ( DefId , Span ) > ,
844844
845845 // Internal cache for metadata decoding. No need to track deps on this.
846846 pub rcache : RefCell < FxHashMap < ty:: CReaderCacheKey , Ty < ' tcx > > > ,
@@ -1031,6 +1031,35 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
10311031 None
10321032 } ;
10331033
1034+ let mut trait_map = FxHashMap ( ) ;
1035+ for ( k, v) in resolutions. trait_map {
1036+ let hir_id = hir. node_to_hir_id ( k) ;
1037+ let map = trait_map. entry ( hir_id. owner )
1038+ . or_insert_with ( || Rc :: new ( FxHashMap ( ) ) ) ;
1039+ Rc :: get_mut ( map) . unwrap ( ) . insert ( hir_id. local_id , Rc :: new ( v) ) ;
1040+ }
1041+ let mut defs = FxHashMap ( ) ;
1042+ for ( k, v) in named_region_map. defs {
1043+ let hir_id = hir. node_to_hir_id ( k) ;
1044+ let map = defs. entry ( hir_id. owner )
1045+ . or_insert_with ( || Rc :: new ( FxHashMap ( ) ) ) ;
1046+ Rc :: get_mut ( map) . unwrap ( ) . insert ( hir_id. local_id , v) ;
1047+ }
1048+ let mut late_bound = FxHashMap ( ) ;
1049+ for k in named_region_map. late_bound {
1050+ let hir_id = hir. node_to_hir_id ( k) ;
1051+ let map = late_bound. entry ( hir_id. owner )
1052+ . or_insert_with ( || Rc :: new ( FxHashSet ( ) ) ) ;
1053+ Rc :: get_mut ( map) . unwrap ( ) . insert ( hir_id. local_id ) ;
1054+ }
1055+ let mut object_lifetime_defaults = FxHashMap ( ) ;
1056+ for ( k, v) in named_region_map. object_lifetime_defaults {
1057+ let hir_id = hir. node_to_hir_id ( k) ;
1058+ let map = object_lifetime_defaults. entry ( hir_id. owner )
1059+ . or_insert_with ( || Rc :: new ( FxHashMap ( ) ) ) ;
1060+ Rc :: get_mut ( map) . unwrap ( ) . insert ( hir_id. local_id , Rc :: new ( v) ) ;
1061+ }
1062+
10341063 tls:: enter_global ( GlobalCtxt {
10351064 sess : s,
10361065 trans_trait_caches : traits:: trans:: TransTraitCaches :: new ( dep_graph. clone ( ) ) ,
@@ -1039,40 +1068,26 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
10391068 dep_graph : dep_graph. clone ( ) ,
10401069 types : common_types,
10411070 named_region_map : NamedRegionMap {
1042- defs :
1043- named_region_map. defs
1044- . into_iter ( )
1045- . map ( |( k, v) | ( hir. node_to_hir_id ( k) , v) )
1046- . collect ( ) ,
1047- late_bound :
1048- named_region_map. late_bound
1049- . into_iter ( )
1050- . map ( |k| hir. node_to_hir_id ( k) )
1051- . collect ( ) ,
1052- object_lifetime_defaults :
1053- named_region_map. object_lifetime_defaults
1054- . into_iter ( )
1055- . map ( |( k, v) | ( hir. node_to_hir_id ( k) , Rc :: new ( v) ) )
1056- . collect ( ) ,
1071+ defs,
1072+ late_bound,
1073+ object_lifetime_defaults,
10571074 } ,
1058- trait_map : resolutions. trait_map . into_iter ( ) . map ( |( k, v) | {
1059- ( hir. node_to_hir_id ( k) , Rc :: new ( v) )
1060- } ) . collect ( ) ,
1075+ trait_map,
10611076 export_map : resolutions. export_map . into_iter ( ) . map ( |( k, v) | {
1062- ( hir . node_to_hir_id ( k ) , Rc :: new ( v) )
1077+ ( k , Rc :: new ( v) )
10631078 } ) . collect ( ) ,
10641079 freevars : resolutions. freevars . into_iter ( ) . map ( |( k, v) | {
1065- ( hir. node_to_hir_id ( k) , Rc :: new ( v) )
1080+ ( hir. local_def_id ( k) , Rc :: new ( v) )
10661081 } ) . collect ( ) ,
10671082 maybe_unused_trait_imports :
10681083 resolutions. maybe_unused_trait_imports
10691084 . into_iter ( )
1070- . map ( |id| hir. node_to_hir_id ( id) )
1085+ . map ( |id| hir. local_def_id ( id) )
10711086 . collect ( ) ,
10721087 maybe_unused_extern_crates :
10731088 resolutions. maybe_unused_extern_crates
10741089 . into_iter ( )
1075- . map ( |( id, sp) | ( hir. node_to_hir_id ( id) , sp) )
1090+ . map ( |( id, sp) | ( hir. local_def_id ( id) , sp) )
10761091 . collect ( ) ,
10771092 hir,
10781093 def_path_hash_to_def_id,
@@ -1966,6 +1981,29 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
19661981 let ( level, src) = self . lint_level_at_node ( lint, id) ;
19671982 lint:: struct_lint_level ( self . sess , lint, level, src, None , msg)
19681983 }
1984+
1985+ pub fn in_scope_traits ( self , id : HirId ) -> Option < Rc < Vec < TraitCandidate > > > {
1986+ self . in_scope_traits_map ( id. owner )
1987+ . and_then ( |map| map. get ( & id. local_id ) . cloned ( ) )
1988+ }
1989+
1990+ pub fn named_region ( self , id : HirId ) -> Option < resolve_lifetime:: Region > {
1991+ self . named_region_map ( id. owner )
1992+ . and_then ( |map| map. get ( & id. local_id ) . cloned ( ) )
1993+ }
1994+
1995+ pub fn is_late_bound ( self , id : HirId ) -> bool {
1996+ self . is_late_bound_map ( id. owner )
1997+ . map ( |set| set. contains ( & id. local_id ) )
1998+ . unwrap_or ( false )
1999+ }
2000+
2001+ pub fn object_lifetime_defaults ( self , id : HirId )
2002+ -> Option < Rc < Vec < ObjectLifetimeDefault > > >
2003+ {
2004+ self . object_lifetime_defaults_map ( id. owner )
2005+ . and_then ( |map| map. get ( & id. local_id ) . cloned ( ) )
2006+ }
19692007}
19702008
19712009pub trait InternAs < T : ?Sized , R > {
@@ -2013,20 +2051,24 @@ impl<T, R, E> InternIteratorElement<T, R> for Result<T, E> {
20132051}
20142052
20152053struct NamedRegionMap {
2016- defs : FxHashMap < HirId , resolve_lifetime:: Region > ,
2017- late_bound : FxHashSet < HirId > ,
2018- object_lifetime_defaults : FxHashMap < HirId , Rc < Vec < ObjectLifetimeDefault > > > ,
2054+ defs : FxHashMap < DefIndex , Rc < FxHashMap < ItemLocalId , resolve_lifetime:: Region > > > ,
2055+ late_bound : FxHashMap < DefIndex , Rc < FxHashSet < ItemLocalId > > > ,
2056+ object_lifetime_defaults :
2057+ FxHashMap <
2058+ DefIndex ,
2059+ Rc < FxHashMap < ItemLocalId , Rc < Vec < ObjectLifetimeDefault > > > > ,
2060+ > ,
20192061}
20202062
20212063pub fn provide ( providers : & mut ty:: maps:: Providers ) {
20222064 // FIXME(#44234) - almost all of these queries have no sub-queries and
20232065 // therefore no actual inputs, they're just reading tables calculated in
20242066 // resolve! Does this work? Unsure! That's what the issue is about
2025- providers. in_scope_traits = |tcx, id| tcx. gcx . trait_map . get ( & id) . cloned ( ) ;
2067+ providers. in_scope_traits_map = |tcx, id| tcx. gcx . trait_map . get ( & id) . cloned ( ) ;
20262068 providers. module_exports = |tcx, id| tcx. gcx . export_map . get ( & id) . cloned ( ) ;
2027- providers. named_region = |tcx, id| tcx. gcx . named_region_map . defs . get ( & id) . cloned ( ) ;
2028- providers. is_late_bound = |tcx, id| tcx. gcx . named_region_map . late_bound . contains ( & id) ;
2029- providers. object_lifetime_defaults = |tcx, id| {
2069+ providers. named_region_map = |tcx, id| tcx. gcx . named_region_map . defs . get ( & id) . cloned ( ) ;
2070+ providers. is_late_bound_map = |tcx, id| tcx. gcx . named_region_map . late_bound . get ( & id) . cloned ( ) ;
2071+ providers. object_lifetime_defaults_map = |tcx, id| {
20302072 tcx. gcx . named_region_map . object_lifetime_defaults . get ( & id) . cloned ( )
20312073 } ;
20322074 providers. crate_name = |tcx, id| {
0 commit comments