Use a macro in push_res to simplify code, simplify glob_shadowed_def assertion

This commit is contained in:
Paul Daniel Faria 2020-06-24 08:20:41 -04:00
parent 38af81f183
commit dfd79907b8
2 changed files with 47 additions and 160 deletions

View File

@ -5,6 +5,7 @@ use hir_expand::name::Name;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use ra_db::CrateId; use ra_db::CrateId;
use rustc_hash::FxHashMap; use rustc_hash::FxHashMap;
use test_utils::mark;
use crate::{ use crate::{
db::DefDatabase, per_ns::PerNs, visibility::Visibility, AdtId, BuiltinType, HasModule, ImplId, db::DefDatabase, per_ns::PerNs, visibility::Visibility, AdtId, BuiltinType, HasModule, ImplId,
@ -126,41 +127,26 @@ impl ItemScope {
let mut changed = false; let mut changed = false;
let existing = self.visible.entry(name).or_default(); let existing = self.visible.entry(name).or_default();
match (existing.types, def.types) { macro_rules! check_changed {
(None, Some(_)) => { ($changed:ident, $existing:expr, $def:expr) => {
existing.types = def.types; match ($existing, $def) {
changed = true; (None, Some(_)) => {
} $existing = $def;
(Some(e), Some(d)) if e.0 != d.0 => { $changed = true;
existing.types = def.types; }
changed = true; (Some(e), Some(d)) if e.0 != d.0 => {
} mark::hit!(import_shadowed);
_ => {} $existing = $def;
$changed = true;
}
_ => {}
}
};
} }
match (existing.values, def.values) { check_changed!(changed, existing.types, def.types);
(None, Some(_)) => { check_changed!(changed, existing.values, def.values);
existing.values = def.values; check_changed!(changed, existing.macros, def.macros);
changed = true;
}
(Some(e), Some(d)) if e.0 != d.0 => {
existing.values = def.values;
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 changed
} }

View File

@ -232,146 +232,47 @@ fn glob_enum_group() {
#[test] #[test]
fn glob_shadowed_def() { fn glob_shadowed_def() {
let db = TestDB::with_files( mark::check!(import_shadowed);
let map = def_map(
r###" r###"
//- /lib.rs //- /lib.rs
mod foo; mod foo;
mod bar; mod bar;
use foo::*; use foo::*;
use bar::Baz; use bar::baz;
use baz::Bar;
//- /foo.rs //- /foo.rs
pub struct Baz; pub mod baz {
pub struct Foo;
}
//- /bar.rs //- /bar.rs
pub struct Baz; pub mod baz {
pub struct Bar;
}
"###, "###,
); );
let krate = db.test_crate(); assert_snapshot!(map, @r###"
crate
Bar: t v
bar: t
baz: t
foo: t
let crate_def_map = db.crate_def_map(krate); crate::bar
let (_, root_module) = crate_def_map baz: t
.modules
.iter() crate::bar::baz
.find(|(_, module_data)| module_data.parent.is_none()) Bar: t v
.expect("Root module not found");
let visible_entries = root_module.scope.entries().collect::<Vec<_>>(); crate::foo
insta::assert_debug_snapshot!( baz: t
visible_entries,
@r###" crate::foo::baz
[ Foo: t v
(
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,
},
),
]
"### "###
); );
} }