}
}
+ 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();
.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
+ }}
+}
use std::sync::Arc;
-use ra_db::{CrateGraph, SourceDatabase};
+use ra_db::SourceDatabase;
use test_utils::{assert_eq_text, covers};
use crate::{
(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
//- /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();
#[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
",
);
}
//- /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();
&item_map,
module.module_id,
"
- Baz: t v
+ Baz: t v
",
);
}
//- /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();
&item_map,
module.module_id,
"
- Arc: t v
+ Arc: t v
",
);
}
}
}
- //- 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();
//- /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();
&item_map,
module.module_id,
"
- Baz: t v
+ Baz: t v
",
);
}