@@ -11,10 +11,13 @@ use std::fmt;
11
11
12
12
use rustc_ast:: visit:: walk_list;
13
13
use rustc_data_structures:: fx:: { FxHashSet , FxIndexMap , FxIndexSet } ;
14
+ use rustc_data_structures:: sorted_map:: SortedMap ;
14
15
use rustc_hir as hir;
15
16
use rustc_hir:: def:: { DefKind , Res } ;
16
17
use rustc_hir:: intravisit:: { self , Visitor } ;
17
- use rustc_hir:: { GenericArg , GenericParam , GenericParamKind , HirId , HirIdMap , LifetimeName , Node } ;
18
+ use rustc_hir:: {
19
+ GenericArg , GenericParam , GenericParamKind , HirId , ItemLocalMap , LifetimeName , Node ,
20
+ } ;
18
21
use rustc_macros:: extension;
19
22
use rustc_middle:: hir:: nested_filter;
20
23
use rustc_middle:: middle:: resolve_bound_vars:: * ;
@@ -74,15 +77,15 @@ impl ResolvedArg {
74
77
struct NamedVarMap {
75
78
// maps from every use of a named (not anonymous) bound var to a
76
79
// `ResolvedArg` describing how that variable is bound
77
- defs : HirIdMap < ResolvedArg > ,
80
+ defs : ItemLocalMap < ResolvedArg > ,
78
81
79
82
// Maps relevant hir items to the bound vars on them. These include:
80
83
// - function defs
81
84
// - function pointers
82
85
// - closures
83
86
// - trait refs
84
87
// - bound types (like `T` in `for<'a> T<'a>: Foo`)
85
- late_bound_vars : HirIdMap < Vec < ty:: BoundVariableKind > > ,
88
+ late_bound_vars : ItemLocalMap < Vec < ty:: BoundVariableKind > > ,
86
89
}
87
90
88
91
struct BoundVarContext < ' a , ' tcx > {
@@ -225,10 +228,10 @@ pub(crate) fn provide(providers: &mut Providers) {
225
228
* providers = Providers {
226
229
resolve_bound_vars,
227
230
228
- named_variable_map : |tcx, id| tcx. resolve_bound_vars ( id) . defs . get ( & id ) ,
231
+ named_variable_map : |tcx, id| & tcx. resolve_bound_vars ( id) . defs ,
229
232
is_late_bound_map,
230
233
object_lifetime_default,
231
- late_bound_vars_map : |tcx, id| tcx. resolve_bound_vars ( id) . late_bound_vars . get ( & id ) ,
234
+ late_bound_vars_map : |tcx, id| & tcx. resolve_bound_vars ( id) . late_bound_vars ,
232
235
233
236
..* providers
234
237
} ;
@@ -265,16 +268,12 @@ fn resolve_bound_vars(tcx: TyCtxt<'_>, local_def_id: hir::OwnerId) -> ResolveBou
265
268
hir:: OwnerNode :: Synthetic => unreachable ! ( ) ,
266
269
}
267
270
268
- let mut rl = ResolveBoundVars :: default ( ) ;
269
-
270
- for ( hir_id, v) in named_variable_map. defs {
271
- let map = rl. defs . entry ( hir_id. owner ) . or_default ( ) ;
272
- map. insert ( hir_id. local_id , v) ;
273
- }
274
- for ( hir_id, v) in named_variable_map. late_bound_vars {
275
- let map = rl. late_bound_vars . entry ( hir_id. owner ) . or_default ( ) ;
276
- map. insert ( hir_id. local_id , v) ;
277
- }
271
+ let defs = named_variable_map. defs . into_sorted_stable_ord ( ) ;
272
+ let late_bound_vars = named_variable_map. late_bound_vars . into_sorted_stable_ord ( ) ;
273
+ let rl = ResolveBoundVars {
274
+ defs : SortedMap :: from_presorted_elements ( defs) ,
275
+ late_bound_vars : SortedMap :: from_presorted_elements ( late_bound_vars) ,
276
+ } ;
278
277
279
278
debug ! ( ?rl. defs) ;
280
279
debug ! ( ?rl. late_bound_vars) ;
@@ -340,7 +339,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
340
339
Scope :: Binder { hir_id, .. } => {
341
340
// Nested poly trait refs have the binders concatenated
342
341
let mut full_binders =
343
- self . map . late_bound_vars . entry ( * hir_id) . or_default ( ) . clone ( ) ;
342
+ self . map . late_bound_vars . entry ( hir_id. local_id ) . or_default ( ) . clone ( ) ;
344
343
full_binders. extend ( supertrait_bound_vars) ;
345
344
break ( full_binders, BinderScopeType :: Concatenating ) ;
346
345
}
@@ -679,7 +678,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
679
678
hir:: TyKind :: Ref ( lifetime_ref, ref mt) => {
680
679
self . visit_lifetime ( lifetime_ref) ;
681
680
let scope = Scope :: ObjectLifetimeDefault {
682
- lifetime : self . map . defs . get ( & lifetime_ref. hir_id ) . cloned ( ) ,
681
+ lifetime : self . map . defs . get ( & lifetime_ref. hir_id . local_id ) . cloned ( ) ,
683
682
s : self . scope ,
684
683
} ;
685
684
self . with ( scope, |this| this. visit_ty ( mt. ty ) ) ;
@@ -706,7 +705,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
706
705
// and ban them. Type variables instantiated inside binders aren't
707
706
// well-supported at the moment, so this doesn't work.
708
707
// In the future, this should be fixed and this error should be removed.
709
- let def = self . map . defs . get ( & lifetime. hir_id ) . copied ( ) ;
708
+ let def = self . map . defs . get ( & lifetime. hir_id . local_id ) . copied ( ) ;
710
709
let Some ( ResolvedArg :: LateBound ( _, _, lifetime_def_id) ) = def else { continue } ;
711
710
let lifetime_hir_id = self . tcx . local_def_id_to_hir_id ( lifetime_def_id) ;
712
711
@@ -843,7 +842,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
843
842
let bound_vars: Vec < _ > =
844
843
self . tcx . fn_sig ( sig_id) . skip_binder ( ) . bound_vars ( ) . iter ( ) . collect ( ) ;
845
844
let hir_id = self . tcx . local_def_id_to_hir_id ( def_id) ;
846
- self . map . late_bound_vars . insert ( hir_id, bound_vars) ;
845
+ self . map . late_bound_vars . insert ( hir_id. local_id , bound_vars) ;
847
846
}
848
847
self . visit_fn_like_elision ( fd. inputs , output, matches ! ( fk, intravisit:: FnKind :: Closure ) ) ;
849
848
intravisit:: walk_fn_kind ( self , fk) ;
@@ -1016,10 +1015,10 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
1016
1015
}
1017
1016
1018
1017
fn record_late_bound_vars ( & mut self , hir_id : HirId , binder : Vec < ty:: BoundVariableKind > ) {
1019
- if let Some ( old) = self . map . late_bound_vars . insert ( hir_id, binder) {
1018
+ if let Some ( old) = self . map . late_bound_vars . insert ( hir_id. local_id , binder) {
1020
1019
bug ! (
1021
1020
"overwrote bound vars for {hir_id:?}:\n old={old:?}\n new={:?}" ,
1022
- self . map. late_bound_vars[ & hir_id]
1021
+ self . map. late_bound_vars[ & hir_id. local_id ]
1023
1022
)
1024
1023
}
1025
1024
}
@@ -1394,9 +1393,9 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
1394
1393
kind. descr( param_def_id. to_def_id( ) )
1395
1394
) ,
1396
1395
} ;
1397
- self . map . defs . insert ( hir_id, ResolvedArg :: Error ( guar) ) ;
1396
+ self . map . defs . insert ( hir_id. local_id , ResolvedArg :: Error ( guar) ) ;
1398
1397
} else {
1399
- self . map . defs . insert ( hir_id, def) ;
1398
+ self . map . defs . insert ( hir_id. local_id , def) ;
1400
1399
}
1401
1400
return ;
1402
1401
}
@@ -1429,7 +1428,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
1429
1428
bug ! ( "unexpected def-kind: {}" , kind. descr( param_def_id. to_def_id( ) ) )
1430
1429
}
1431
1430
} ) ;
1432
- self . map . defs . insert ( hir_id, ResolvedArg :: Error ( guar) ) ;
1431
+ self . map . defs . insert ( hir_id. local_id , ResolvedArg :: Error ( guar) ) ;
1433
1432
return ;
1434
1433
}
1435
1434
Scope :: Root { .. } => break ,
@@ -1539,7 +1538,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
1539
1538
// This index can be used with `generic_args` since `parent_count == 0`.
1540
1539
let index = generics. param_def_id_to_index [ & param_def_id] as usize ;
1541
1540
generic_args. args . get ( index) . and_then ( |arg| match arg {
1542
- GenericArg :: Lifetime ( lt) => map. defs . get ( & lt. hir_id ) . copied ( ) ,
1541
+ GenericArg :: Lifetime ( lt) => map. defs . get ( & lt. hir_id . local_id ) . copied ( ) ,
1543
1542
_ => None ,
1544
1543
} )
1545
1544
}
@@ -1829,7 +1828,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
1829
1828
#[ instrument( level = "debug" , skip( self ) ) ]
1830
1829
fn insert_lifetime ( & mut self , lifetime_ref : & ' tcx hir:: Lifetime , def : ResolvedArg ) {
1831
1830
debug ! ( span = ?lifetime_ref. ident. span) ;
1832
- self . map . defs . insert ( lifetime_ref. hir_id , def) ;
1831
+ self . map . defs . insert ( lifetime_ref. hir_id . local_id , def) ;
1833
1832
}
1834
1833
1835
1834
/// Sometimes we resolve a lifetime, but later find that it is an
@@ -1840,8 +1839,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
1840
1839
lifetime_ref : & ' tcx hir:: Lifetime ,
1841
1840
bad_def : ResolvedArg ,
1842
1841
) {
1843
- // FIXME(#120456) - is `swap_remove` correct?
1844
- let old_value = self . map . defs . swap_remove ( & lifetime_ref. hir_id ) ;
1842
+ let old_value = self . map . defs . remove ( & lifetime_ref. hir_id . local_id ) ;
1845
1843
assert_eq ! ( old_value, Some ( bad_def) ) ;
1846
1844
}
1847
1845
}
0 commit comments