mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-15 09:27:27 +00:00
add graph fixture
This commit is contained in:
parent
dced2f4ed4
commit
9923383d53
3 changed files with 81 additions and 71 deletions
|
@ -18,6 +18,7 @@ macro_rules! impl_froms {
|
|||
}
|
||||
|
||||
pub mod db;
|
||||
#[macro_use]
|
||||
pub mod mock;
|
||||
mod query_definitions;
|
||||
mod path;
|
||||
|
|
|
@ -55,6 +55,24 @@ impl MockDatabase {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn set_crate_graph_from_fixture(&mut self, graph: CrateGraphFixture) {
|
||||
let mut ids = FxHashMap::default();
|
||||
let mut crate_graph = CrateGraph::default();
|
||||
for (crate_name, (crate_root, _)) in graph.0.iter() {
|
||||
let crate_root = self.file_id_of(&crate_root);
|
||||
let crate_id = crate_graph.add_crate_root(crate_root);
|
||||
ids.insert(crate_name, crate_id);
|
||||
}
|
||||
for (crate_name, (_, deps)) in graph.0.iter() {
|
||||
let from = ids[crate_name];
|
||||
for dep in deps {
|
||||
let to = ids[dep];
|
||||
crate_graph.add_dep(from, dep.as_str().into(), to).unwrap();
|
||||
}
|
||||
}
|
||||
self.set_crate_graph(Arc::new(crate_graph))
|
||||
}
|
||||
|
||||
fn from_fixture(fixture: &str) -> (MockDatabase, Option<FilePosition>) {
|
||||
let mut db = MockDatabase::default();
|
||||
|
||||
|
@ -212,3 +230,20 @@ impl MockDatabase {
|
|||
.collect()
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct CrateGraphFixture(pub FxHashMap<String, (String, Vec<String>)>);
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! crate_graph {
|
||||
($($crate_name:literal: ($crate_path:literal, [$($dep:literal),*]),)*) => {{
|
||||
let mut res = $crate::mock::CrateGraphFixture::default();
|
||||
$(
|
||||
res.0.insert(
|
||||
$crate_name.to_string(),
|
||||
($crate_path.to_string(), vec![$($dep.to_string()),*])
|
||||
);
|
||||
)*
|
||||
res
|
||||
}}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
use std::sync::Arc;
|
||||
|
||||
use ra_db::{CrateGraph, SourceDatabase};
|
||||
use ra_db::SourceDatabase;
|
||||
use test_utils::{assert_eq_text, covers};
|
||||
|
||||
use crate::{
|
||||
|
@ -19,20 +19,6 @@ fn item_map(fixture: &str) -> (Arc<ItemMap>, ModuleId) {
|
|||
(db.item_map(krate), module_id)
|
||||
}
|
||||
|
||||
/// Sets the crate root to the file of the cursor marker
|
||||
fn item_map_custom_crate_root(fixture: &str) -> (Arc<ItemMap>, ModuleId) {
|
||||
let (mut db, pos) = MockDatabase::with_position(fixture);
|
||||
|
||||
let mut crate_graph = CrateGraph::default();
|
||||
crate_graph.add_crate_root(pos.file_id);
|
||||
db.set_crate_graph(Arc::new(crate_graph));
|
||||
|
||||
let module = crate::source_binder::module_from_position(&db, pos).unwrap();
|
||||
let krate = module.krate(&db).unwrap();
|
||||
let module_id = module.module_id;
|
||||
(db.item_map(krate), module_id)
|
||||
}
|
||||
|
||||
fn check_module_item_map(map: &ItemMap, module_id: ModuleId, expected: &str) {
|
||||
let mut lines = map[module_id]
|
||||
.items
|
||||
|
@ -258,17 +244,13 @@ fn glob_across_crates() {
|
|||
|
||||
//- /lib.rs
|
||||
pub struct Baz;
|
||||
",
|
||||
",
|
||||
);
|
||||
db.set_crate_graph_from_fixture(crate_graph! {
|
||||
"main": ("/main.rs", ["test_crate"]),
|
||||
"test_crate": ("/lib.rs", []),
|
||||
});
|
||||
let main_id = db.file_id_of("/main.rs");
|
||||
let lib_id = db.file_id_of("/lib.rs");
|
||||
|
||||
let mut crate_graph = CrateGraph::default();
|
||||
let main_crate = crate_graph.add_crate_root(main_id);
|
||||
let lib_crate = crate_graph.add_crate_root(lib_id);
|
||||
crate_graph.add_dep(main_crate, "test_crate".into(), lib_crate).unwrap();
|
||||
|
||||
db.set_crate_graph(Arc::new(crate_graph));
|
||||
|
||||
let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
|
||||
let krate = module.krate(&db).unwrap();
|
||||
|
@ -285,22 +267,31 @@ fn glob_across_crates() {
|
|||
|
||||
#[test]
|
||||
fn module_resolution_works_for_non_standard_filenames() {
|
||||
let (item_map, module_id) = item_map_custom_crate_root(
|
||||
let mut db = MockDatabase::with_files(
|
||||
"
|
||||
//- /my_library.rs
|
||||
mod foo;
|
||||
use self::foo::Bar;
|
||||
<|>
|
||||
|
||||
//- /foo/mod.rs
|
||||
pub struct Bar;
|
||||
",
|
||||
",
|
||||
);
|
||||
db.set_crate_graph_from_fixture(crate_graph! {
|
||||
"my_library": ("/my_library.rs", []),
|
||||
});
|
||||
let file_id = db.file_id_of("/my_library.rs");
|
||||
|
||||
let module = crate::source_binder::module_from_file_id(&db, file_id).unwrap();
|
||||
let krate = module.krate(&db).unwrap();
|
||||
let module_id = module.module_id;
|
||||
let item_map = db.item_map(krate);
|
||||
check_module_item_map(
|
||||
&item_map,
|
||||
module_id,
|
||||
"
|
||||
Bar: t v
|
||||
foo: t
|
||||
Bar: t v
|
||||
foo: t
|
||||
",
|
||||
);
|
||||
}
|
||||
|
@ -417,17 +408,13 @@ fn item_map_across_crates() {
|
|||
|
||||
//- /lib.rs
|
||||
pub struct Baz;
|
||||
",
|
||||
",
|
||||
);
|
||||
db.set_crate_graph_from_fixture(crate_graph! {
|
||||
"main": ("/main.rs", ["test_crate"]),
|
||||
"test_crate": ("/lib.rs", []),
|
||||
});
|
||||
let main_id = db.file_id_of("/main.rs");
|
||||
let lib_id = db.file_id_of("/lib.rs");
|
||||
|
||||
let mut crate_graph = CrateGraph::default();
|
||||
let main_crate = crate_graph.add_crate_root(main_id);
|
||||
let lib_crate = crate_graph.add_crate_root(lib_id);
|
||||
crate_graph.add_dep(main_crate, "test_crate".into(), lib_crate).unwrap();
|
||||
|
||||
db.set_crate_graph(Arc::new(crate_graph));
|
||||
|
||||
let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
|
||||
let krate = module.krate(&db).unwrap();
|
||||
|
@ -437,7 +424,7 @@ fn item_map_across_crates() {
|
|||
&item_map,
|
||||
module.module_id,
|
||||
"
|
||||
Baz: t v
|
||||
Baz: t v
|
||||
",
|
||||
);
|
||||
}
|
||||
|
@ -457,18 +444,13 @@ fn extern_crate_rename() {
|
|||
|
||||
//- /lib.rs
|
||||
struct Arc;
|
||||
",
|
||||
",
|
||||
);
|
||||
let main_id = db.file_id_of("/main.rs");
|
||||
db.set_crate_graph_from_fixture(crate_graph! {
|
||||
"main": ("/main.rs", ["alloc"]),
|
||||
"alloc": ("/lib.rs", []),
|
||||
});
|
||||
let sync_id = db.file_id_of("/sync.rs");
|
||||
let lib_id = db.file_id_of("/lib.rs");
|
||||
|
||||
let mut crate_graph = CrateGraph::default();
|
||||
let main_crate = crate_graph.add_crate_root(main_id);
|
||||
let lib_crate = crate_graph.add_crate_root(lib_id);
|
||||
crate_graph.add_dep(main_crate, "alloc".into(), lib_crate).unwrap();
|
||||
|
||||
db.set_crate_graph(Arc::new(crate_graph));
|
||||
|
||||
let module = crate::source_binder::module_from_file_id(&db, sync_id).unwrap();
|
||||
let krate = module.krate(&db).unwrap();
|
||||
|
@ -478,7 +460,7 @@ fn extern_crate_rename() {
|
|||
&item_map,
|
||||
module.module_id,
|
||||
"
|
||||
Arc: t v
|
||||
Arc: t v
|
||||
",
|
||||
);
|
||||
}
|
||||
|
@ -494,21 +476,17 @@ fn import_across_source_roots() {
|
|||
}
|
||||
}
|
||||
|
||||
//- root /test_crate/
|
||||
//- root /main/
|
||||
|
||||
//- /test_crate/main.rs
|
||||
//- /main/main.rs
|
||||
use test_crate::a::b::C;
|
||||
",
|
||||
);
|
||||
let lib_id = db.file_id_of("/lib.rs");
|
||||
let main_id = db.file_id_of("/test_crate/main.rs");
|
||||
|
||||
let mut crate_graph = CrateGraph::default();
|
||||
let main_crate = crate_graph.add_crate_root(main_id);
|
||||
let lib_crate = crate_graph.add_crate_root(lib_id);
|
||||
crate_graph.add_dep(main_crate, "test_crate".into(), lib_crate).unwrap();
|
||||
|
||||
db.set_crate_graph(Arc::new(crate_graph));
|
||||
db.set_crate_graph_from_fixture(crate_graph! {
|
||||
"main": ("/main/main.rs", ["test_crate"]),
|
||||
"test_crate": ("/lib.rs", []),
|
||||
});
|
||||
let main_id = db.file_id_of("/main/main.rs");
|
||||
|
||||
let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
|
||||
let krate = module.krate(&db).unwrap();
|
||||
|
@ -537,17 +515,13 @@ fn reexport_across_crates() {
|
|||
|
||||
//- /foo.rs
|
||||
pub struct Baz;
|
||||
",
|
||||
",
|
||||
);
|
||||
db.set_crate_graph_from_fixture(crate_graph! {
|
||||
"main": ("/main.rs", ["test_crate"]),
|
||||
"test_crate": ("/lib.rs", []),
|
||||
});
|
||||
let main_id = db.file_id_of("/main.rs");
|
||||
let lib_id = db.file_id_of("/lib.rs");
|
||||
|
||||
let mut crate_graph = CrateGraph::default();
|
||||
let main_crate = crate_graph.add_crate_root(main_id);
|
||||
let lib_crate = crate_graph.add_crate_root(lib_id);
|
||||
crate_graph.add_dep(main_crate, "test_crate".into(), lib_crate).unwrap();
|
||||
|
||||
db.set_crate_graph(Arc::new(crate_graph));
|
||||
|
||||
let module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
|
||||
let krate = module.krate(&db).unwrap();
|
||||
|
@ -557,7 +531,7 @@ fn reexport_across_crates() {
|
|||
&item_map,
|
||||
module.module_id,
|
||||
"
|
||||
Baz: t v
|
||||
Baz: t v
|
||||
",
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue