mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 11:07:42 +00:00
Use a macro in push_res to simplify code, simplify glob_shadowed_def assertion
This commit is contained in:
parent
38af81f183
commit
dfd79907b8
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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,
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
"###
|
"###
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user