From 946b0ba02c2ab126b1b1d29027e60f21915d631e Mon Sep 17 00:00:00 2001 From: Florian Diebold Date: Tue, 8 Jan 2019 14:40:41 +0100 Subject: Fix name resolution across source roots It was using the wrong name in that case. --- crates/ra_hir/src/nameres/tests.rs | 97 +++++++++++++++++++++++++++++++++++++- 1 file changed, 96 insertions(+), 1 deletion(-) (limited to 'crates/ra_hir/src/nameres/tests.rs') diff --git a/crates/ra_hir/src/nameres/tests.rs b/crates/ra_hir/src/nameres/tests.rs index 4e3659ad0..c511c40b2 100644 --- a/crates/ra_hir/src/nameres/tests.rs +++ b/crates/ra_hir/src/nameres/tests.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use salsa::Database; -use ra_db::{FilesDatabase, CrateGraph}; +use ra_db::{FilesDatabase, CrateGraph, SourceRootId}; use relative_path::RelativePath; use test_utils::assert_eq_text; @@ -227,6 +227,101 @@ fn item_map_across_crates() { ); } +#[test] +fn import_across_source_roots() { + let (mut db, sr) = MockDatabase::with_files( + " + //- /lib.rs + pub mod a { + pub mod b { + pub struct C; + } + } + ", + ); + let lib_id = sr.files[RelativePath::new("/lib.rs")]; + + let source_root = SourceRootId(1); + + let (sr2, pos) = db.add_fixture( + source_root, + " + //- /main.rs + use test_crate::a::b::C; + ", + ); + assert!(pos.is_none()); + + let main_id = sr2.files[RelativePath::new("/main.rs")]; + + eprintln!("lib = {:?}, main = {:?}", lib_id, main_id); + + 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); + + db.set_crate_graph(crate_graph); + + let module = crate::source_binder::module_from_file_id(&db, main_id) + .unwrap() + .unwrap(); + let module_id = module.def_id.loc(&db).module_id; + let item_map = db.item_map(source_root).unwrap(); + + check_module_item_map( + &item_map, + module_id, + " + C: t v + test_crate: t + ", + ); +} + +#[test] +fn reexport_across_crates() { + let (mut db, sr) = MockDatabase::with_files( + " + //- /main.rs + use test_crate::Baz; + + //- /lib.rs + pub use foo::Baz; + + mod foo; + + //- /foo.rs + pub struct Baz; + ", + ); + let main_id = sr.files[RelativePath::new("/main.rs")]; + let lib_id = sr.files[RelativePath::new("/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); + + db.set_crate_graph(crate_graph); + + let source_root = db.file_source_root(main_id); + let module = crate::source_binder::module_from_file_id(&db, main_id) + .unwrap() + .unwrap(); + let module_id = module.def_id.loc(&db).module_id; + let item_map = db.item_map(source_root).unwrap(); + + check_module_item_map( + &item_map, + module_id, + " + Baz: t v + test_crate: t + ", + ); +} + #[test] fn typing_inside_a_function_should_not_invalidate_item_map() { let (mut db, pos) = MockDatabase::with_position( -- cgit v1.2.3