]> git.lizzy.rs Git - rust.git/commitdiff
add graph fixture
authorAleksey Kladov <aleksey.kladov@gmail.com>
Mon, 11 Feb 2019 10:11:24 +0000 (13:11 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Mon, 11 Feb 2019 10:47:17 +0000 (13:47 +0300)
crates/ra_hir/src/lib.rs
crates/ra_hir/src/mock.rs
crates/ra_hir/src/nameres/tests.rs

index a9cd955cf05f105512f041a1a599c22b9a944e1e..8ed8c4bdc2976d33ae3a0517a59bcddd8d6c7475 100644 (file)
@@ -18,6 +18,7 @@ fn from(it: $v) -> $e {
 }
 
 pub mod db;
+#[macro_use]
 pub mod mock;
 mod query_definitions;
 mod path;
index 29b696afa33b97f402795a57140f18ae4cdc7817..5ca87086753c7cd9782adcafeefdb71370f931f0 100644 (file)
@@ -55,6 +55,24 @@ pub fn file_id_of(&self, path: &str) -> FileId {
         }
     }
 
+    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 @@ pub fn log_executed(&self, f: impl FnOnce()) -> Vec<String> {
             .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
+    }}
+}
index 905c3accf2a243f5e1a28d73c79fbb1995029e4a..9b621fbc27ead15849aa0149a67545c93b7089e6 100644 (file)
@@ -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 @@ pub mod b {
             }
         }
 
-        //- 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
         ",
     );
 }