From 38af81f183504145bd3bf6ba5bc40b3e41e04593 Mon Sep 17 00:00:00 2001 From: Paul Daniel Faria Date: Tue, 23 Jun 2020 22:10:01 -0400 Subject: Account for updated module ids when determining whether a resolution is "changed" --- crates/ra_hir_def/src/item_scope.rs | 41 ++++++-- crates/ra_hir_def/src/nameres/tests/globs.rs | 146 +++++++++++++++++++++++++++ 2 files changed, 178 insertions(+), 9 deletions(-) (limited to 'crates') diff --git a/crates/ra_hir_def/src/item_scope.rs b/crates/ra_hir_def/src/item_scope.rs index b03ba939a..571ba3b8a 100644 --- a/crates/ra_hir_def/src/item_scope.rs +++ b/crates/ra_hir_def/src/item_scope.rs @@ -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 diff --git a/crates/ra_hir_def/src/nameres/tests/globs.rs b/crates/ra_hir_def/src/nameres/tests/globs.rs index 2b12c0daa..f0d85d301 100644 --- a/crates/ra_hir_def/src/nameres/tests/globs.rs +++ b/crates/ra_hir_def/src/nameres/tests/globs.rs @@ -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::>(); + 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::(0), + }, + ), + ), + ), + values: Some( + ( + AdtId( + StructId( + StructId( + 1, + ), + ), + ), + Module( + ModuleId { + krate: CrateId( + 0, + ), + local_id: Idx::(0), + }, + ), + ), + ), + macros: None, + }, + ), + ( + Name( + Text( + "bar", + ), + ), + PerNs { + types: Some( + ( + ModuleId( + ModuleId { + krate: CrateId( + 0, + ), + local_id: Idx::(2), + }, + ), + Module( + ModuleId { + krate: CrateId( + 0, + ), + local_id: Idx::(0), + }, + ), + ), + ), + values: None, + macros: None, + }, + ), + ( + Name( + Text( + "foo", + ), + ), + PerNs { + types: Some( + ( + ModuleId( + ModuleId { + krate: CrateId( + 0, + ), + local_id: Idx::(1), + }, + ), + Module( + ModuleId { + krate: CrateId( + 0, + ), + local_id: Idx::(0), + }, + ), + ), + ), + values: None, + macros: None, + }, + ), + ] + "### + ); +} -- cgit v1.2.3