Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/hir-def/src/nameres/collector.rs9
-rw-r--r--crates/hir-def/src/nameres/tests/globs.rs39
2 files changed, 46 insertions, 2 deletions
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index a37e3c70e2..98b08bcf70 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -910,8 +910,13 @@ impl DefCollector<'_> {
self.update(module_id, &items, vis, Some(ImportType::Glob(id)));
// record the glob import in case we add further items
let glob = self.glob_imports.entry(m.local_id).or_default();
- if !glob.iter().any(|(mid, _, _)| *mid == module_id) {
- glob.push((module_id, vis, id));
+ match glob.iter_mut().find(|(mid, _, _)| *mid == module_id) {
+ None => glob.push((module_id, vis, id)),
+ Some((_, old_vis, _)) => {
+ if let Some(new_vis) = old_vis.max(vis, &self.def_map) {
+ *old_vis = new_vis;
+ }
+ }
}
}
}
diff --git a/crates/hir-def/src/nameres/tests/globs.rs b/crates/hir-def/src/nameres/tests/globs.rs
index 543ab41cd5..8963a57679 100644
--- a/crates/hir-def/src/nameres/tests/globs.rs
+++ b/crates/hir-def/src/nameres/tests/globs.rs
@@ -451,3 +451,42 @@ mod glob_target {
"#]],
);
}
+
+#[test]
+fn regression_18580() {
+ check(
+ r#"
+pub mod libs {
+ pub struct Placeholder;
+}
+
+pub mod reexport_2 {
+ use reexport_1::*;
+ pub use reexport_1::*;
+
+ pub mod reexport_1 {
+ pub use crate::libs::*;
+ }
+}
+
+use reexport_2::*;
+"#,
+ expect![[r#"
+ crate
+ Placeholder: t v
+ libs: t
+ reexport_1: t
+ reexport_2: t
+
+ crate::libs
+ Placeholder: t v
+
+ crate::reexport_2
+ Placeholder: t v
+ reexport_1: t
+
+ crate::reexport_2::reexport_1
+ Placeholder: t v
+ "#]],
+ );
+}