Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/item_scope.rs')
-rw-r--r--crates/hir-def/src/item_scope.rs32
1 files changed, 20 insertions, 12 deletions
diff --git a/crates/hir-def/src/item_scope.rs b/crates/hir-def/src/item_scope.rs
index 1443d3ea4b..14f10651cb 100644
--- a/crates/hir-def/src/item_scope.rs
+++ b/crates/hir-def/src/item_scope.rs
@@ -621,7 +621,11 @@ impl ItemScope {
// for that.
}
_ => {
- if glob_imports.types.remove(&lookup) {
+ // A non-glob import either shadows a glob import of the same
+ // name, or re-resolves a stale binding it recorded earlier.
+ if glob_imports.types.remove(&lookup)
+ || entry.get().is_reresolved_by(&fld.def, import)
+ {
let prev = std::mem::replace(&mut fld.import, import);
if let Some(import) = import {
self.use_imports_types.insert(
@@ -659,19 +663,22 @@ impl ItemScope {
changed = true;
}
Entry::Occupied(mut entry)
- if !matches!(import, Some(ImportOrExternCrate::Glob(..)))
- && glob_imports.values.remove(&lookup) =>
+ if !matches!(import, Some(ImportOrExternCrate::Glob(..))) =>
{
- cov_mark::hit!(import_shadowed);
-
let import = import.and_then(ImportOrExternCrate::import_or_glob);
- let prev = std::mem::replace(&mut fld.import, import);
- if let Some(import) = import {
- self.use_imports_values
- .insert(import, prev.map_or(ImportOrDef::Def(fld.def), Into::into));
+ if glob_imports.values.remove(&lookup)
+ || entry.get().is_reresolved_by(&fld.def, import)
+ {
+ cov_mark::hit!(import_shadowed);
+
+ let prev = std::mem::replace(&mut fld.import, import);
+ if let Some(import) = import {
+ self.use_imports_values
+ .insert(import, prev.map_or(ImportOrDef::Def(fld.def), Into::into));
+ }
+ entry.insert(fld);
+ changed = true;
}
- entry.insert(fld);
- changed = true;
}
_ => {}
}
@@ -699,7 +706,8 @@ impl ItemScope {
}
Entry::Occupied(mut entry)
if !matches!(import, Some(ImportOrExternCrate::Glob(..)))
- && glob_imports.macros.remove(&lookup) =>
+ && (glob_imports.macros.remove(&lookup)
+ || entry.get().is_reresolved_by(&fld.def, import)) =>
{
cov_mark::hit!(import_shadowed);
let prev = std::mem::replace(&mut fld.import, import);