Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions crates/hir-def/src/nameres/collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
}
}
}
Expand Down
39 changes: 39 additions & 0 deletions crates/hir-def/src/nameres/tests/globs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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
"#]],
);
}
Loading