Skip to content

Commit 4b221e0

Browse files
replace binding and shadowed_glob on NameResolution with non_glob_binding and glob_binding
1 parent 2f9c9ce commit 4b221e0

File tree

7 files changed

+77
-55
lines changed

7 files changed

+77
-55
lines changed

compiler/rustc_resolve/src/check_unused.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ impl Resolver<'_, '_> {
511511
for (_key, resolution) in self.resolutions(*module).borrow().iter() {
512512
let resolution = resolution.borrow();
513513

514-
if let Some(binding) = resolution.binding
514+
if let Some(binding) = resolution.best_binding()
515515
&& let NameBindingKind::Import { import, .. } = binding.kind
516516
&& let ImportKind::Single { id, .. } = import.kind
517517
{

compiler/rustc_resolve/src/diagnostics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1440,7 +1440,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14401440
|(key, name_resolution)| {
14411441
if key.ns == TypeNS
14421442
&& key.ident == ident
1443-
&& let Some(binding) = name_resolution.borrow().binding
1443+
&& let Some(binding) = name_resolution.borrow().best_binding()
14441444
{
14451445
match binding.res() {
14461446
// No disambiguation needed if the identically named item we
@@ -1494,7 +1494,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
14941494
return None;
14951495
};
14961496
for (_, resolution) in this.resolutions(m).borrow().iter() {
1497-
let Some(binding) = resolution.borrow().binding else {
1497+
let Some(binding) = resolution.borrow().best_binding() else {
14981498
continue;
14991499
};
15001500
let Res::Def(DefKind::Macro(MacroKind::Derive | MacroKind::Attr), def_id) =

compiler/rustc_resolve/src/ident.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -875,15 +875,15 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
875875
// binding if it exists. What we really want here is having two separate scopes in
876876
// a module - one for non-globs and one for globs, but until that's done use this
877877
// hack to avoid inconsistent resolution ICEs during import validation.
878-
let binding = [resolution.binding, resolution.shadowed_glob]
878+
let binding = [resolution.non_glob_binding, resolution.glob_binding]
879879
.into_iter()
880880
.find_map(|binding| if binding == ignore_binding { None } else { binding });
881881

882882
if let Some(finalize) = finalize {
883883
return self.finalize_module_binding(
884884
ident,
885885
binding,
886-
resolution.shadowed_glob,
886+
if resolution.non_glob_binding.is_some() { resolution.glob_binding } else { None },
887887
parent_scope,
888888
finalize,
889889
shadowing,

compiler/rustc_resolve/src/imports.rs

Lines changed: 50 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -242,22 +242,27 @@ pub(crate) struct NameResolution<'ra> {
242242
/// Single imports that may define the name in the namespace.
243243
/// Imports are arena-allocated, so it's ok to use pointers as keys.
244244
pub single_imports: FxIndexSet<Import<'ra>>,
245-
/// The least shadowable known binding for this name, or None if there are no known bindings.
246-
pub binding: Option<NameBinding<'ra>>,
247-
pub shadowed_glob: Option<NameBinding<'ra>>,
245+
/// The non-glob binding for this name, if it is known to exist.
246+
pub non_glob_binding: Option<NameBinding<'ra>>,
247+
/// The glob binding for this name, if it is known to exist.
248+
pub glob_binding: Option<NameBinding<'ra>>,
248249
}
249250

250251
impl<'ra> NameResolution<'ra> {
251252
/// Returns the binding for the name if it is known or None if it not known.
252253
pub(crate) fn binding(&self) -> Option<NameBinding<'ra>> {
253-
self.binding.and_then(|binding| {
254+
self.best_binding().and_then(|binding| {
254255
if !binding.is_glob_import() || self.single_imports.is_empty() {
255256
Some(binding)
256257
} else {
257258
None
258259
}
259260
})
260261
}
262+
263+
pub(crate) fn best_binding(&self) -> Option<NameBinding<'ra>> {
264+
self.non_glob_binding.or(self.glob_binding)
265+
}
261266
}
262267

263268
/// An error that may be transformed into a diagnostic later. Used to combine multiple unresolved
@@ -338,77 +343,83 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
338343
self.check_reserved_macro_name(key.ident, res);
339344
self.set_binding_parent_module(binding, module);
340345
self.update_resolution(module, key, warn_ambiguity, |this, resolution| {
341-
if let Some(old_binding) = resolution.binding {
346+
if let Some(old_binding) = resolution.best_binding() {
342347
if res == Res::Err && old_binding.res() != Res::Err {
343348
// Do not override real bindings with `Res::Err`s from error recovery.
344349
return Ok(());
345350
}
346351
match (old_binding.is_glob_import(), binding.is_glob_import()) {
347352
(true, true) => {
353+
let (glob_binding, old_glob_binding) = (binding, old_binding);
348354
// FIXME: remove `!binding.is_ambiguity_recursive()` after delete the warning ambiguity.
349355
if !binding.is_ambiguity_recursive()
350356
&& let NameBindingKind::Import { import: old_import, .. } =
351-
old_binding.kind
352-
&& let NameBindingKind::Import { import, .. } = binding.kind
357+
old_glob_binding.kind
358+
&& let NameBindingKind::Import { import, .. } = glob_binding.kind
353359
&& old_import == import
354360
{
355-
// We should replace the `old_binding` with `binding` regardless
356-
// of whether they has same resolution or not when they are
357-
// imported from the same glob-import statement.
358-
resolution.binding = Some(binding);
359-
} else if res != old_binding.res() {
360-
resolution.binding = Some(this.new_ambiguity_binding(
361+
// When imported from the same glob-import statement, we should replace
362+
// `old_glob_binding` with `glob_binding`, regardless of whether
363+
// they have the same resolution or not.
364+
resolution.glob_binding = Some(glob_binding);
365+
} else if res != old_glob_binding.res() {
366+
resolution.glob_binding = Some(this.new_ambiguity_binding(
361367
AmbiguityKind::GlobVsGlob,
362-
old_binding,
363-
binding,
368+
old_glob_binding,
369+
glob_binding,
364370
warn_ambiguity,
365371
));
366372
} else if !old_binding.vis.is_at_least(binding.vis, this.tcx) {
367373
// We are glob-importing the same item but with greater visibility.
368-
resolution.binding = Some(binding);
374+
resolution.glob_binding = Some(glob_binding);
369375
} else if binding.is_ambiguity_recursive() {
370-
resolution.binding = Some(this.new_warn_ambiguity_binding(binding));
376+
resolution.glob_binding =
377+
Some(this.new_warn_ambiguity_binding(glob_binding));
371378
}
372379
}
373380
(old_glob @ true, false) | (old_glob @ false, true) => {
374-
let (glob_binding, nonglob_binding) =
381+
let (glob_binding, non_glob_binding) =
375382
if old_glob { (old_binding, binding) } else { (binding, old_binding) };
376383
if key.ns == MacroNS
377-
&& nonglob_binding.expansion != LocalExpnId::ROOT
378-
&& glob_binding.res() != nonglob_binding.res()
384+
&& non_glob_binding.expansion != LocalExpnId::ROOT
385+
&& glob_binding.res() != non_glob_binding.res()
379386
{
380-
resolution.binding = Some(this.new_ambiguity_binding(
387+
resolution.non_glob_binding = Some(this.new_ambiguity_binding(
381388
AmbiguityKind::GlobVsExpanded,
382-
nonglob_binding,
389+
non_glob_binding,
383390
glob_binding,
384391
false,
385392
));
386393
} else {
387-
resolution.binding = Some(nonglob_binding);
394+
resolution.non_glob_binding = Some(non_glob_binding);
388395
}
389396

390-
if let Some(old_shadowed_glob) = resolution.shadowed_glob {
391-
assert!(old_shadowed_glob.is_glob_import());
392-
if glob_binding.res() != old_shadowed_glob.res() {
393-
resolution.shadowed_glob = Some(this.new_ambiguity_binding(
397+
if let Some(old_glob_binding) = resolution.glob_binding {
398+
assert!(old_glob_binding.is_glob_import());
399+
if glob_binding.res() != old_glob_binding.res() {
400+
resolution.glob_binding = Some(this.new_ambiguity_binding(
394401
AmbiguityKind::GlobVsGlob,
395-
old_shadowed_glob,
402+
old_glob_binding,
396403
glob_binding,
397404
false,
398405
));
399-
} else if !old_shadowed_glob.vis.is_at_least(binding.vis, this.tcx) {
400-
resolution.shadowed_glob = Some(glob_binding);
406+
} else if !old_glob_binding.vis.is_at_least(binding.vis, this.tcx) {
407+
resolution.glob_binding = Some(glob_binding);
401408
}
402409
} else {
403-
resolution.shadowed_glob = Some(glob_binding);
410+
resolution.glob_binding = Some(glob_binding);
404411
}
405412
}
406413
(false, false) => {
407414
return Err(old_binding);
408415
}
409416
}
410417
} else {
411-
resolution.binding = Some(binding);
418+
if binding.is_glob_import() {
419+
resolution.glob_binding = Some(binding);
420+
} else {
421+
resolution.non_glob_binding = Some(binding);
422+
}
412423
}
413424

414425
Ok(())
@@ -628,7 +639,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
628639
for (key, resolution) in self.resolutions(*module).borrow().iter() {
629640
let resolution = resolution.borrow();
630641

631-
let Some(binding) = resolution.binding else { continue };
642+
let Some(binding) = resolution.best_binding() else { continue };
632643

633644
if let NameBindingKind::Import { import, .. } = binding.kind
634645
&& let Some((amb_binding, _)) = binding.ambiguity
@@ -648,7 +659,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
648659
);
649660
}
650661

651-
if let Some(glob_binding) = resolution.shadowed_glob {
662+
if let Some(glob_binding) = resolution.glob_binding
663+
&& resolution.non_glob_binding.is_some()
664+
{
652665
if binding.res() != Res::Err
653666
&& glob_binding.res() != Res::Err
654667
&& let NameBindingKind::Import { import: glob_import, .. } =
@@ -1179,7 +1192,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
11791192
return None;
11801193
} // Never suggest the same name
11811194
match *resolution.borrow() {
1182-
NameResolution { binding: Some(name_binding), .. } => {
1195+
ref resolution
1196+
if let Some(name_binding) = resolution.best_binding() =>
1197+
{
11831198
match name_binding.kind {
11841199
NameBindingKind::Import { binding, .. } => {
11851200
match binding.kind {

compiler/rustc_resolve/src/late.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3437,7 +3437,8 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
34373437
};
34383438
ident.span.normalize_to_macros_2_0_and_adjust(module.expansion);
34393439
let key = BindingKey::new(ident, ns);
3440-
let mut binding = self.r.resolution(module, key).try_borrow().ok().and_then(|r| r.binding);
3440+
let mut binding =
3441+
self.r.resolution(module, key).try_borrow().ok().and_then(|r| r.best_binding());
34413442
debug!(?binding);
34423443
if binding.is_none() {
34433444
// We could not find the trait item in the correct namespace.
@@ -3448,7 +3449,8 @@ impl<'a, 'ast, 'ra, 'tcx> LateResolutionVisitor<'a, 'ast, 'ra, 'tcx> {
34483449
_ => ns,
34493450
};
34503451
let key = BindingKey::new(ident, ns);
3451-
binding = self.r.resolution(module, key).try_borrow().ok().and_then(|r| r.binding);
3452+
binding =
3453+
self.r.resolution(module, key).try_borrow().ok().and_then(|r| r.best_binding());
34523454
debug!(?binding);
34533455
}
34543456

compiler/rustc_resolve/src/late/diagnostics.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -880,8 +880,10 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
880880
fn lookup_doc_alias_name(&mut self, path: &[Segment], ns: Namespace) -> Option<(DefId, Ident)> {
881881
let find_doc_alias_name = |r: &mut Resolver<'ra, '_>, m: Module<'ra>, item_name: Symbol| {
882882
for resolution in r.resolutions(m).borrow().values() {
883-
let Some(did) =
884-
resolution.borrow().binding.and_then(|binding| binding.res().opt_def_id())
883+
let Some(did) = resolution
884+
.borrow()
885+
.best_binding()
886+
.and_then(|binding| binding.res().opt_def_id())
885887
else {
886888
continue;
887889
};
@@ -1464,15 +1466,16 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
14641466
self.resolve_path(mod_path, None, None)
14651467
{
14661468
let resolutions = self.r.resolutions(module).borrow();
1467-
let targets: Vec<_> =
1468-
resolutions
1469-
.iter()
1470-
.filter_map(|(key, resolution)| {
1471-
resolution.borrow().binding.map(|binding| binding.res()).and_then(
1472-
|res| if filter_fn(res) { Some((key, res)) } else { None },
1473-
)
1474-
})
1475-
.collect();
1469+
let targets: Vec<_> = resolutions
1470+
.iter()
1471+
.filter_map(|(key, resolution)| {
1472+
resolution
1473+
.borrow()
1474+
.best_binding()
1475+
.map(|binding| binding.res())
1476+
.and_then(|res| if filter_fn(res) { Some((key, res)) } else { None })
1477+
})
1478+
.collect();
14761479
if let [target] = targets.as_slice() {
14771480
return Some(TypoSuggestion::single_item_from_ident(target.0.ident, target.1));
14781481
}
@@ -2305,7 +2308,9 @@ impl<'ast, 'ra, 'tcx> LateResolutionVisitor<'_, 'ast, 'ra, 'tcx> {
23052308
let targets = resolutions
23062309
.borrow()
23072310
.iter()
2308-
.filter_map(|(key, res)| res.borrow().binding.map(|binding| (key, binding.res())))
2311+
.filter_map(|(key, res)| {
2312+
res.borrow().best_binding().map(|binding| (key, binding.res()))
2313+
})
23092314
.filter(|(_, res)| match (kind, res) {
23102315
(AssocItemKind::Const(..), Res::Def(DefKind::AssocConst, _)) => true,
23112316
(AssocItemKind::Fn(_), Res::Def(DefKind::AssocFn, _)) => true,

compiler/rustc_resolve/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -641,7 +641,7 @@ impl<'ra> Module<'ra> {
641641
F: FnMut(&mut R, Ident, Namespace, NameBinding<'ra>),
642642
{
643643
for (key, name_resolution) in resolver.as_mut().resolutions(self).borrow().iter() {
644-
if let Some(binding) = name_resolution.borrow().binding {
644+
if let Some(binding) = name_resolution.borrow().best_binding() {
645645
f(resolver, key.ident, key.ns, binding);
646646
}
647647
}

0 commit comments

Comments
 (0)