Skip to content

Commit 5dd65e4

Browse files
committed
Simplify bound var resolution.
1 parent 3c23658 commit 5dd65e4

File tree

4 files changed

+38
-43
lines changed

4 files changed

+38
-43
lines changed

compiler/rustc_hir_analysis/src/collect/resolve_bound_vars.rs

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,14 @@ use std::fmt;
1111

1212
use rustc_ast::visit::walk_list;
1313
use rustc_data_structures::fx::{FxHashSet, FxIndexMap, FxIndexSet};
14+
use rustc_data_structures::sorted_map::SortedMap;
1415
use rustc_hir as hir;
1516
use rustc_hir::def::{DefKind, Res};
1617
use rustc_hir::def_id::LocalDefId;
1718
use rustc_hir::intravisit::{self, Visitor};
18-
use rustc_hir::{GenericArg, GenericParam, GenericParamKind, HirId, HirIdMap, LifetimeName, Node};
19+
use rustc_hir::{
20+
GenericArg, GenericParam, GenericParamKind, HirId, ItemLocalMap, LifetimeName, Node,
21+
};
1922
use rustc_macros::extension;
2023
use rustc_middle::hir::nested_filter;
2124
use rustc_middle::middle::resolve_bound_vars::*;
@@ -74,15 +77,15 @@ impl ResolvedArg {
7477
struct NamedVarMap {
7578
// maps from every use of a named (not anonymous) bound var to a
7679
// `ResolvedArg` describing how that variable is bound
77-
defs: HirIdMap<ResolvedArg>,
80+
defs: ItemLocalMap<ResolvedArg>,
7881

7982
// Maps relevant hir items to the bound vars on them. These include:
8083
// - function defs
8184
// - function pointers
8285
// - closures
8386
// - trait refs
8487
// - 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>>,
8689
}
8790

8891
struct BoundVarContext<'a, 'tcx> {
@@ -225,10 +228,10 @@ pub(crate) fn provide(providers: &mut Providers) {
225228
*providers = Providers {
226229
resolve_bound_vars,
227230

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,
229232
is_late_bound_map,
230233
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,
232235

233236
..*providers
234237
};
@@ -265,16 +268,12 @@ fn resolve_bound_vars(tcx: TyCtxt<'_>, local_def_id: hir::OwnerId) -> ResolveBou
265268
hir::OwnerNode::Synthetic => unreachable!(),
266269
}
267270

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+
};
278277

279278
debug!(?rl.defs);
280279
debug!(?rl.late_bound_vars);
@@ -339,7 +338,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
339338
Scope::Binder { hir_id, .. } => {
340339
// Nested poly trait refs have the binders concatenated
341340
let mut full_binders =
342-
self.map.late_bound_vars.entry(*hir_id).or_default().clone();
341+
self.map.late_bound_vars.entry(hir_id.local_id).or_default().clone();
343342
full_binders.extend(supertrait_bound_vars);
344343
break (full_binders, BinderScopeType::Concatenating);
345344
}
@@ -678,7 +677,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
678677
hir::TyKind::Ref(lifetime_ref, ref mt) => {
679678
self.visit_lifetime(lifetime_ref);
680679
let scope = Scope::ObjectLifetimeDefault {
681-
lifetime: self.map.defs.get(&lifetime_ref.hir_id).cloned(),
680+
lifetime: self.map.defs.get(&lifetime_ref.hir_id.local_id).cloned(),
682681
s: self.scope,
683682
};
684683
self.with(scope, |this| this.visit_ty(mt.ty));
@@ -705,7 +704,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
705704
// and ban them. Type variables instantiated inside binders aren't
706705
// well-supported at the moment, so this doesn't work.
707706
// In the future, this should be fixed and this error should be removed.
708-
let def = self.map.defs.get(&lifetime.hir_id).copied();
707+
let def = self.map.defs.get(&lifetime.hir_id.local_id).copied();
709708
let Some(ResolvedArg::LateBound(_, _, lifetime_def_id)) = def else { continue };
710709
let Some(lifetime_def_id) = lifetime_def_id.as_local() else { continue };
711710
let lifetime_hir_id = self.tcx.local_def_id_to_hir_id(lifetime_def_id);
@@ -843,7 +842,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
843842
let bound_vars: Vec<_> =
844843
self.tcx.fn_sig(sig_id).skip_binder().bound_vars().iter().collect();
845844
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);
847846
}
848847
self.visit_fn_like_elision(fd.inputs, output, matches!(fk, intravisit::FnKind::Closure));
849848
intravisit::walk_fn_kind(self, fk);
@@ -1016,10 +1015,10 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
10161015
}
10171016

10181017
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) {
10201019
bug!(
10211020
"overwrote bound vars for {hir_id:?}:\nold={old:?}\nnew={:?}",
1022-
self.map.late_bound_vars[&hir_id]
1021+
self.map.late_bound_vars[&hir_id.local_id]
10231022
)
10241023
}
10251024
}
@@ -1394,9 +1393,9 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
13941393
kind.descr(param_def_id.to_def_id())
13951394
),
13961395
};
1397-
self.map.defs.insert(hir_id, ResolvedArg::Error(guar));
1396+
self.map.defs.insert(hir_id.local_id, ResolvedArg::Error(guar));
13981397
} else {
1399-
self.map.defs.insert(hir_id, def);
1398+
self.map.defs.insert(hir_id.local_id, def);
14001399
}
14011400
return;
14021401
}
@@ -1429,7 +1428,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
14291428
bug!("unexpected def-kind: {}", kind.descr(param_def_id.to_def_id()))
14301429
}
14311430
});
1432-
self.map.defs.insert(hir_id, ResolvedArg::Error(guar));
1431+
self.map.defs.insert(hir_id.local_id, ResolvedArg::Error(guar));
14331432
return;
14341433
}
14351434
Scope::Root { .. } => break,
@@ -1539,7 +1538,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
15391538
// This index can be used with `generic_args` since `parent_count == 0`.
15401539
let index = generics.param_def_id_to_index[&param_def_id] as usize;
15411540
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(),
15431542
_ => None,
15441543
})
15451544
}
@@ -1829,7 +1828,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
18291828
#[instrument(level = "debug", skip(self))]
18301829
fn insert_lifetime(&mut self, lifetime_ref: &'tcx hir::Lifetime, def: ResolvedArg) {
18311830
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);
18331832
}
18341833

18351834
/// Sometimes we resolve a lifetime, but later find that it is an
@@ -1840,8 +1839,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
18401839
lifetime_ref: &'tcx hir::Lifetime,
18411840
bad_def: ResolvedArg,
18421841
) {
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);
18451843
assert_eq!(old_value, Some(bad_def));
18461844
}
18471845
}

compiler/rustc_middle/src/middle/resolve_bound_vars.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
//! Name resolution for lifetimes and late-bound type and const variables: type declarations.
22
3-
use rustc_data_structures::fx::FxIndexMap;
3+
use rustc_data_structures::sorted_map::SortedMap;
44
use rustc_errors::ErrorGuaranteed;
55
use rustc_hir::def_id::DefId;
6-
use rustc_hir::{ItemLocalId, OwnerId};
6+
use rustc_hir::ItemLocalId;
77
use rustc_macros::{Decodable, Encodable, HashStable, TyDecodable, TyEncodable};
88

99
use crate::ty;
@@ -47,11 +47,11 @@ pub enum ObjectLifetimeDefault {
4747

4848
/// Maps the id of each lifetime reference to the lifetime decl
4949
/// that it corresponds to.
50-
#[derive(Default, HashStable, Debug)]
50+
#[derive(HashStable, Debug)]
5151
pub struct ResolveBoundVars {
5252
/// Maps from every use of a named (not anonymous) lifetime to a
5353
/// `Region` describing how that region is bound
54-
pub defs: FxIndexMap<OwnerId, FxIndexMap<ItemLocalId, ResolvedArg>>,
54+
pub defs: SortedMap<ItemLocalId, ResolvedArg>,
5555

56-
pub late_bound_vars: FxIndexMap<OwnerId, FxIndexMap<ItemLocalId, Vec<ty::BoundVariableKind>>>,
56+
pub late_bound_vars: SortedMap<ItemLocalId, Vec<ty::BoundVariableKind>>,
5757
}

compiler/rustc_middle/src/query/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use rustc_ast::expand::allocator::AllocatorKind;
1616
use rustc_ast::expand::StrippedCfgItem;
1717
use rustc_data_structures::fingerprint::Fingerprint;
1818
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
19+
use rustc_data_structures::sorted_map::SortedMap;
1920
use rustc_data_structures::steal::Steal;
2021
use rustc_data_structures::svh::Svh;
2122
use rustc_data_structures::sync::Lrc;
@@ -1736,8 +1737,7 @@ rustc_queries! {
17361737
arena_cache
17371738
desc { |tcx| "resolving lifetimes for `{}`", tcx.def_path_str(def_id) }
17381739
}
1739-
query named_variable_map(def_id: hir::OwnerId) ->
1740-
Option<&'tcx FxIndexMap<ItemLocalId, ResolvedArg>> {
1740+
query named_variable_map(def_id: hir::OwnerId) -> &'tcx SortedMap<ItemLocalId, ResolvedArg> {
17411741
desc { |tcx| "looking up a named region inside `{}`", tcx.def_path_str(def_id) }
17421742
}
17431743
query is_late_bound_map(def_id: hir::OwnerId) -> Option<&'tcx FxIndexSet<ItemLocalId>> {
@@ -1753,7 +1753,7 @@ rustc_queries! {
17531753
separate_provide_extern
17541754
}
17551755
query late_bound_vars_map(def_id: hir::OwnerId)
1756-
-> Option<&'tcx FxIndexMap<ItemLocalId, Vec<ty::BoundVariableKind>>> {
1756+
-> &'tcx SortedMap<ItemLocalId, Vec<ty::BoundVariableKind>> {
17571757
desc { |tcx| "looking up late bound vars inside `{}`", tcx.def_path_str(def_id) }
17581758
}
17591759

compiler/rustc_middle/src/ty/context.rs

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2988,7 +2988,7 @@ impl<'tcx> TyCtxt<'tcx> {
29882988

29892989
pub fn named_bound_var(self, id: HirId) -> Option<resolve_bound_vars::ResolvedArg> {
29902990
debug!(?id, "named_region");
2991-
self.named_variable_map(id.owner).and_then(|map| map.get(&id.local_id).cloned())
2991+
self.named_variable_map(id.owner).get(&id.local_id).cloned()
29922992
}
29932993

29942994
pub fn is_late_bound(self, id: HirId) -> bool {
@@ -2997,12 +2997,9 @@ impl<'tcx> TyCtxt<'tcx> {
29972997

29982998
pub fn late_bound_vars(self, id: HirId) -> &'tcx List<ty::BoundVariableKind> {
29992999
self.mk_bound_variable_kinds(
3000-
&self
3001-
.late_bound_vars_map(id.owner)
3002-
.and_then(|map| map.get(&id.local_id).cloned())
3003-
.unwrap_or_else(|| {
3004-
bug!("No bound vars found for {}", self.hir().node_to_string(id))
3005-
}),
3000+
&self.late_bound_vars_map(id.owner).get(&id.local_id).cloned().unwrap_or_else(|| {
3001+
bug!("No bound vars found for {}", self.hir().node_to_string(id))
3002+
}),
30063003
)
30073004
}
30083005

0 commit comments

Comments
 (0)