diff options
author | Aleksey Kladov <[email protected]> | 2019-11-03 20:35:48 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-11-03 20:35:48 +0000 |
commit | 6fba51c5fc05264abcbf971dcf28142746588d74 (patch) | |
tree | edbdbf98b279802ee8dc03f35e941943e1e20e10 | |
parent | 0933d914a37c4ab57fda6fe95464d194dab6f80c (diff) |
move crate_def_map tests to hir_def
-rw-r--r-- | Cargo.lock | 1 | ||||
-rw-r--r-- | crates/ra_db/src/fixture.rs | 148 | ||||
-rw-r--r-- | crates/ra_db/src/input.rs | 1 | ||||
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 3 | ||||
-rw-r--r-- | crates/ra_hir_def/Cargo.toml | 4 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres.rs | 3 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests.rs (renamed from crates/ra_hir/src/nameres/tests.rs) | 145 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests/globs.rs (renamed from crates/ra_hir/src/nameres/tests/globs.rs) | 10 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests/incremental.rs (renamed from crates/ra_hir/src/nameres/tests/incremental.rs) | 25 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests/macros.rs (renamed from crates/ra_hir/src/nameres/tests/macros.rs) | 83 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests/mod_resolution.rs (renamed from crates/ra_hir/src/nameres/tests/mod_resolution.rs) | 45 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests/primitives.rs (renamed from crates/ra_hir/src/nameres/tests/primitives.rs) | 0 | ||||
-rw-r--r-- | crates/ra_hir_def/src/test_db.rs | 36 |
13 files changed, 309 insertions, 195 deletions
diff --git a/Cargo.lock b/Cargo.lock index c96e0869c..889820c99 100644 --- a/Cargo.lock +++ b/Cargo.lock | |||
@@ -1028,6 +1028,7 @@ dependencies = [ | |||
1028 | name = "ra_hir_def" | 1028 | name = "ra_hir_def" |
1029 | version = "0.1.0" | 1029 | version = "0.1.0" |
1030 | dependencies = [ | 1030 | dependencies = [ |
1031 | "insta 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", | ||
1031 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", | 1032 | "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", |
1032 | "once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", | 1033 | "once_cell 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", |
1033 | "ra_arena 0.1.0", | 1034 | "ra_arena 0.1.0", |
diff --git a/crates/ra_db/src/fixture.rs b/crates/ra_db/src/fixture.rs index 469251fe9..f5dd59f84 100644 --- a/crates/ra_db/src/fixture.rs +++ b/crates/ra_db/src/fixture.rs | |||
@@ -3,9 +3,12 @@ | |||
3 | use std::sync::Arc; | 3 | use std::sync::Arc; |
4 | 4 | ||
5 | use ra_cfg::CfgOptions; | 5 | use ra_cfg::CfgOptions; |
6 | use rustc_hash::FxHashMap; | ||
7 | use test_utils::{extract_offset, parse_fixture, CURSOR_MARKER}; | ||
6 | 8 | ||
7 | use crate::{ | 9 | use crate::{ |
8 | CrateGraph, Edition, FileId, RelativePathBuf, SourceDatabaseExt, SourceRoot, SourceRootId, | 10 | CrateGraph, Edition, FileId, FilePosition, RelativePathBuf, SourceDatabaseExt, SourceRoot, |
11 | SourceRootId, | ||
9 | }; | 12 | }; |
10 | 13 | ||
11 | pub const WORKSPACE: SourceRootId = SourceRootId(0); | 14 | pub const WORKSPACE: SourceRootId = SourceRootId(0); |
@@ -16,6 +19,19 @@ pub trait WithFixture: Default + SourceDatabaseExt + 'static { | |||
16 | let file_id = with_single_file(&mut db, text); | 19 | let file_id = with_single_file(&mut db, text); |
17 | (db, file_id) | 20 | (db, file_id) |
18 | } | 21 | } |
22 | |||
23 | fn with_files(fixture: &str) -> Self { | ||
24 | let mut db = Self::default(); | ||
25 | let pos = with_files(&mut db, fixture); | ||
26 | assert!(pos.is_none()); | ||
27 | db | ||
28 | } | ||
29 | |||
30 | fn with_position(fixture: &str) -> (Self, FilePosition) { | ||
31 | let mut db = Self::default(); | ||
32 | let pos = with_files(&mut db, fixture); | ||
33 | (db, pos.unwrap()) | ||
34 | } | ||
19 | } | 35 | } |
20 | 36 | ||
21 | impl<DB: SourceDatabaseExt + Default + 'static> WithFixture for DB {} | 37 | impl<DB: SourceDatabaseExt + Default + 'static> WithFixture for DB {} |
@@ -38,3 +54,133 @@ fn with_single_file(db: &mut dyn SourceDatabaseExt, text: &str) -> FileId { | |||
38 | 54 | ||
39 | file_id | 55 | file_id |
40 | } | 56 | } |
57 | |||
58 | fn with_files(db: &mut dyn SourceDatabaseExt, fixture: &str) -> Option<FilePosition> { | ||
59 | let fixture = parse_fixture(fixture); | ||
60 | |||
61 | let mut crate_graph = CrateGraph::default(); | ||
62 | let mut crates = FxHashMap::default(); | ||
63 | let mut crate_deps = Vec::new(); | ||
64 | let mut default_crate_root: Option<FileId> = None; | ||
65 | |||
66 | let mut source_root = SourceRoot::default(); | ||
67 | let mut source_root_id = WORKSPACE; | ||
68 | let mut source_root_prefix: RelativePathBuf = "/".into(); | ||
69 | let mut file_id = FileId(0); | ||
70 | |||
71 | let mut file_position = None; | ||
72 | |||
73 | for entry in fixture.iter() { | ||
74 | let meta = match parse_meta(&entry.meta) { | ||
75 | ParsedMeta::Root { path } => { | ||
76 | let source_root = std::mem::replace(&mut source_root, SourceRoot::default()); | ||
77 | db.set_source_root(source_root_id, Arc::new(source_root)); | ||
78 | source_root_id.0 += 1; | ||
79 | source_root_prefix = path; | ||
80 | continue; | ||
81 | } | ||
82 | ParsedMeta::File(it) => it, | ||
83 | }; | ||
84 | assert!(meta.path.starts_with(&source_root_prefix)); | ||
85 | |||
86 | if let Some(krate) = meta.krate { | ||
87 | let crate_id = crate_graph.add_crate_root(file_id, meta.edition, meta.cfg); | ||
88 | let prev = crates.insert(krate.clone(), crate_id); | ||
89 | assert!(prev.is_none()); | ||
90 | for dep in meta.deps { | ||
91 | crate_deps.push((krate.clone(), dep)) | ||
92 | } | ||
93 | } else if meta.path == "/main.rs" || meta.path == "/lib.rs" { | ||
94 | assert!(default_crate_root.is_none()); | ||
95 | default_crate_root = Some(file_id); | ||
96 | } | ||
97 | |||
98 | let text = if entry.text.contains(CURSOR_MARKER) { | ||
99 | let (offset, text) = extract_offset(&entry.text); | ||
100 | assert!(file_position.is_none()); | ||
101 | file_position = Some(FilePosition { file_id, offset }); | ||
102 | text.to_string() | ||
103 | } else { | ||
104 | entry.text.to_string() | ||
105 | }; | ||
106 | |||
107 | db.set_file_text(file_id, Arc::new(text)); | ||
108 | db.set_file_relative_path(file_id, meta.path.clone()); | ||
109 | db.set_file_source_root(file_id, source_root_id); | ||
110 | source_root.insert_file(meta.path, file_id); | ||
111 | |||
112 | file_id.0 += 1; | ||
113 | } | ||
114 | |||
115 | if crates.is_empty() { | ||
116 | let crate_root = default_crate_root.unwrap(); | ||
117 | crate_graph.add_crate_root(crate_root, Edition::Edition2018, CfgOptions::default()); | ||
118 | } else { | ||
119 | for (from, to) in crate_deps { | ||
120 | let from_id = crates[&from]; | ||
121 | let to_id = crates[&to]; | ||
122 | crate_graph.add_dep(from_id, to.into(), to_id).unwrap(); | ||
123 | } | ||
124 | } | ||
125 | |||
126 | db.set_source_root(source_root_id, Arc::new(source_root)); | ||
127 | db.set_crate_graph(Arc::new(crate_graph)); | ||
128 | |||
129 | file_position | ||
130 | } | ||
131 | |||
132 | enum ParsedMeta { | ||
133 | Root { path: RelativePathBuf }, | ||
134 | File(FileMeta), | ||
135 | } | ||
136 | |||
137 | struct FileMeta { | ||
138 | path: RelativePathBuf, | ||
139 | krate: Option<String>, | ||
140 | deps: Vec<String>, | ||
141 | cfg: CfgOptions, | ||
142 | edition: Edition, | ||
143 | } | ||
144 | |||
145 | //- /lib.rs crate:foo deps:bar,baz | ||
146 | fn parse_meta(meta: &str) -> ParsedMeta { | ||
147 | let components = meta.split_ascii_whitespace().collect::<Vec<_>>(); | ||
148 | |||
149 | if components[0] == "root" { | ||
150 | let path: RelativePathBuf = components[1].into(); | ||
151 | assert!(path.starts_with("/") && path.ends_with("/")); | ||
152 | return ParsedMeta::Root { path }; | ||
153 | } | ||
154 | |||
155 | let path: RelativePathBuf = components[0].into(); | ||
156 | assert!(path.starts_with("/")); | ||
157 | |||
158 | let mut krate = None; | ||
159 | let mut deps = Vec::new(); | ||
160 | let mut edition = Edition::Edition2018; | ||
161 | let mut cfg = CfgOptions::default(); | ||
162 | for component in components[1..].iter() { | ||
163 | let (key, value) = split1(component, ':').unwrap(); | ||
164 | match key { | ||
165 | "crate" => krate = Some(value.to_string()), | ||
166 | "deps" => deps = value.split(',').map(|it| it.to_string()).collect(), | ||
167 | "edition" => edition = Edition::from_string(&value), | ||
168 | "cfg" => { | ||
169 | for key in value.split(',') { | ||
170 | match split1(key, '=') { | ||
171 | None => cfg.insert_atom(key.into()), | ||
172 | Some((k, v)) => cfg.insert_key_value(k.into(), v.into()), | ||
173 | } | ||
174 | } | ||
175 | } | ||
176 | _ => panic!("bad component: {:?}", component), | ||
177 | } | ||
178 | } | ||
179 | |||
180 | ParsedMeta::File(FileMeta { path, krate, deps, edition, cfg }) | ||
181 | } | ||
182 | |||
183 | fn split1(haystack: &str, delim: char) -> Option<(&str, &str)> { | ||
184 | let idx = haystack.find(delim)?; | ||
185 | Some((&haystack[..idx], &haystack[idx + delim.len_utf8()..])) | ||
186 | } | ||
diff --git a/crates/ra_db/src/input.rs b/crates/ra_db/src/input.rs index eafa95921..7c8dac1d3 100644 --- a/crates/ra_db/src/input.rs +++ b/crates/ra_db/src/input.rs | |||
@@ -97,6 +97,7 @@ pub enum Edition { | |||
97 | } | 97 | } |
98 | 98 | ||
99 | impl Edition { | 99 | impl Edition { |
100 | //FIXME: replace with FromStr with proper error handling | ||
100 | pub fn from_string(s: &str) -> Edition { | 101 | pub fn from_string(s: &str) -> Edition { |
101 | match s { | 102 | match s { |
102 | "2015" => Edition::Edition2015, | 103 | "2015" => Edition::Edition2015, |
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs index bb775cfc9..875addc84 100644 --- a/crates/ra_hir/src/nameres.rs +++ b/crates/ra_hir/src/nameres.rs | |||
@@ -47,9 +47,6 @@ | |||
47 | //! path and, upon success, we run macro expansion and "collect module" phase | 47 | //! path and, upon success, we run macro expansion and "collect module" phase |
48 | //! on the result | 48 | //! on the result |
49 | 49 | ||
50 | #[cfg(test)] | ||
51 | mod tests; | ||
52 | |||
53 | pub use hir_def::nameres::{ | 50 | pub use hir_def::nameres::{ |
54 | per_ns::{Namespace, PerNs}, | 51 | per_ns::{Namespace, PerNs}, |
55 | raw::ImportId, | 52 | raw::ImportId, |
diff --git a/crates/ra_hir_def/Cargo.toml b/crates/ra_hir_def/Cargo.toml index 746c907e8..15055db64 100644 --- a/crates/ra_hir_def/Cargo.toml +++ b/crates/ra_hir_def/Cargo.toml | |||
@@ -19,3 +19,7 @@ test_utils = { path = "../test_utils" } | |||
19 | mbe = { path = "../ra_mbe", package = "ra_mbe" } | 19 | mbe = { path = "../ra_mbe", package = "ra_mbe" } |
20 | ra_cfg = { path = "../ra_cfg" } | 20 | ra_cfg = { path = "../ra_cfg" } |
21 | tt = { path = "../ra_tt", package = "ra_tt" } | 21 | tt = { path = "../ra_tt", package = "ra_tt" } |
22 | |||
23 | [dev-dependencies] | ||
24 | insta = "0.12.0" | ||
25 | |||
diff --git a/crates/ra_hir_def/src/nameres.rs b/crates/ra_hir_def/src/nameres.rs index db59344aa..b3640da3d 100644 --- a/crates/ra_hir_def/src/nameres.rs +++ b/crates/ra_hir_def/src/nameres.rs | |||
@@ -6,6 +6,9 @@ pub mod per_ns; | |||
6 | pub mod collector; | 6 | pub mod collector; |
7 | pub mod mod_resolution; | 7 | pub mod mod_resolution; |
8 | 8 | ||
9 | #[cfg(test)] | ||
10 | mod tests; | ||
11 | |||
9 | use std::sync::Arc; | 12 | use std::sync::Arc; |
10 | 13 | ||
11 | use hir_expand::{diagnostics::DiagnosticSink, name::Name, MacroDefId}; | 14 | use hir_expand::{diagnostics::DiagnosticSink, name::Name, MacroDefId}; |
diff --git a/crates/ra_hir/src/nameres/tests.rs b/crates/ra_hir_def/src/nameres/tests.rs index 02db91a86..f9a8edd43 100644 --- a/crates/ra_hir/src/nameres/tests.rs +++ b/crates/ra_hir_def/src/nameres/tests.rs | |||
@@ -1,23 +1,24 @@ | |||
1 | mod macros; | ||
2 | mod globs; | 1 | mod globs; |
3 | mod incremental; | 2 | mod incremental; |
4 | mod primitives; | 3 | mod macros; |
5 | mod mod_resolution; | 4 | mod mod_resolution; |
5 | mod primitives; | ||
6 | 6 | ||
7 | use std::sync::Arc; | 7 | use std::sync::Arc; |
8 | 8 | ||
9 | use hir_def::{db::DefDatabase2, nameres::*, CrateModuleId}; | ||
10 | use insta::assert_snapshot; | 9 | use insta::assert_snapshot; |
11 | use ra_db::SourceDatabase; | 10 | use ra_db::{fixture::WithFixture, SourceDatabase}; |
12 | // use test_utils::covers; | 11 | // use test_utils::covers; |
13 | 12 | ||
14 | use crate::mock::{CrateGraphFixture, MockDatabase}; | 13 | use crate::{db::DefDatabase2, nameres::*, test_db::TestDB, CrateModuleId}; |
15 | 14 | ||
16 | fn compute_crate_def_map(fixture: &str, graph: Option<CrateGraphFixture>) -> Arc<CrateDefMap> { | 15 | fn def_map(fixtute: &str) -> String { |
17 | let mut db = MockDatabase::with_files(fixture); | 16 | let dm = compute_crate_def_map(fixtute); |
18 | if let Some(graph) = graph { | 17 | render_crate_def_map(&dm) |
19 | db.set_crate_graph_from_fixture(graph); | 18 | } |
20 | } | 19 | |
20 | fn compute_crate_def_map(fixture: &str) -> Arc<CrateDefMap> { | ||
21 | let db = TestDB::with_files(fixture); | ||
21 | let krate = db.crate_graph().iter().next().unwrap(); | 22 | let krate = db.crate_graph().iter().next().unwrap(); |
22 | db.crate_def_map(krate) | 23 | db.crate_def_map(krate) |
23 | } | 24 | } |
@@ -65,16 +66,6 @@ fn render_crate_def_map(map: &CrateDefMap) -> String { | |||
65 | } | 66 | } |
66 | } | 67 | } |
67 | 68 | ||
68 | fn def_map(fixtute: &str) -> String { | ||
69 | let dm = compute_crate_def_map(fixtute, None); | ||
70 | render_crate_def_map(&dm) | ||
71 | } | ||
72 | |||
73 | fn def_map_with_crate_graph(fixture: &str, graph: CrateGraphFixture) -> String { | ||
74 | let dm = compute_crate_def_map(fixture, Some(graph)); | ||
75 | render_crate_def_map(&dm) | ||
76 | } | ||
77 | |||
78 | #[test] | 69 | #[test] |
79 | fn crate_def_map_smoke_test() { | 70 | fn crate_def_map_smoke_test() { |
80 | let map = def_map( | 71 | let map = def_map( |
@@ -229,12 +220,12 @@ fn re_exports() { | |||
229 | #[test] | 220 | #[test] |
230 | fn std_prelude() { | 221 | fn std_prelude() { |
231 | // covers!(std_prelude); | 222 | // covers!(std_prelude); |
232 | let map = def_map_with_crate_graph( | 223 | let map = def_map( |
233 | " | 224 | " |
234 | //- /main.rs | 225 | //- /main.rs crate:main deps:test_crate |
235 | use Foo::*; | 226 | use Foo::*; |
236 | 227 | ||
237 | //- /lib.rs | 228 | //- /lib.rs crate:test_crate |
238 | mod prelude; | 229 | mod prelude; |
239 | #[prelude_import] | 230 | #[prelude_import] |
240 | use prelude::*; | 231 | use prelude::*; |
@@ -242,10 +233,6 @@ fn std_prelude() { | |||
242 | //- /prelude.rs | 233 | //- /prelude.rs |
243 | pub enum Foo { Bar, Baz }; | 234 | pub enum Foo { Bar, Baz }; |
244 | ", | 235 | ", |
245 | crate_graph! { | ||
246 | "main": ("/main.rs", ["test_crate"]), | ||
247 | "test_crate": ("/lib.rs", []), | ||
248 | }, | ||
249 | ); | 236 | ); |
250 | assert_snapshot!(map, @r###" | 237 | assert_snapshot!(map, @r###" |
251 | ⋮crate | 238 | ⋮crate |
@@ -274,9 +261,9 @@ fn can_import_enum_variant() { | |||
274 | 261 | ||
275 | #[test] | 262 | #[test] |
276 | fn edition_2015_imports() { | 263 | fn edition_2015_imports() { |
277 | let map = def_map_with_crate_graph( | 264 | let map = def_map( |
278 | " | 265 | " |
279 | //- /main.rs | 266 | //- /main.rs crate:main deps:other_crate edition:2015 |
280 | mod foo; | 267 | mod foo; |
281 | mod bar; | 268 | mod bar; |
282 | 269 | ||
@@ -287,13 +274,9 @@ fn edition_2015_imports() { | |||
287 | use bar::Bar; | 274 | use bar::Bar; |
288 | use other_crate::FromLib; | 275 | use other_crate::FromLib; |
289 | 276 | ||
290 | //- /lib.rs | 277 | //- /lib.rs crate:other_crate edition:2018 |
291 | struct FromLib; | 278 | struct FromLib; |
292 | ", | 279 | ", |
293 | crate_graph! { | ||
294 | "main": ("/main.rs", "2015", ["other_crate"]), | ||
295 | "other_crate": ("/lib.rs", "2018", []), | ||
296 | }, | ||
297 | ); | 280 | ); |
298 | 281 | ||
299 | assert_snapshot!(map, @r###" | 282 | assert_snapshot!(map, @r###" |
@@ -338,18 +321,14 @@ fn item_map_using_self() { | |||
338 | 321 | ||
339 | #[test] | 322 | #[test] |
340 | fn item_map_across_crates() { | 323 | fn item_map_across_crates() { |
341 | let map = def_map_with_crate_graph( | 324 | let map = def_map( |
342 | " | 325 | " |
343 | //- /main.rs | 326 | //- /main.rs crate:main deps:test_crate |
344 | use test_crate::Baz; | 327 | use test_crate::Baz; |
345 | 328 | ||
346 | //- /lib.rs | 329 | //- /lib.rs crate:test_crate |
347 | pub struct Baz; | 330 | pub struct Baz; |
348 | ", | 331 | ", |
349 | crate_graph! { | ||
350 | "main": ("/main.rs", ["test_crate"]), | ||
351 | "test_crate": ("/lib.rs", []), | ||
352 | }, | ||
353 | ); | 332 | ); |
354 | 333 | ||
355 | assert_snapshot!(map, @r###" | 334 | assert_snapshot!(map, @r###" |
@@ -360,9 +339,9 @@ fn item_map_across_crates() { | |||
360 | 339 | ||
361 | #[test] | 340 | #[test] |
362 | fn extern_crate_rename() { | 341 | fn extern_crate_rename() { |
363 | let map = def_map_with_crate_graph( | 342 | let map = def_map( |
364 | " | 343 | " |
365 | //- /main.rs | 344 | //- /main.rs crate:main deps:alloc |
366 | extern crate alloc as alloc_crate; | 345 | extern crate alloc as alloc_crate; |
367 | 346 | ||
368 | mod alloc; | 347 | mod alloc; |
@@ -371,13 +350,9 @@ fn extern_crate_rename() { | |||
371 | //- /sync.rs | 350 | //- /sync.rs |
372 | use alloc_crate::Arc; | 351 | use alloc_crate::Arc; |
373 | 352 | ||
374 | //- /lib.rs | 353 | //- /lib.rs crate:alloc |
375 | struct Arc; | 354 | struct Arc; |
376 | ", | 355 | ", |
377 | crate_graph! { | ||
378 | "main": ("/main.rs", ["alloc"]), | ||
379 | "alloc": ("/lib.rs", []), | ||
380 | }, | ||
381 | ); | 356 | ); |
382 | 357 | ||
383 | assert_snapshot!(map, @r###" | 358 | assert_snapshot!(map, @r###" |
@@ -392,9 +367,9 @@ fn extern_crate_rename() { | |||
392 | 367 | ||
393 | #[test] | 368 | #[test] |
394 | fn extern_crate_rename_2015_edition() { | 369 | fn extern_crate_rename_2015_edition() { |
395 | let map = def_map_with_crate_graph( | 370 | let map = def_map( |
396 | " | 371 | " |
397 | //- /main.rs | 372 | //- /main.rs crate:main deps:alloc edition:2015 |
398 | extern crate alloc as alloc_crate; | 373 | extern crate alloc as alloc_crate; |
399 | 374 | ||
400 | mod alloc; | 375 | mod alloc; |
@@ -403,13 +378,9 @@ fn extern_crate_rename_2015_edition() { | |||
403 | //- /sync.rs | 378 | //- /sync.rs |
404 | use alloc_crate::Arc; | 379 | use alloc_crate::Arc; |
405 | 380 | ||
406 | //- /lib.rs | 381 | //- /lib.rs crate:alloc |
407 | struct Arc; | 382 | struct Arc; |
408 | ", | 383 | ", |
409 | crate_graph! { | ||
410 | "main": ("/main.rs", "2015", ["alloc"]), | ||
411 | "alloc": ("/lib.rs", []), | ||
412 | }, | ||
413 | ); | 384 | ); |
414 | 385 | ||
415 | assert_snapshot!(map, | 386 | assert_snapshot!(map, |
@@ -426,24 +397,21 @@ fn extern_crate_rename_2015_edition() { | |||
426 | 397 | ||
427 | #[test] | 398 | #[test] |
428 | fn import_across_source_roots() { | 399 | fn import_across_source_roots() { |
429 | let map = def_map_with_crate_graph( | 400 | let map = def_map( |
430 | " | 401 | " |
431 | //- /lib.rs | 402 | //- /main.rs crate:main deps:test_crate |
403 | use test_crate::a::b::C; | ||
404 | |||
405 | //- root /test_crate/ | ||
406 | |||
407 | //- /test_crate/lib.rs crate:test_crate | ||
432 | pub mod a { | 408 | pub mod a { |
433 | pub mod b { | 409 | pub mod b { |
434 | pub struct C; | 410 | pub struct C; |
435 | } | 411 | } |
436 | } | 412 | } |
437 | 413 | ||
438 | //- root /main/ | ||
439 | |||
440 | //- /main/main.rs | ||
441 | use test_crate::a::b::C; | ||
442 | ", | 414 | ", |
443 | crate_graph! { | ||
444 | "main": ("/main/main.rs", ["test_crate"]), | ||
445 | "test_crate": ("/lib.rs", []), | ||
446 | }, | ||
447 | ); | 415 | ); |
448 | 416 | ||
449 | assert_snapshot!(map, @r###" | 417 | assert_snapshot!(map, @r###" |
@@ -454,12 +422,12 @@ fn import_across_source_roots() { | |||
454 | 422 | ||
455 | #[test] | 423 | #[test] |
456 | fn reexport_across_crates() { | 424 | fn reexport_across_crates() { |
457 | let map = def_map_with_crate_graph( | 425 | let map = def_map( |
458 | " | 426 | " |
459 | //- /main.rs | 427 | //- /main.rs crate:main deps:test_crate |
460 | use test_crate::Baz; | 428 | use test_crate::Baz; |
461 | 429 | ||
462 | //- /lib.rs | 430 | //- /lib.rs crate:test_crate |
463 | pub use foo::Baz; | 431 | pub use foo::Baz; |
464 | 432 | ||
465 | mod foo; | 433 | mod foo; |
@@ -467,10 +435,6 @@ fn reexport_across_crates() { | |||
467 | //- /foo.rs | 435 | //- /foo.rs |
468 | pub struct Baz; | 436 | pub struct Baz; |
469 | ", | 437 | ", |
470 | crate_graph! { | ||
471 | "main": ("/main.rs", ["test_crate"]), | ||
472 | "test_crate": ("/lib.rs", []), | ||
473 | }, | ||
474 | ); | 438 | ); |
475 | 439 | ||
476 | assert_snapshot!(map, @r###" | 440 | assert_snapshot!(map, @r###" |
@@ -481,19 +445,15 @@ fn reexport_across_crates() { | |||
481 | 445 | ||
482 | #[test] | 446 | #[test] |
483 | fn values_dont_shadow_extern_crates() { | 447 | fn values_dont_shadow_extern_crates() { |
484 | let map = def_map_with_crate_graph( | 448 | let map = def_map( |
485 | " | 449 | " |
486 | //- /main.rs | 450 | //- /main.rs crate:main deps:foo |
487 | fn foo() {} | 451 | fn foo() {} |
488 | use foo::Bar; | 452 | use foo::Bar; |
489 | 453 | ||
490 | //- /foo/lib.rs | 454 | //- /foo/lib.rs crate:foo |
491 | pub struct Bar; | 455 | pub struct Bar; |
492 | ", | 456 | ", |
493 | crate_graph! { | ||
494 | "main": ("/main.rs", ["foo"]), | ||
495 | "foo": ("/foo/lib.rs", []), | ||
496 | }, | ||
497 | ); | 457 | ); |
498 | 458 | ||
499 | assert_snapshot!(map, @r###" | 459 | assert_snapshot!(map, @r###" |
@@ -505,11 +465,12 @@ fn values_dont_shadow_extern_crates() { | |||
505 | 465 | ||
506 | #[test] | 466 | #[test] |
507 | fn cfg_not_test() { | 467 | fn cfg_not_test() { |
508 | let map = def_map_with_crate_graph( | 468 | let map = def_map( |
509 | r#" | 469 | r#" |
510 | //- /main.rs | 470 | //- /main.rs crate:main deps:std |
511 | use {Foo, Bar, Baz}; | 471 | use {Foo, Bar, Baz}; |
512 | //- /lib.rs | 472 | |
473 | //- /lib.rs crate:std | ||
513 | #[prelude_import] | 474 | #[prelude_import] |
514 | pub use self::prelude::*; | 475 | pub use self::prelude::*; |
515 | mod prelude { | 476 | mod prelude { |
@@ -521,10 +482,6 @@ fn cfg_not_test() { | |||
521 | pub struct Baz; | 482 | pub struct Baz; |
522 | } | 483 | } |
523 | "#, | 484 | "#, |
524 | crate_graph! { | ||
525 | "main": ("/main.rs", ["std"]), | ||
526 | "std": ("/lib.rs", []), | ||
527 | }, | ||
528 | ); | 485 | ); |
529 | 486 | ||
530 | assert_snapshot!(map, @r###" | 487 | assert_snapshot!(map, @r###" |
@@ -537,11 +494,12 @@ fn cfg_not_test() { | |||
537 | 494 | ||
538 | #[test] | 495 | #[test] |
539 | fn cfg_test() { | 496 | fn cfg_test() { |
540 | let map = def_map_with_crate_graph( | 497 | let map = def_map( |
541 | r#" | 498 | r#" |
542 | //- /main.rs | 499 | //- /main.rs crate:main deps:std |
543 | use {Foo, Bar, Baz}; | 500 | use {Foo, Bar, Baz}; |
544 | //- /lib.rs | 501 | |
502 | //- /lib.rs crate:std cfg:test,feature=foo,feature=bar,opt=42 | ||
545 | #[prelude_import] | 503 | #[prelude_import] |
546 | pub use self::prelude::*; | 504 | pub use self::prelude::*; |
547 | mod prelude { | 505 | mod prelude { |
@@ -553,15 +511,6 @@ fn cfg_test() { | |||
553 | pub struct Baz; | 511 | pub struct Baz; |
554 | } | 512 | } |
555 | "#, | 513 | "#, |
556 | crate_graph! { | ||
557 | "main": ("/main.rs", ["std"]), | ||
558 | "std": ("/lib.rs", [], cfg = { | ||
559 | "test", | ||
560 | "feature" = "foo", | ||
561 | "feature" = "bar", | ||
562 | "opt" = "42", | ||
563 | }), | ||
564 | }, | ||
565 | ); | 514 | ); |
566 | 515 | ||
567 | assert_snapshot!(map, @r###" | 516 | assert_snapshot!(map, @r###" |
diff --git a/crates/ra_hir/src/nameres/tests/globs.rs b/crates/ra_hir_def/src/nameres/tests/globs.rs index b3e4d8d94..cf4a2a851 100644 --- a/crates/ra_hir/src/nameres/tests/globs.rs +++ b/crates/ra_hir_def/src/nameres/tests/globs.rs | |||
@@ -76,18 +76,14 @@ fn glob_2() { | |||
76 | #[test] | 76 | #[test] |
77 | fn glob_across_crates() { | 77 | fn glob_across_crates() { |
78 | // covers!(glob_across_crates); | 78 | // covers!(glob_across_crates); |
79 | let map = def_map_with_crate_graph( | 79 | let map = def_map( |
80 | " | 80 | " |
81 | //- /main.rs | 81 | //- /main.rs crate:main deps:test_crate |
82 | use test_crate::*; | 82 | use test_crate::*; |
83 | 83 | ||
84 | //- /lib.rs | 84 | //- /lib.rs crate:test_crate |
85 | pub struct Baz; | 85 | pub struct Baz; |
86 | ", | 86 | ", |
87 | crate_graph! { | ||
88 | "main": ("/main.rs", ["test_crate"]), | ||
89 | "test_crate": ("/lib.rs", []), | ||
90 | }, | ||
91 | ); | 87 | ); |
92 | assert_snapshot!(map, @r###" | 88 | assert_snapshot!(map, @r###" |
93 | ⋮crate | 89 | ⋮crate |
diff --git a/crates/ra_hir/src/nameres/tests/incremental.rs b/crates/ra_hir_def/src/nameres/tests/incremental.rs index 723ece7b0..80dcec62f 100644 --- a/crates/ra_hir/src/nameres/tests/incremental.rs +++ b/crates/ra_hir_def/src/nameres/tests/incremental.rs | |||
@@ -5,7 +5,7 @@ use ra_db::{SourceDatabase, SourceDatabaseExt}; | |||
5 | use super::*; | 5 | use super::*; |
6 | 6 | ||
7 | fn check_def_map_is_not_recomputed(initial: &str, file_change: &str) { | 7 | fn check_def_map_is_not_recomputed(initial: &str, file_change: &str) { |
8 | let (mut db, pos) = MockDatabase::with_position(initial); | 8 | let (mut db, pos) = TestDB::with_position(initial); |
9 | let krate = db.crate_graph().iter().next().unwrap(); | 9 | let krate = db.crate_graph().iter().next().unwrap(); |
10 | { | 10 | { |
11 | let events = db.log_executed(|| { | 11 | let events = db.log_executed(|| { |
@@ -91,7 +91,7 @@ fn adding_inner_items_should_not_invalidate_def_map() { | |||
91 | 91 | ||
92 | #[test] | 92 | #[test] |
93 | fn typing_inside_a_macro_should_not_invalidate_def_map() { | 93 | fn typing_inside_a_macro_should_not_invalidate_def_map() { |
94 | let (mut db, pos) = MockDatabase::with_position( | 94 | let (mut db, pos) = TestDB::with_position( |
95 | " | 95 | " |
96 | //- /lib.rs | 96 | //- /lib.rs |
97 | macro_rules! m { | 97 | macro_rules! m { |
@@ -111,15 +111,12 @@ fn typing_inside_a_macro_should_not_invalidate_def_map() { | |||
111 | m!(X); | 111 | m!(X); |
112 | ", | 112 | ", |
113 | ); | 113 | ); |
114 | let krate = db.crate_graph().iter().next().unwrap(); | ||
114 | { | 115 | { |
115 | let events = db.log_executed(|| { | 116 | let events = db.log_executed(|| { |
116 | let src = crate::Source { | 117 | let crate_def_map = db.crate_def_map(krate); |
117 | file_id: pos.file_id.into(), | 118 | let (_, module_data) = crate_def_map.modules.iter().last().unwrap(); |
118 | ast: crate::ModuleSource::new(&db, Some(pos.file_id), None), | 119 | assert_eq!(module_data.scope.items.len(), 1); |
119 | }; | ||
120 | let module = crate::Module::from_definition(&db, src).unwrap(); | ||
121 | let decls = module.declarations(&db); | ||
122 | assert_eq!(decls.len(), 18); | ||
123 | }); | 120 | }); |
124 | assert!(format!("{:?}", events).contains("crate_def_map"), "{:#?}", events) | 121 | assert!(format!("{:?}", events).contains("crate_def_map"), "{:#?}", events) |
125 | } | 122 | } |
@@ -127,13 +124,9 @@ fn typing_inside_a_macro_should_not_invalidate_def_map() { | |||
127 | 124 | ||
128 | { | 125 | { |
129 | let events = db.log_executed(|| { | 126 | let events = db.log_executed(|| { |
130 | let src = crate::Source { | 127 | let crate_def_map = db.crate_def_map(krate); |
131 | file_id: pos.file_id.into(), | 128 | let (_, module_data) = crate_def_map.modules.iter().last().unwrap(); |
132 | ast: crate::ModuleSource::new(&db, Some(pos.file_id), None), | 129 | assert_eq!(module_data.scope.items.len(), 1); |
133 | }; | ||
134 | let module = crate::Module::from_definition(&db, src).unwrap(); | ||
135 | let decls = module.declarations(&db); | ||
136 | assert_eq!(decls.len(), 18); | ||
137 | }); | 130 | }); |
138 | assert!(!format!("{:?}", events).contains("crate_def_map"), "{:#?}", events) | 131 | assert!(!format!("{:?}", events).contains("crate_def_map"), "{:#?}", events) |
139 | } | 132 | } |
diff --git a/crates/ra_hir/src/nameres/tests/macros.rs b/crates/ra_hir_def/src/nameres/tests/macros.rs index 78bb0eb0d..9bb3895ad 100644 --- a/crates/ra_hir/src/nameres/tests/macros.rs +++ b/crates/ra_hir_def/src/nameres/tests/macros.rs | |||
@@ -71,16 +71,16 @@ fn macro_rules_can_define_modules() { | |||
71 | 71 | ||
72 | #[test] | 72 | #[test] |
73 | fn macro_rules_from_other_crates_are_visible() { | 73 | fn macro_rules_from_other_crates_are_visible() { |
74 | let map = def_map_with_crate_graph( | 74 | let map = def_map( |
75 | " | 75 | " |
76 | //- /main.rs | 76 | //- /main.rs crate:main deps:foo |
77 | foo::structs!(Foo, Bar) | 77 | foo::structs!(Foo, Bar) |
78 | mod bar; | 78 | mod bar; |
79 | 79 | ||
80 | //- /bar.rs | 80 | //- /bar.rs |
81 | use crate::*; | 81 | use crate::*; |
82 | 82 | ||
83 | //- /lib.rs | 83 | //- /lib.rs crate:foo |
84 | #[macro_export] | 84 | #[macro_export] |
85 | macro_rules! structs { | 85 | macro_rules! structs { |
86 | ($($i:ident),*) => { | 86 | ($($i:ident),*) => { |
@@ -88,10 +88,6 @@ fn macro_rules_from_other_crates_are_visible() { | |||
88 | } | 88 | } |
89 | } | 89 | } |
90 | ", | 90 | ", |
91 | crate_graph! { | ||
92 | "main": ("/main.rs", ["foo"]), | ||
93 | "foo": ("/lib.rs", []), | ||
94 | }, | ||
95 | ); | 91 | ); |
96 | assert_snapshot!(map, @r###" | 92 | assert_snapshot!(map, @r###" |
97 | ⋮crate | 93 | ⋮crate |
@@ -108,16 +104,16 @@ fn macro_rules_from_other_crates_are_visible() { | |||
108 | 104 | ||
109 | #[test] | 105 | #[test] |
110 | fn macro_rules_export_with_local_inner_macros_are_visible() { | 106 | fn macro_rules_export_with_local_inner_macros_are_visible() { |
111 | let map = def_map_with_crate_graph( | 107 | let map = def_map( |
112 | " | 108 | " |
113 | //- /main.rs | 109 | //- /main.rs crate:main deps:foo |
114 | foo::structs!(Foo, Bar) | 110 | foo::structs!(Foo, Bar) |
115 | mod bar; | 111 | mod bar; |
116 | 112 | ||
117 | //- /bar.rs | 113 | //- /bar.rs |
118 | use crate::*; | 114 | use crate::*; |
119 | 115 | ||
120 | //- /lib.rs | 116 | //- /lib.rs crate:foo |
121 | #[macro_export(local_inner_macros)] | 117 | #[macro_export(local_inner_macros)] |
122 | macro_rules! structs { | 118 | macro_rules! structs { |
123 | ($($i:ident),*) => { | 119 | ($($i:ident),*) => { |
@@ -125,10 +121,6 @@ fn macro_rules_export_with_local_inner_macros_are_visible() { | |||
125 | } | 121 | } |
126 | } | 122 | } |
127 | ", | 123 | ", |
128 | crate_graph! { | ||
129 | "main": ("/main.rs", ["foo"]), | ||
130 | "foo": ("/lib.rs", []), | ||
131 | }, | ||
132 | ); | 124 | ); |
133 | assert_snapshot!(map, @r###" | 125 | assert_snapshot!(map, @r###" |
134 | ⋮crate | 126 | ⋮crate |
@@ -145,9 +137,9 @@ fn macro_rules_export_with_local_inner_macros_are_visible() { | |||
145 | 137 | ||
146 | #[test] | 138 | #[test] |
147 | fn unexpanded_macro_should_expand_by_fixedpoint_loop() { | 139 | fn unexpanded_macro_should_expand_by_fixedpoint_loop() { |
148 | let map = def_map_with_crate_graph( | 140 | let map = def_map( |
149 | " | 141 | " |
150 | //- /main.rs | 142 | //- /main.rs crate:main deps:foo |
151 | macro_rules! baz { | 143 | macro_rules! baz { |
152 | () => { | 144 | () => { |
153 | use foo::bar; | 145 | use foo::bar; |
@@ -158,7 +150,7 @@ fn unexpanded_macro_should_expand_by_fixedpoint_loop() { | |||
158 | bar!(); | 150 | bar!(); |
159 | baz!(); | 151 | baz!(); |
160 | 152 | ||
161 | //- /lib.rs | 153 | //- /lib.rs crate:foo |
162 | #[macro_export] | 154 | #[macro_export] |
163 | macro_rules! foo { | 155 | macro_rules! foo { |
164 | () => { | 156 | () => { |
@@ -172,10 +164,6 @@ fn unexpanded_macro_should_expand_by_fixedpoint_loop() { | |||
172 | } | 164 | } |
173 | } | 165 | } |
174 | ", | 166 | ", |
175 | crate_graph! { | ||
176 | "main": ("/main.rs", ["foo"]), | ||
177 | "foo": ("/lib.rs", []), | ||
178 | }, | ||
179 | ); | 167 | ); |
180 | assert_snapshot!(map, @r###" | 168 | assert_snapshot!(map, @r###" |
181 | ⋮crate | 169 | ⋮crate |
@@ -188,9 +176,9 @@ fn unexpanded_macro_should_expand_by_fixedpoint_loop() { | |||
188 | #[test] | 176 | #[test] |
189 | fn macro_rules_from_other_crates_are_visible_with_macro_use() { | 177 | fn macro_rules_from_other_crates_are_visible_with_macro_use() { |
190 | // covers!(macro_rules_from_other_crates_are_visible_with_macro_use); | 178 | // covers!(macro_rules_from_other_crates_are_visible_with_macro_use); |
191 | let map = def_map_with_crate_graph( | 179 | let map = def_map( |
192 | " | 180 | " |
193 | //- /main.rs | 181 | //- /main.rs crate:main deps:foo |
194 | structs!(Foo); | 182 | structs!(Foo); |
195 | structs_priv!(Bar); | 183 | structs_priv!(Bar); |
196 | structs_not_exported!(MacroNotResolved1); | 184 | structs_not_exported!(MacroNotResolved1); |
@@ -205,7 +193,7 @@ fn macro_rules_from_other_crates_are_visible_with_macro_use() { | |||
205 | structs!(Baz); | 193 | structs!(Baz); |
206 | crate::structs!(MacroNotResolved3); | 194 | crate::structs!(MacroNotResolved3); |
207 | 195 | ||
208 | //- /lib.rs | 196 | //- /lib.rs crate:foo |
209 | #[macro_export] | 197 | #[macro_export] |
210 | macro_rules! structs { | 198 | macro_rules! structs { |
211 | ($i:ident) => { struct $i; } | 199 | ($i:ident) => { struct $i; } |
@@ -222,10 +210,6 @@ fn macro_rules_from_other_crates_are_visible_with_macro_use() { | |||
222 | } | 210 | } |
223 | } | 211 | } |
224 | ", | 212 | ", |
225 | crate_graph! { | ||
226 | "main": ("/main.rs", ["foo"]), | ||
227 | "foo": ("/lib.rs", []), | ||
228 | }, | ||
229 | ); | 213 | ); |
230 | assert_snapshot!(map, @r###" | 214 | assert_snapshot!(map, @r###" |
231 | ⋮crate | 215 | ⋮crate |
@@ -242,9 +226,9 @@ fn macro_rules_from_other_crates_are_visible_with_macro_use() { | |||
242 | #[test] | 226 | #[test] |
243 | fn prelude_is_macro_use() { | 227 | fn prelude_is_macro_use() { |
244 | // covers!(prelude_is_macro_use); | 228 | // covers!(prelude_is_macro_use); |
245 | let map = def_map_with_crate_graph( | 229 | let map = def_map( |
246 | " | 230 | " |
247 | //- /main.rs | 231 | //- /main.rs crate:main deps:foo |
248 | structs!(Foo); | 232 | structs!(Foo); |
249 | structs_priv!(Bar); | 233 | structs_priv!(Bar); |
250 | structs_outside!(Out); | 234 | structs_outside!(Out); |
@@ -256,7 +240,7 @@ fn prelude_is_macro_use() { | |||
256 | structs!(Baz); | 240 | structs!(Baz); |
257 | crate::structs!(MacroNotResolved3); | 241 | crate::structs!(MacroNotResolved3); |
258 | 242 | ||
259 | //- /lib.rs | 243 | //- /lib.rs crate:foo |
260 | #[prelude_import] | 244 | #[prelude_import] |
261 | use self::prelude::*; | 245 | use self::prelude::*; |
262 | 246 | ||
@@ -279,10 +263,6 @@ fn prelude_is_macro_use() { | |||
279 | ($i:ident) => { struct $i; } | 263 | ($i:ident) => { struct $i; } |
280 | } | 264 | } |
281 | ", | 265 | ", |
282 | crate_graph! { | ||
283 | "main": ("/main.rs", ["foo"]), | ||
284 | "foo": ("/lib.rs", []), | ||
285 | }, | ||
286 | ); | 266 | ); |
287 | assert_snapshot!(map, @r###" | 267 | assert_snapshot!(map, @r###" |
288 | ⋮crate | 268 | ⋮crate |
@@ -447,16 +427,16 @@ fn type_value_macro_live_in_different_scopes() { | |||
447 | 427 | ||
448 | #[test] | 428 | #[test] |
449 | fn macro_use_can_be_aliased() { | 429 | fn macro_use_can_be_aliased() { |
450 | let map = def_map_with_crate_graph( | 430 | let map = def_map( |
451 | " | 431 | " |
452 | //- /main.rs | 432 | //- /main.rs crate:main deps:foo |
453 | #[macro_use] | 433 | #[macro_use] |
454 | extern crate foo; | 434 | extern crate foo; |
455 | 435 | ||
456 | foo!(Direct); | 436 | foo!(Direct); |
457 | bar!(Alias); | 437 | bar!(Alias); |
458 | 438 | ||
459 | //- /lib.rs | 439 | //- /lib.rs crate:foo |
460 | use crate::foo as bar; | 440 | use crate::foo as bar; |
461 | 441 | ||
462 | mod m { | 442 | mod m { |
@@ -466,10 +446,6 @@ fn macro_use_can_be_aliased() { | |||
466 | } | 446 | } |
467 | } | 447 | } |
468 | ", | 448 | ", |
469 | crate_graph! { | ||
470 | "main": ("/main.rs", ["foo"]), | ||
471 | "foo": ("/lib.rs", []), | ||
472 | }, | ||
473 | ); | 449 | ); |
474 | assert_snapshot!(map, @r###" | 450 | assert_snapshot!(map, @r###" |
475 | ⋮crate | 451 | ⋮crate |
@@ -533,9 +509,9 @@ fn path_qualified_macros() { | |||
533 | fn macro_dollar_crate_is_correct_in_item() { | 509 | fn macro_dollar_crate_is_correct_in_item() { |
534 | // covers!(macro_dollar_crate_self); | 510 | // covers!(macro_dollar_crate_self); |
535 | // covers!(macro_dollar_crate_other); | 511 | // covers!(macro_dollar_crate_other); |
536 | let map = def_map_with_crate_graph( | 512 | let map = def_map( |
537 | " | 513 | " |
538 | //- /main.rs | 514 | //- /main.rs crate:main deps:foo |
539 | #[macro_use] | 515 | #[macro_use] |
540 | extern crate foo; | 516 | extern crate foo; |
541 | 517 | ||
@@ -554,7 +530,7 @@ fn macro_dollar_crate_is_correct_in_item() { | |||
554 | not_current1!(); | 530 | not_current1!(); |
555 | foo::not_current2!(); | 531 | foo::not_current2!(); |
556 | 532 | ||
557 | //- /lib.rs | 533 | //- /lib.rs crate:foo |
558 | mod m { | 534 | mod m { |
559 | #[macro_export] | 535 | #[macro_export] |
560 | macro_rules! not_current1 { | 536 | macro_rules! not_current1 { |
@@ -574,10 +550,6 @@ fn macro_dollar_crate_is_correct_in_item() { | |||
574 | struct Bar; | 550 | struct Bar; |
575 | struct Baz; | 551 | struct Baz; |
576 | ", | 552 | ", |
577 | crate_graph! { | ||
578 | "main": ("/main.rs", ["foo"]), | ||
579 | "foo": ("/lib.rs", []), | ||
580 | }, | ||
581 | ); | 553 | ); |
582 | assert_snapshot!(map, @r###" | 554 | assert_snapshot!(map, @r###" |
583 | ⋮crate | 555 | ⋮crate |
@@ -596,12 +568,12 @@ fn macro_dollar_crate_is_correct_in_item() { | |||
596 | fn macro_dollar_crate_is_correct_in_indirect_deps() { | 568 | fn macro_dollar_crate_is_correct_in_indirect_deps() { |
597 | // covers!(macro_dollar_crate_other); | 569 | // covers!(macro_dollar_crate_other); |
598 | // From std | 570 | // From std |
599 | let map = def_map_with_crate_graph( | 571 | let map = def_map( |
600 | r#" | 572 | r#" |
601 | //- /main.rs | 573 | //- /main.rs crate:main deps:std |
602 | foo!(); | 574 | foo!(); |
603 | 575 | ||
604 | //- /std.rs | 576 | //- /std.rs crate:std deps:core |
605 | #[prelude_import] | 577 | #[prelude_import] |
606 | use self::prelude::*; | 578 | use self::prelude::*; |
607 | 579 | ||
@@ -612,7 +584,7 @@ fn macro_dollar_crate_is_correct_in_indirect_deps() { | |||
612 | #[macro_use] | 584 | #[macro_use] |
613 | mod std_macros; | 585 | mod std_macros; |
614 | 586 | ||
615 | //- /core.rs | 587 | //- /core.rs crate:core |
616 | #[macro_export] | 588 | #[macro_export] |
617 | macro_rules! foo { | 589 | macro_rules! foo { |
618 | () => { | 590 | () => { |
@@ -622,11 +594,6 @@ fn macro_dollar_crate_is_correct_in_indirect_deps() { | |||
622 | 594 | ||
623 | pub struct bar; | 595 | pub struct bar; |
624 | "#, | 596 | "#, |
625 | crate_graph! { | ||
626 | "main": ("/main.rs", ["std"]), | ||
627 | "std": ("/std.rs", ["core"]), | ||
628 | "core": ("/core.rs", []), | ||
629 | }, | ||
630 | ); | 597 | ); |
631 | assert_snapshot!(map, @r###" | 598 | assert_snapshot!(map, @r###" |
632 | ⋮crate | 599 | ⋮crate |
diff --git a/crates/ra_hir/src/nameres/tests/mod_resolution.rs b/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs index abfe8b1c3..8d804a63e 100644 --- a/crates/ra_hir/src/nameres/tests/mod_resolution.rs +++ b/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs | |||
@@ -54,18 +54,15 @@ fn nested_module_resolution() { | |||
54 | 54 | ||
55 | #[test] | 55 | #[test] |
56 | fn module_resolution_works_for_non_standard_filenames() { | 56 | fn module_resolution_works_for_non_standard_filenames() { |
57 | let map = def_map_with_crate_graph( | 57 | let map = def_map( |
58 | " | 58 | " |
59 | //- /my_library.rs | 59 | //- /my_library.rs crate:my_library |
60 | mod foo; | 60 | mod foo; |
61 | use self::foo::Bar; | 61 | use self::foo::Bar; |
62 | 62 | ||
63 | //- /foo/mod.rs | 63 | //- /foo/mod.rs |
64 | pub struct Bar; | 64 | pub struct Bar; |
65 | ", | 65 | ", |
66 | crate_graph! { | ||
67 | "my_library": ("/my_library.rs", []), | ||
68 | }, | ||
69 | ); | 66 | ); |
70 | 67 | ||
71 | assert_snapshot!(map, @r###" | 68 | assert_snapshot!(map, @r###" |
@@ -650,7 +647,7 @@ fn module_resolution_decl_inside_inline_module_in_non_crate_root_2() { | |||
650 | 647 | ||
651 | #[test] | 648 | #[test] |
652 | fn unresolved_module_diagnostics() { | 649 | fn unresolved_module_diagnostics() { |
653 | let diagnostics = MockDatabase::with_files( | 650 | let db = TestDB::with_files( |
654 | r" | 651 | r" |
655 | //- /lib.rs | 652 | //- /lib.rs |
656 | mod foo; | 653 | mod foo; |
@@ -658,11 +655,37 @@ fn unresolved_module_diagnostics() { | |||
658 | mod baz {} | 655 | mod baz {} |
659 | //- /foo.rs | 656 | //- /foo.rs |
660 | ", | 657 | ", |
661 | ) | 658 | ); |
662 | .diagnostics(); | 659 | let krate = db.crate_graph().iter().next().unwrap(); |
663 | 660 | ||
664 | assert_snapshot!(diagnostics, @r###" | 661 | let crate_def_map = db.crate_def_map(krate); |
665 | "mod bar;": unresolved module | 662 | |
663 | insta::assert_debug_snapshot!( | ||
664 | crate_def_map.diagnostics, | ||
665 | @r###" | ||
666 | [ | ||
667 | UnresolvedModule { | ||
668 | module: CrateModuleId( | ||
669 | 0, | ||
670 | ), | ||
671 | declaration: AstId { | ||
672 | file_id: HirFileId( | ||
673 | FileId( | ||
674 | FileId( | ||
675 | 0, | ||
676 | ), | ||
677 | ), | ||
678 | ), | ||
679 | file_ast_id: FileAstId { | ||
680 | raw: ErasedFileAstId( | ||
681 | 1, | ||
682 | ), | ||
683 | _ty: PhantomData, | ||
684 | }, | ||
685 | }, | ||
686 | candidate: "bar.rs", | ||
687 | }, | ||
688 | ] | ||
666 | "### | 689 | "### |
667 | ); | 690 | ); |
668 | } | 691 | } |
diff --git a/crates/ra_hir/src/nameres/tests/primitives.rs b/crates/ra_hir_def/src/nameres/tests/primitives.rs index 0e2708658..0e2708658 100644 --- a/crates/ra_hir/src/nameres/tests/primitives.rs +++ b/crates/ra_hir_def/src/nameres/tests/primitives.rs | |||
diff --git a/crates/ra_hir_def/src/test_db.rs b/crates/ra_hir_def/src/test_db.rs index 67714c68e..05018f8e4 100644 --- a/crates/ra_hir_def/src/test_db.rs +++ b/crates/ra_hir_def/src/test_db.rs | |||
@@ -1,4 +1,7 @@ | |||
1 | use std::{panic, sync::Arc}; | 1 | use std::{ |
2 | panic, | ||
3 | sync::{Arc, Mutex}, | ||
4 | }; | ||
2 | 5 | ||
3 | use ra_db::{salsa, CrateId, FileId, FileLoader, FileLoaderDelegate}; | 6 | use ra_db::{salsa, CrateId, FileId, FileLoader, FileLoaderDelegate}; |
4 | use relative_path::RelativePath; | 7 | use relative_path::RelativePath; |
@@ -13,12 +16,20 @@ use relative_path::RelativePath; | |||
13 | #[derive(Debug, Default)] | 16 | #[derive(Debug, Default)] |
14 | pub struct TestDB { | 17 | pub struct TestDB { |
15 | runtime: salsa::Runtime<TestDB>, | 18 | runtime: salsa::Runtime<TestDB>, |
19 | events: Mutex<Option<Vec<salsa::Event<TestDB>>>>, | ||
16 | } | 20 | } |
17 | 21 | ||
18 | impl salsa::Database for TestDB { | 22 | impl salsa::Database for TestDB { |
19 | fn salsa_runtime(&self) -> &salsa::Runtime<Self> { | 23 | fn salsa_runtime(&self) -> &salsa::Runtime<Self> { |
20 | &self.runtime | 24 | &self.runtime |
21 | } | 25 | } |
26 | |||
27 | fn salsa_event(&self, event: impl Fn() -> salsa::Event<TestDB>) { | ||
28 | let mut events = self.events.lock().unwrap(); | ||
29 | if let Some(events) = &mut *events { | ||
30 | events.push(event()); | ||
31 | } | ||
32 | } | ||
22 | } | 33 | } |
23 | 34 | ||
24 | impl panic::RefUnwindSafe for TestDB {} | 35 | impl panic::RefUnwindSafe for TestDB {} |
@@ -38,3 +49,26 @@ impl FileLoader for TestDB { | |||
38 | FileLoaderDelegate(self).relevant_crates(file_id) | 49 | FileLoaderDelegate(self).relevant_crates(file_id) |
39 | } | 50 | } |
40 | } | 51 | } |
52 | |||
53 | impl TestDB { | ||
54 | pub fn log(&self, f: impl FnOnce()) -> Vec<salsa::Event<TestDB>> { | ||
55 | *self.events.lock().unwrap() = Some(Vec::new()); | ||
56 | f(); | ||
57 | self.events.lock().unwrap().take().unwrap() | ||
58 | } | ||
59 | |||
60 | pub fn log_executed(&self, f: impl FnOnce()) -> Vec<String> { | ||
61 | let events = self.log(f); | ||
62 | events | ||
63 | .into_iter() | ||
64 | .filter_map(|e| match e.kind { | ||
65 | // This pretty horrible, but `Debug` is the only way to inspect | ||
66 | // QueryDescriptor at the moment. | ||
67 | salsa::EventKind::WillExecute { database_key } => { | ||
68 | Some(format!("{:?}", database_key)) | ||
69 | } | ||
70 | _ => None, | ||
71 | }) | ||
72 | .collect() | ||
73 | } | ||
74 | } | ||