aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/fixture.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-10-02 16:34:31 +0100
committerAleksey Kladov <[email protected]>2020-10-02 16:49:44 +0100
commitb06259673f9b535a63c0cabf4eeb935ff73d86d0 (patch)
treea1d9c304711806c393163547fe6da69289aa9f16 /crates/ide/src/fixture.rs
parent09348b247465864c6462a39055803bcbb0156cfe (diff)
rename mock_analysis -> fixture
Diffstat (limited to 'crates/ide/src/fixture.rs')
-rw-r--r--crates/ide/src/fixture.rs70
1 files changed, 70 insertions, 0 deletions
diff --git a/crates/ide/src/fixture.rs b/crates/ide/src/fixture.rs
new file mode 100644
index 000000000..ed06689f0
--- /dev/null
+++ b/crates/ide/src/fixture.rs
@@ -0,0 +1,70 @@
1//! Utilities for creating `Analysis` instances for tests.
2use base_db::fixture::ChangeFixture;
3use test_utils::{extract_annotations, RangeOrOffset};
4
5use crate::{Analysis, AnalysisHost, FileId, FilePosition, FileRange};
6
7/// Creates analysis for a single file.
8pub(crate) fn file(ra_fixture: &str) -> (Analysis, FileId) {
9 let mut host = AnalysisHost::default();
10 let change_fixture = ChangeFixture::parse(ra_fixture);
11 host.db.apply_change(change_fixture.change);
12 (host.analysis(), change_fixture.files[0])
13}
14
15/// Creates analysis for many files.
16pub(crate) fn files(ra_fixture: &str) -> (Analysis, Vec<FileId>) {
17 let mut host = AnalysisHost::default();
18 let change_fixture = ChangeFixture::parse(ra_fixture);
19 host.db.apply_change(change_fixture.change);
20 (host.analysis(), change_fixture.files)
21}
22
23/// Creates analysis from a multi-file fixture, returns positions marked with <|>.
24pub(crate) fn position(ra_fixture: &str) -> (Analysis, FilePosition) {
25 let mut host = AnalysisHost::default();
26 let change_fixture = ChangeFixture::parse(ra_fixture);
27 host.db.apply_change(change_fixture.change);
28 let (file_id, range_or_offset) = change_fixture.file_position.expect("expected a marker (<|>)");
29 let offset = match range_or_offset {
30 RangeOrOffset::Range(_) => panic!(),
31 RangeOrOffset::Offset(it) => it,
32 };
33 (host.analysis(), FilePosition { file_id, offset })
34}
35
36/// Creates analysis for a single file, returns range marked with a pair of <|>.
37pub(crate) fn range(ra_fixture: &str) -> (Analysis, FileRange) {
38 let mut host = AnalysisHost::default();
39 let change_fixture = ChangeFixture::parse(ra_fixture);
40 host.db.apply_change(change_fixture.change);
41 let (file_id, range_or_offset) = change_fixture.file_position.expect("expected a marker (<|>)");
42 let range = match range_or_offset {
43 RangeOrOffset::Range(it) => it,
44 RangeOrOffset::Offset(_) => panic!(),
45 };
46 (host.analysis(), FileRange { file_id, range })
47}
48
49/// Creates analysis from a multi-file fixture, returns positions marked with <|>.
50pub(crate) fn annotations(ra_fixture: &str) -> (Analysis, FilePosition, Vec<(FileRange, String)>) {
51 let mut host = AnalysisHost::default();
52 let change_fixture = ChangeFixture::parse(ra_fixture);
53 host.db.apply_change(change_fixture.change);
54 let (file_id, range_or_offset) = change_fixture.file_position.expect("expected a marker (<|>)");
55 let offset = match range_or_offset {
56 RangeOrOffset::Range(_) => panic!(),
57 RangeOrOffset::Offset(it) => it,
58 };
59
60 let annotations = change_fixture
61 .files
62 .iter()
63 .flat_map(|&file_id| {
64 let file_text = host.analysis().file_text(file_id).unwrap();
65 let annotations = extract_annotations(&file_text);
66 annotations.into_iter().map(move |(range, data)| (FileRange { file_id, range }, data))
67 })
68 .collect();
69 (host.analysis(), FilePosition { file_id, offset }, annotations)
70}