@@ -14,9 +14,9 @@ use dep_graph::DepGraph;
14
14
use errors:: DiagnosticBuilder ;
15
15
use session:: Session ;
16
16
use middle;
17
- use hir:: { TraitCandidate , HirId } ;
17
+ use hir:: { TraitCandidate , HirId , ItemLocalId } ;
18
18
use hir:: def:: { Def , Export } ;
19
- use hir:: def_id:: { CrateNum , DefId , LOCAL_CRATE } ;
19
+ use hir:: def_id:: { CrateNum , DefId , DefIndex , LOCAL_CRATE } ;
20
20
use hir:: map as hir_map;
21
21
use hir:: map:: DefPathHash ;
22
22
use lint:: { self , Lint } ;
@@ -817,10 +817,10 @@ pub struct GlobalCtxt<'tcx> {
817
817
818
818
/// Map indicating what traits are in scope for places where this
819
819
/// is relevant; generated by resolve.
820
- trait_map : FxHashMap < HirId , Rc < Vec < TraitCandidate > > > ,
820
+ trait_map : FxHashMap < DefIndex , Rc < FxHashMap < ItemLocalId , Rc < Vec < TraitCandidate > > > > > ,
821
821
822
822
/// Export map produced by name resolution.
823
- export_map : FxHashMap < HirId , Rc < Vec < Export > > > ,
823
+ export_map : FxHashMap < DefId , Rc < Vec < Export > > > ,
824
824
825
825
named_region_map : NamedRegionMap ,
826
826
@@ -837,11 +837,11 @@ pub struct GlobalCtxt<'tcx> {
837
837
// Records the free variables refrenced by every closure
838
838
// expression. Do not track deps for this, just recompute it from
839
839
// scratch every time.
840
- freevars : FxHashMap < HirId , Rc < Vec < hir:: Freevar > > > ,
840
+ freevars : FxHashMap < DefId , Rc < Vec < hir:: Freevar > > > ,
841
841
842
- maybe_unused_trait_imports : FxHashSet < HirId > ,
842
+ maybe_unused_trait_imports : FxHashSet < DefId > ,
843
843
844
- maybe_unused_extern_crates : Vec < ( HirId , Span ) > ,
844
+ maybe_unused_extern_crates : Vec < ( DefId , Span ) > ,
845
845
846
846
// Internal cache for metadata decoding. No need to track deps on this.
847
847
pub rcache : RefCell < FxHashMap < ty:: CReaderCacheKey , Ty < ' tcx > > > ,
@@ -1032,6 +1032,35 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
1032
1032
None
1033
1033
} ;
1034
1034
1035
+ let mut trait_map = FxHashMap ( ) ;
1036
+ for ( k, v) in resolutions. trait_map {
1037
+ let hir_id = hir. node_to_hir_id ( k) ;
1038
+ let map = trait_map. entry ( hir_id. owner )
1039
+ . or_insert_with ( || Rc :: new ( FxHashMap ( ) ) ) ;
1040
+ Rc :: get_mut ( map) . unwrap ( ) . insert ( hir_id. local_id , Rc :: new ( v) ) ;
1041
+ }
1042
+ let mut defs = FxHashMap ( ) ;
1043
+ for ( k, v) in named_region_map. defs {
1044
+ let hir_id = hir. node_to_hir_id ( k) ;
1045
+ let map = defs. entry ( hir_id. owner )
1046
+ . or_insert_with ( || Rc :: new ( FxHashMap ( ) ) ) ;
1047
+ Rc :: get_mut ( map) . unwrap ( ) . insert ( hir_id. local_id , v) ;
1048
+ }
1049
+ let mut late_bound = FxHashMap ( ) ;
1050
+ for k in named_region_map. late_bound {
1051
+ let hir_id = hir. node_to_hir_id ( k) ;
1052
+ let map = late_bound. entry ( hir_id. owner )
1053
+ . or_insert_with ( || Rc :: new ( FxHashSet ( ) ) ) ;
1054
+ Rc :: get_mut ( map) . unwrap ( ) . insert ( hir_id. local_id ) ;
1055
+ }
1056
+ let mut object_lifetime_defaults = FxHashMap ( ) ;
1057
+ for ( k, v) in named_region_map. object_lifetime_defaults {
1058
+ let hir_id = hir. node_to_hir_id ( k) ;
1059
+ let map = object_lifetime_defaults. entry ( hir_id. owner )
1060
+ . or_insert_with ( || Rc :: new ( FxHashMap ( ) ) ) ;
1061
+ Rc :: get_mut ( map) . unwrap ( ) . insert ( hir_id. local_id , Rc :: new ( v) ) ;
1062
+ }
1063
+
1035
1064
tls:: enter_global ( GlobalCtxt {
1036
1065
sess : s,
1037
1066
trans_trait_caches : traits:: trans:: TransTraitCaches :: new ( dep_graph. clone ( ) ) ,
@@ -1040,40 +1069,26 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
1040
1069
dep_graph : dep_graph. clone ( ) ,
1041
1070
types : common_types,
1042
1071
named_region_map : NamedRegionMap {
1043
- defs :
1044
- named_region_map. defs
1045
- . into_iter ( )
1046
- . map ( |( k, v) | ( hir. node_to_hir_id ( k) , v) )
1047
- . collect ( ) ,
1048
- late_bound :
1049
- named_region_map. late_bound
1050
- . into_iter ( )
1051
- . map ( |k| hir. node_to_hir_id ( k) )
1052
- . collect ( ) ,
1053
- object_lifetime_defaults :
1054
- named_region_map. object_lifetime_defaults
1055
- . into_iter ( )
1056
- . map ( |( k, v) | ( hir. node_to_hir_id ( k) , Rc :: new ( v) ) )
1057
- . collect ( ) ,
1072
+ defs,
1073
+ late_bound,
1074
+ object_lifetime_defaults,
1058
1075
} ,
1059
- trait_map : resolutions. trait_map . into_iter ( ) . map ( |( k, v) | {
1060
- ( hir. node_to_hir_id ( k) , Rc :: new ( v) )
1061
- } ) . collect ( ) ,
1076
+ trait_map,
1062
1077
export_map : resolutions. export_map . into_iter ( ) . map ( |( k, v) | {
1063
- ( hir . node_to_hir_id ( k ) , Rc :: new ( v) )
1078
+ ( k , Rc :: new ( v) )
1064
1079
} ) . collect ( ) ,
1065
1080
freevars : resolutions. freevars . into_iter ( ) . map ( |( k, v) | {
1066
- ( hir. node_to_hir_id ( k) , Rc :: new ( v) )
1081
+ ( hir. local_def_id ( k) , Rc :: new ( v) )
1067
1082
} ) . collect ( ) ,
1068
1083
maybe_unused_trait_imports :
1069
1084
resolutions. maybe_unused_trait_imports
1070
1085
. into_iter ( )
1071
- . map ( |id| hir. node_to_hir_id ( id) )
1086
+ . map ( |id| hir. local_def_id ( id) )
1072
1087
. collect ( ) ,
1073
1088
maybe_unused_extern_crates :
1074
1089
resolutions. maybe_unused_extern_crates
1075
1090
. into_iter ( )
1076
- . map ( |( id, sp) | ( hir. node_to_hir_id ( id) , sp) )
1091
+ . map ( |( id, sp) | ( hir. local_def_id ( id) , sp) )
1077
1092
. collect ( ) ,
1078
1093
hir,
1079
1094
def_path_hash_to_def_id,
@@ -1967,6 +1982,29 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
1967
1982
let ( level, src) = self . lint_level_at_node ( lint, id) ;
1968
1983
lint:: struct_lint_level ( self . sess , lint, level, src, None , msg)
1969
1984
}
1985
+
1986
+ pub fn in_scope_traits ( self , id : HirId ) -> Option < Rc < Vec < TraitCandidate > > > {
1987
+ self . in_scope_traits_map ( id. owner )
1988
+ . and_then ( |map| map. get ( & id. local_id ) . cloned ( ) )
1989
+ }
1990
+
1991
+ pub fn named_region ( self , id : HirId ) -> Option < resolve_lifetime:: Region > {
1992
+ self . named_region_map ( id. owner )
1993
+ . and_then ( |map| map. get ( & id. local_id ) . cloned ( ) )
1994
+ }
1995
+
1996
+ pub fn is_late_bound ( self , id : HirId ) -> bool {
1997
+ self . is_late_bound_map ( id. owner )
1998
+ . map ( |set| set. contains ( & id. local_id ) )
1999
+ . unwrap_or ( false )
2000
+ }
2001
+
2002
+ pub fn object_lifetime_defaults ( self , id : HirId )
2003
+ -> Option < Rc < Vec < ObjectLifetimeDefault > > >
2004
+ {
2005
+ self . object_lifetime_defaults_map ( id. owner )
2006
+ . and_then ( |map| map. get ( & id. local_id ) . cloned ( ) )
2007
+ }
1970
2008
}
1971
2009
1972
2010
pub trait InternAs < T : ?Sized , R > {
@@ -2014,20 +2052,24 @@ impl<T, R, E> InternIteratorElement<T, R> for Result<T, E> {
2014
2052
}
2015
2053
2016
2054
struct NamedRegionMap {
2017
- defs : FxHashMap < HirId , resolve_lifetime:: Region > ,
2018
- late_bound : FxHashSet < HirId > ,
2019
- object_lifetime_defaults : FxHashMap < HirId , Rc < Vec < ObjectLifetimeDefault > > > ,
2055
+ defs : FxHashMap < DefIndex , Rc < FxHashMap < ItemLocalId , resolve_lifetime:: Region > > > ,
2056
+ late_bound : FxHashMap < DefIndex , Rc < FxHashSet < ItemLocalId > > > ,
2057
+ object_lifetime_defaults :
2058
+ FxHashMap <
2059
+ DefIndex ,
2060
+ Rc < FxHashMap < ItemLocalId , Rc < Vec < ObjectLifetimeDefault > > > > ,
2061
+ > ,
2020
2062
}
2021
2063
2022
2064
pub fn provide ( providers : & mut ty:: maps:: Providers ) {
2023
2065
// FIXME(#44234) - almost all of these queries have no sub-queries and
2024
2066
// therefore no actual inputs, they're just reading tables calculated in
2025
2067
// resolve! Does this work? Unsure! That's what the issue is about
2026
- providers. in_scope_traits = |tcx, id| tcx. gcx . trait_map . get ( & id) . cloned ( ) ;
2068
+ providers. in_scope_traits_map = |tcx, id| tcx. gcx . trait_map . get ( & id) . cloned ( ) ;
2027
2069
providers. module_exports = |tcx, id| tcx. gcx . export_map . get ( & id) . cloned ( ) ;
2028
- providers. named_region = |tcx, id| tcx. gcx . named_region_map . defs . get ( & id) . cloned ( ) ;
2029
- providers. is_late_bound = |tcx, id| tcx. gcx . named_region_map . late_bound . contains ( & id) ;
2030
- providers. object_lifetime_defaults = |tcx, id| {
2070
+ providers. named_region_map = |tcx, id| tcx. gcx . named_region_map . defs . get ( & id) . cloned ( ) ;
2071
+ providers. is_late_bound_map = |tcx, id| tcx. gcx . named_region_map . late_bound . get ( & id) . cloned ( ) ;
2072
+ providers. object_lifetime_defaults_map = |tcx, id| {
2031
2073
tcx. gcx . named_region_map . object_lifetime_defaults . get ( & id) . cloned ( )
2032
2074
} ;
2033
2075
providers. crate_name = |tcx, id| {
0 commit comments