Merge pull request #21561 from Veykril/push-xvymvmuvzuyn

fix: Fix more glob issues
This commit is contained in:
Lukas Wirth 2026-02-02 10:02:12 +00:00 committed by GitHub
commit edf20f01e5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 99 additions and 25 deletions

View file

@ -893,6 +893,24 @@ impl ItemScope {
self.macros.get_mut(name).expect("tried to update visibility of non-existent macro");
res.vis = vis;
}
pub(crate) fn update_def_types(&mut self, name: &Name, def: ModuleDefId, vis: Visibility) {
let res = self.types.get_mut(name).expect("tried to update def of non-existent type");
res.def = def;
res.vis = vis;
}
pub(crate) fn update_def_values(&mut self, name: &Name, def: ModuleDefId, vis: Visibility) {
let res = self.values.get_mut(name).expect("tried to update def of non-existent value");
res.def = def;
res.vis = vis;
}
pub(crate) fn update_def_macros(&mut self, name: &Name, def: MacroId, vis: Visibility) {
let res = self.macros.get_mut(name).expect("tried to update def of non-existent macro");
res.def = def;
res.vis = vis;
}
}
impl PerNs {

View file

@ -1209,42 +1209,69 @@ impl<'db> DefCollector<'db> {
// `ItemScope::push_res_with_import()`.
if let Some(def) = defs.types
&& let Some(prev_def) = prev_defs.types
&& def.def == prev_def.def
&& self.from_glob_import.contains_type(module_id, name.clone())
&& def.vis != prev_def.vis
&& def.vis.max(self.db, prev_def.vis, &self.def_map) == Some(def.vis)
{
changed = true;
// This import is being handled here, don't pass it down to
// `ItemScope::push_res_with_import()`.
defs.types = None;
self.def_map.modules[module_id].scope.update_visibility_types(name, def.vis);
if def.def == prev_def.def
&& self.from_glob_import.contains_type(module_id, name.clone())
&& def.vis != prev_def.vis
&& def.vis.max(self.db, prev_def.vis, &self.def_map) == Some(def.vis)
{
changed = true;
// This import is being handled here, don't pass it down to
// `ItemScope::push_res_with_import()`.
defs.types = None;
self.def_map.modules[module_id].scope.update_visibility_types(name, def.vis);
}
// When the source module's definition changed (e.g., due to an explicit import
// shadowing a glob), propagate the new definition to modules that glob-import from it.
// We check that the previous definition came from the same glob import to avoid
// incorrectly overwriting definitions from different glob sources.
//
// Note this is not a perfect fix, but it makes
// https://github.com/rust-lang/rust-analyzer/issues/19224 work for now until we
// implement a proper glob graph
else if def.def != prev_def.def && prev_def.import == def_import_type {
changed = true;
defs.types = None;
self.def_map.modules[module_id].scope.update_def_types(name, def.def, def.vis);
}
}
if let Some(def) = defs.values
&& let Some(prev_def) = prev_defs.values
&& def.def == prev_def.def
&& self.from_glob_import.contains_value(module_id, name.clone())
&& def.vis != prev_def.vis
&& def.vis.max(self.db, prev_def.vis, &self.def_map) == Some(def.vis)
{
changed = true;
// See comment above.
defs.values = None;
self.def_map.modules[module_id].scope.update_visibility_values(name, def.vis);
if def.def == prev_def.def
&& self.from_glob_import.contains_value(module_id, name.clone())
&& def.vis != prev_def.vis
&& def.vis.max(self.db, prev_def.vis, &self.def_map) == Some(def.vis)
{
changed = true;
defs.values = None;
self.def_map.modules[module_id].scope.update_visibility_values(name, def.vis);
} else if def.def != prev_def.def
&& prev_def.import.map(ImportOrExternCrate::from) == def_import_type
{
changed = true;
defs.values = None;
self.def_map.modules[module_id].scope.update_def_values(name, def.def, def.vis);
}
}
if let Some(def) = defs.macros
&& let Some(prev_def) = prev_defs.macros
&& def.def == prev_def.def
&& self.from_glob_import.contains_macro(module_id, name.clone())
&& def.vis != prev_def.vis
&& def.vis.max(self.db, prev_def.vis, &self.def_map) == Some(def.vis)
{
changed = true;
// See comment above.
defs.macros = None;
self.def_map.modules[module_id].scope.update_visibility_macros(name, def.vis);
if def.def == prev_def.def
&& self.from_glob_import.contains_macro(module_id, name.clone())
&& def.vis != prev_def.vis
&& def.vis.max(self.db, prev_def.vis, &self.def_map) == Some(def.vis)
{
changed = true;
defs.macros = None;
self.def_map.modules[module_id].scope.update_visibility_macros(name, def.vis);
} else if def.def != prev_def.def && prev_def.import == def_import_type {
changed = true;
defs.macros = None;
self.def_map.modules[module_id].scope.update_def_macros(name, def.def, def.vis);
}
}
}

View file

@ -2645,3 +2645,32 @@ where
"#,
);
}
#[test]
fn issue_21560() {
check_no_mismatches(
r#"
mod bindings {
use super::*;
pub type HRESULT = i32;
}
use bindings::*;
mod error {
use super::*;
pub fn nonzero_hresult(hr: HRESULT) -> crate::HRESULT {
hr
}
}
pub use error::*;
mod hresult {
use super::*;
pub struct HRESULT(pub i32);
}
pub use hresult::HRESULT;
"#,
);
}