Skip to content

Commit 2c65790

Browse files
committed
resolve: Minimize borrow scopes for resolutions
1 parent a955f1c commit 2c65790

File tree

6 files changed

+46
-49
lines changed

6 files changed

+46
-49
lines changed

compiler/rustc_resolve/src/build_reduced_graph.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -452,8 +452,10 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
452452
self.r.per_ns(|this, ns| {
453453
if !type_ns_only || ns == TypeNS {
454454
let key = BindingKey::new(target, ns);
455-
let mut resolution = this.resolution(current_module, key).borrow_mut();
456-
resolution.single_imports.insert(import);
455+
this.resolution(current_module, key)
456+
.borrow_mut()
457+
.single_imports
458+
.insert(import);
457459
}
458460
});
459461
}

compiler/rustc_resolve/src/check_unused.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -509,9 +509,7 @@ impl Resolver<'_, '_> {
509509
let mut check_redundant_imports = FxIndexSet::default();
510510
for module in self.arenas.local_modules().iter() {
511511
for (_key, resolution) in self.resolutions(*module).borrow().iter() {
512-
let resolution = resolution.borrow();
513-
514-
if let Some(binding) = resolution.best_binding()
512+
if let Some(binding) = resolution.borrow().best_binding()
515513
&& let NameBindingKind::Import { import, .. } = binding.kind
516514
&& let ImportKind::Single { id, .. } = import.kind
517515
{

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2659,10 +2659,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
26592659
return None;
26602660
}
26612661

2662-
let resolutions = self.resolutions(crate_module).borrow();
26632662
let binding_key = BindingKey::new(ident, MacroNS);
2664-
let resolution = resolutions.get(&binding_key)?;
2665-
let binding = resolution.borrow().binding()?;
2663+
let binding =
2664+
self.resolutions(crate_module).borrow().get(&binding_key)?.borrow().binding()?;
26662665
let Res::Def(DefKind::Macro(MacroKind::Bang), _) = binding.res() else {
26672666
return None;
26682667
};

compiler/rustc_resolve/src/effective_visibilities.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,7 @@ impl<'a, 'ra, 'tcx> EffectiveVisibilitiesVisitor<'a, 'ra, 'tcx> {
114114
/// including their whole reexport chains.
115115
fn set_bindings_effective_visibilities(&mut self, module_id: LocalDefId) {
116116
let module = self.r.expect_module(module_id.to_def_id());
117-
let resolutions = self.r.resolutions(module);
118-
119-
for (_, name_resolution) in resolutions.borrow().iter() {
117+
for (_, name_resolution) in self.r.resolutions(module).borrow().iter() {
120118
let Some(mut binding) = name_resolution.borrow().binding() else {
121119
continue;
122120
};

compiler/rustc_resolve/src/imports.rs

Lines changed: 30 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -651,7 +651,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
651651
for module in self.arenas.local_modules().iter() {
652652
for (key, resolution) in self.resolutions(*module).borrow().iter() {
653653
let resolution = resolution.borrow();
654-
655654
let Some(binding) = resolution.best_binding() else { continue };
656655

657656
if let NameBindingKind::Import { import, .. } = binding.kind
@@ -1202,41 +1201,39 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
12021201
});
12031202

12041203
return if all_ns_failed {
1205-
let resolutions = match module {
1206-
ModuleOrUniformRoot::Module(module) => Some(self.resolutions(module).borrow()),
1207-
_ => None,
1208-
};
1209-
let resolutions = resolutions.as_ref().into_iter().flat_map(|r| r.iter());
1210-
let names = resolutions
1211-
.filter_map(|(BindingKey { ident: i, .. }, resolution)| {
1212-
if i.name == ident.name {
1213-
return None;
1214-
} // Never suggest the same name
1215-
match *resolution.borrow() {
1216-
ref resolution
1217-
if let Some(name_binding) = resolution.best_binding() =>
1218-
{
1219-
match name_binding.kind {
1220-
NameBindingKind::Import { binding, .. } => {
1221-
match binding.kind {
1222-
// Never suggest the name that has binding error
1223-
// i.e., the name that cannot be previously resolved
1224-
NameBindingKind::Res(Res::Err) => None,
1225-
_ => Some(i.name),
1204+
let names = match module {
1205+
ModuleOrUniformRoot::Module(module) => {
1206+
self.resolutions(module)
1207+
.borrow()
1208+
.iter()
1209+
.filter_map(|(BindingKey { ident: i, .. }, resolution)| {
1210+
if i.name == ident.name {
1211+
return None;
1212+
} // Never suggest the same name
1213+
1214+
let resolution = resolution.borrow();
1215+
if let Some(name_binding) = resolution.best_binding() {
1216+
match name_binding.kind {
1217+
NameBindingKind::Import { binding, .. } => {
1218+
match binding.kind {
1219+
// Never suggest the name that has binding error
1220+
// i.e., the name that cannot be previously resolved
1221+
NameBindingKind::Res(Res::Err) => None,
1222+
_ => Some(i.name),
1223+
}
12261224
}
1225+
_ => Some(i.name),
12271226
}
1228-
_ => Some(i.name),
1227+
} else if resolution.single_imports.is_empty() {
1228+
None
1229+
} else {
1230+
Some(i.name)
12291231
}
1230-
}
1231-
NameResolution { ref single_imports, .. }
1232-
if single_imports.is_empty() =>
1233-
{
1234-
None
1235-
}
1236-
_ => Some(i.name),
1237-
}
1238-
})
1239-
.collect::<Vec<Symbol>>();
1232+
})
1233+
.collect()
1234+
}
1235+
_ => Vec::new(),
1236+
};
12401237

12411238
let lev_suggestion =
12421239
find_best_match_for_name(&names, ident.name, None).map(|suggestion| {

compiler/rustc_resolve/src/late/diagnostics.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1461,15 +1461,17 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
14611461
if let PathResult::Module(ModuleOrUniformRoot::Module(module)) =
14621462
self.resolve_path(mod_path, None, None)
14631463
{
1464-
let resolutions = self.r.resolutions(module).borrow();
1465-
let targets: Vec<_> = resolutions
1464+
let targets: Vec<_> = self
1465+
.r
1466+
.resolutions(module)
1467+
.borrow()
14661468
.iter()
14671469
.filter_map(|(key, resolution)| {
14681470
resolution
14691471
.borrow()
14701472
.best_binding()
14711473
.map(|binding| binding.res())
1472-
.and_then(|res| if filter_fn(res) { Some((key, res)) } else { None })
1474+
.and_then(|res| if filter_fn(res) { Some((*key, res)) } else { None })
14731475
})
14741476
.collect();
14751477
if let [target] = targets.as_slice() {
@@ -2300,8 +2302,9 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
23002302
return None;
23012303
}
23022304

2303-
let resolutions = self.r.resolutions(*module);
2304-
let targets = resolutions
2305+
let targets = self
2306+
.r
2307+
.resolutions(*module)
23052308
.borrow()
23062309
.iter()
23072310
.filter_map(|(key, res)| {

0 commit comments

Comments
 (0)