Account for updated module ids when determining whether a resolution is "changed"

This commit is contained in:
Paul Daniel Faria 2020-06-23 22:10:01 -04:00
parent 471d44e72c
commit 38af81f183
2 changed files with 178 additions and 9 deletions

View File

@ -126,17 +126,40 @@ impl ItemScope {
let mut changed = false;
let existing = self.visible.entry(name).or_default();
if existing.types.is_none() && def.types.is_some() {
existing.types = def.types;
changed = true;
match (existing.types, def.types) {
(None, Some(_)) => {
existing.types = def.types;
changed = true;
}
(Some(e), Some(d)) if e.0 != d.0 => {
existing.types = def.types;
changed = true;
}
_ => {}
}
if existing.values.is_none() && def.values.is_some() {
existing.values = def.values;
changed = true;
match (existing.values, def.values) {
(None, Some(_)) => {
existing.values = def.values;
changed = true;
}
(Some(e), Some(d)) if e.0 != d.0 => {
existing.values = def.values;
changed = true;
}
_ => {}
}
if existing.macros.is_none() && def.macros.is_some() {
existing.macros = def.macros;
changed = true;
match (existing.macros, def.macros) {
(None, Some(_)) => {
existing.macros = def.macros;
changed = true;
}
(Some(e), Some(d)) if e.0 != d.0 => {
existing.macros = def.macros;
changed = true;
}
_ => {}
}
changed

View File

@ -229,3 +229,149 @@ fn glob_enum_group() {
"###
);
}
#[test]
fn glob_shadowed_def() {
let db = TestDB::with_files(
r###"
//- /lib.rs
mod foo;
mod bar;
use foo::*;
use bar::Baz;
//- /foo.rs
pub struct Baz;
//- /bar.rs
pub struct Baz;
"###,
);
let krate = db.test_crate();
let crate_def_map = db.crate_def_map(krate);
let (_, root_module) = crate_def_map
.modules
.iter()
.find(|(_, module_data)| module_data.parent.is_none())
.expect("Root module not found");
let visible_entries = root_module.scope.entries().collect::<Vec<_>>();
insta::assert_debug_snapshot!(
visible_entries,
@r###"
[
(
Name(
Text(
"Baz",
),
),
PerNs {
types: Some(
(
AdtId(
StructId(
StructId(
1,
),
),
),
Module(
ModuleId {
krate: CrateId(
0,
),
local_id: Idx::<ModuleData>(0),
},
),
),
),
values: Some(
(
AdtId(
StructId(
StructId(
1,
),
),
),
Module(
ModuleId {
krate: CrateId(
0,
),
local_id: Idx::<ModuleData>(0),
},
),
),
),
macros: None,
},
),
(
Name(
Text(
"bar",
),
),
PerNs {
types: Some(
(
ModuleId(
ModuleId {
krate: CrateId(
0,
),
local_id: Idx::<ModuleData>(2),
},
),
Module(
ModuleId {
krate: CrateId(
0,
),
local_id: Idx::<ModuleData>(0),
},
),
),
),
values: None,
macros: None,
},
),
(
Name(
Text(
"foo",
),
),
PerNs {
types: Some(
(
ModuleId(
ModuleId {
krate: CrateId(
0,
),
local_id: Idx::<ModuleData>(1),
},
),
Module(
ModuleId {
krate: CrateId(
0,
),
local_id: Idx::<ModuleData>(0),
},
),
),
),
values: None,
macros: None,
},
),
]
"###
);
}