]> git.lizzy.rs Git - rust.git/blob - crates/ide/src/fixture.rs
rename mock_analysis -> fixture
[rust.git] / crates / ide / src / fixture.rs
1 //! Utilities for creating `Analysis` instances for tests.
2 use base_db::fixture::ChangeFixture;
3 use test_utils::{extract_annotations, RangeOrOffset};
4
5 use crate::{Analysis, AnalysisHost, FileId, FilePosition, FileRange};
6
7 /// Creates analysis for a single file.
8 pub(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.
16 pub(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 <|>.
24 pub(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 <|>.
37 pub(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 <|>.
50 pub(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 }