add graph fixture

This commit is contained in:
Aleksey Kladov 2019-02-11 13:11:24 +03:00
parent dced2f4ed4
commit 9923383d53
3 changed files with 81 additions and 71 deletions

View File

@ -18,6 +18,7 @@ macro_rules! impl_froms {
} }
pub mod db; pub mod db;
#[macro_use]
pub mod mock; pub mod mock;
mod query_definitions; mod query_definitions;
mod path; mod path;

View File

@ -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>) { fn from_fixture(fixture: &str) -> (MockDatabase, Option<FilePosition>) {
let mut db = MockDatabase::default(); let mut db = MockDatabase::default();
@ -212,3 +230,20 @@ impl MockDatabase {
.collect() .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
}}
}

View File

@ -1,6 +1,6 @@
use std::sync::Arc; use std::sync::Arc;
use ra_db::{CrateGraph, SourceDatabase}; use ra_db::SourceDatabase;
use test_utils::{assert_eq_text, covers}; use test_utils::{assert_eq_text, covers};
use crate::{ use crate::{
@ -19,20 +19,6 @@ fn item_map(fixture: &str) -> (Arc<ItemMap>, ModuleId) {
(db.item_map(krate), module_id) (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) { fn check_module_item_map(map: &ItemMap, module_id: ModuleId, expected: &str) {
let mut lines = map[module_id] let mut lines = map[module_id]
.items .items
@ -258,17 +244,13 @@ fn glob_across_crates() {
//- /lib.rs //- /lib.rs
pub struct Baz; 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 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 module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
let krate = module.krate(&db).unwrap(); let krate = module.krate(&db).unwrap();
@ -285,22 +267,31 @@ fn glob_across_crates() {
#[test] #[test]
fn module_resolution_works_for_non_standard_filenames() { 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 //- /my_library.rs
mod foo; mod foo;
use self::foo::Bar; use self::foo::Bar;
<|>
//- /foo/mod.rs //- /foo/mod.rs
pub struct Bar; 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( check_module_item_map(
&item_map, &item_map,
module_id, module_id,
" "
Bar: t v Bar: t v
foo: t foo: t
", ",
); );
} }
@ -417,17 +408,13 @@ fn item_map_across_crates() {
//- /lib.rs //- /lib.rs
pub struct Baz; 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 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 module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
let krate = module.krate(&db).unwrap(); let krate = module.krate(&db).unwrap();
@ -437,7 +424,7 @@ fn item_map_across_crates() {
&item_map, &item_map,
module.module_id, module.module_id,
" "
Baz: t v Baz: t v
", ",
); );
} }
@ -457,18 +444,13 @@ fn extern_crate_rename() {
//- /lib.rs //- /lib.rs
struct Arc; 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 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 module = crate::source_binder::module_from_file_id(&db, sync_id).unwrap();
let krate = module.krate(&db).unwrap(); let krate = module.krate(&db).unwrap();
@ -478,7 +460,7 @@ fn extern_crate_rename() {
&item_map, &item_map,
module.module_id, 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; use test_crate::a::b::C;
", ",
); );
let lib_id = db.file_id_of("/lib.rs"); db.set_crate_graph_from_fixture(crate_graph! {
let main_id = db.file_id_of("/test_crate/main.rs"); "main": ("/main/main.rs", ["test_crate"]),
"test_crate": ("/lib.rs", []),
let mut crate_graph = CrateGraph::default(); });
let main_crate = crate_graph.add_crate_root(main_id); let main_id = db.file_id_of("/main/main.rs");
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 module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
let krate = module.krate(&db).unwrap(); let krate = module.krate(&db).unwrap();
@ -537,17 +515,13 @@ fn reexport_across_crates() {
//- /foo.rs //- /foo.rs
pub struct Baz; 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 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 module = crate::source_binder::module_from_file_id(&db, main_id).unwrap();
let krate = module.krate(&db).unwrap(); let krate = module.krate(&db).unwrap();
@ -557,7 +531,7 @@ fn reexport_across_crates() {
&item_map, &item_map,
module.module_id, module.module_id,
" "
Baz: t v Baz: t v
", ",
); );
} }