@@ -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 } ;
@@ -816,10 +816,10 @@ pub struct GlobalCtxt<'tcx> {
816
816
817
817
/// Map indicating what traits are in scope for places where this
818
818
/// is relevant; generated by resolve.
819
- trait_map : FxHashMap < HirId , Rc < Vec < TraitCandidate > > > ,
819
+ trait_map : FxHashMap < DefIndex , Rc < FxHashMap < ItemLocalId , Rc < Vec < TraitCandidate > > > > > ,
820
820
821
821
/// Export map produced by name resolution.
822
- export_map : FxHashMap < HirId , Rc < Vec < Export > > > ,
822
+ export_map : FxHashMap < DefId , Rc < Vec < Export > > > ,
823
823
824
824
named_region_map : NamedRegionMap ,
825
825
@@ -836,11 +836,11 @@ pub struct GlobalCtxt<'tcx> {
836
836
// Records the free variables refrenced by every closure
837
837
// expression. Do not track deps for this, just recompute it from
838
838
// scratch every time.
839
- freevars : FxHashMap < HirId , Rc < Vec < hir:: Freevar > > > ,
839
+ freevars : FxHashMap < DefId , Rc < Vec < hir:: Freevar > > > ,
840
840
841
- maybe_unused_trait_imports : FxHashSet < HirId > ,
841
+ maybe_unused_trait_imports : FxHashSet < DefId > ,
842
842
843
- maybe_unused_extern_crates : Vec < ( HirId , Span ) > ,
843
+ maybe_unused_extern_crates : Vec < ( DefId , Span ) > ,
844
844
845
845
// Internal cache for metadata decoding. No need to track deps on this.
846
846
pub rcache : RefCell < FxHashMap < ty:: CReaderCacheKey , Ty < ' tcx > > > ,
@@ -1031,6 +1031,35 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
1031
1031
None
1032
1032
} ;
1033
1033
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
+
1034
1063
tls:: enter_global ( GlobalCtxt {
1035
1064
sess : s,
1036
1065
trans_trait_caches : traits:: trans:: TransTraitCaches :: new ( dep_graph. clone ( ) ) ,
@@ -1039,40 +1068,26 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
1039
1068
dep_graph : dep_graph. clone ( ) ,
1040
1069
types : common_types,
1041
1070
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,
1057
1074
} ,
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,
1061
1076
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) )
1063
1078
} ) . collect ( ) ,
1064
1079
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) )
1066
1081
} ) . collect ( ) ,
1067
1082
maybe_unused_trait_imports :
1068
1083
resolutions. maybe_unused_trait_imports
1069
1084
. into_iter ( )
1070
- . map ( |id| hir. node_to_hir_id ( id) )
1085
+ . map ( |id| hir. local_def_id ( id) )
1071
1086
. collect ( ) ,
1072
1087
maybe_unused_extern_crates :
1073
1088
resolutions. maybe_unused_extern_crates
1074
1089
. into_iter ( )
1075
- . map ( |( id, sp) | ( hir. node_to_hir_id ( id) , sp) )
1090
+ . map ( |( id, sp) | ( hir. local_def_id ( id) , sp) )
1076
1091
. collect ( ) ,
1077
1092
hir,
1078
1093
def_path_hash_to_def_id,
@@ -1966,6 +1981,29 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
1966
1981
let ( level, src) = self . lint_level_at_node ( lint, id) ;
1967
1982
lint:: struct_lint_level ( self . sess , lint, level, src, None , msg)
1968
1983
}
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
+ }
1969
2007
}
1970
2008
1971
2009
pub trait InternAs < T : ?Sized , R > {
@@ -2013,20 +2051,24 @@ impl<T, R, E> InternIteratorElement<T, R> for Result<T, E> {
2013
2051
}
2014
2052
2015
2053
struct 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
+ > ,
2019
2061
}
2020
2062
2021
2063
pub fn provide ( providers : & mut ty:: maps:: Providers ) {
2022
2064
// FIXME(#44234) - almost all of these queries have no sub-queries and
2023
2065
// therefore no actual inputs, they're just reading tables calculated in
2024
2066
// 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 ( ) ;
2026
2068
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| {
2030
2072
tcx. gcx . named_region_map . object_lifetime_defaults . get ( & id) . cloned ( )
2031
2073
} ;
2032
2074
providers. crate_name = |tcx, id| {
0 commit comments