diff --git a/crates/ra_analysis/src/mock_analysis.rs b/crates/ra_analysis/src/mock_analysis.rs index 9605294046d..b37371499dd 100644 --- a/crates/ra_analysis/src/mock_analysis.rs +++ b/crates/ra_analysis/src/mock_analysis.rs @@ -55,6 +55,26 @@ pub fn with_files_and_position(fixture: &str) -> (MockAnalysis, FilePosition) { (res, position) } + /// Same as `with_files`, but requires that a single file contains two `<|>` marker, + /// whose range is also returned. + pub fn with_files_and_range(fixture: &str) -> (MockAnalysis, FileRange) { + let mut range = None; + let mut res = MockAnalysis::new(); + for entry in parse_fixture(fixture) { + if entry.text.contains(CURSOR_MARKER) { + assert!( + range.is_none(), + "only two marker (<|>) per fixture is allowed" + ); + range = Some(res.add_file_with_range(&entry.meta, &entry.text)); + } else { + res.add_file(&entry.meta, &entry.text); + } + } + let range = range.expect("expected two marker (<|>)"); + (res, range) + } + pub fn add_file(&mut self, path: &str, text: &str) -> FileId { let file_id = FileId((self.files.len() + 1) as u32); self.files.push((path.to_string(), text.to_string())); @@ -102,12 +122,18 @@ pub fn analysis(self) -> Analysis { } } -/// Creates analysis from a multi-file fixture, returns positions marked with <|>. +/// Creates analysis from a multi-file fixture, returns positions marked with a <|>. pub fn analysis_and_position(fixture: &str) -> (Analysis, FilePosition) { let (mock, position) = MockAnalysis::with_files_and_position(fixture); (mock.analysis(), position) } +/// Creates analysis from a multi-file fixture, returns ranges marked with two <|>. +pub fn analysis_and_range(fixture: &str) -> (Analysis, FileRange) { + let (mock, range) = MockAnalysis::with_files_and_range(fixture); + (mock.analysis(), range) +} + /// Creates analysis for a single file. pub fn single_file(code: &str) -> (Analysis, FileId) { let mut mock = MockAnalysis::new(); diff --git a/crates/ra_analysis/tests/tests.rs b/crates/ra_analysis/tests/tests.rs index 3045c2e781f..ce6f6f3faea 100644 --- a/crates/ra_analysis/tests/tests.rs +++ b/crates/ra_analysis/tests/tests.rs @@ -2,7 +2,7 @@ use test_utils::{assert_eq_dbg, assert_eq_text}; use ra_analysis::{ - mock_analysis::{analysis_and_position, single_file, single_file_with_position, MockAnalysis}, + mock_analysis::{analysis_and_position, analysis_and_range, single_file, single_file_with_position, MockAnalysis}, AnalysisChange, CrateGraph, FileId, FnSignatureInfo, }; @@ -10,6 +10,22 @@ fn get_signature(text: &str) -> (FnSignatureInfo, Option) { let (analysis, position) = single_file_with_position(text); analysis.resolve_callable(position).unwrap().unwrap() } +#[test] +fn test_type_of() { + let (analysis, range) = analysis_and_range( + " + //- /lib.rs + pub fn foo() -> u32 { + 1 + }; + + let <|>foo_test<|> = foo(); + ", + ); + + let type_name = analysis.type_of(range).unwrap().unwrap(); + assert_eq_dbg("u32", &type_name); +} #[test] fn approximate_resolve_works_in_items() {