Get rid of MockAnalysis

This commit is contained in:
Aleksey Kladov 2020-10-02 16:13:48 +02:00
parent eeb27f95f1
commit 09348b2474
19 changed files with 288 additions and 420 deletions

View file

@ -117,13 +117,13 @@ pub trait WithFixture: Default + SourceDatabaseExt + 'static {
impl<DB: SourceDatabaseExt + Default + 'static> WithFixture for DB {} impl<DB: SourceDatabaseExt + Default + 'static> WithFixture for DB {}
pub struct ChangeFixture { pub struct ChangeFixture {
file_position: Option<(FileId, RangeOrOffset)>, pub file_position: Option<(FileId, RangeOrOffset)>,
files: Vec<FileId>, pub files: Vec<FileId>,
change: Change, pub change: Change,
} }
impl ChangeFixture { impl ChangeFixture {
fn parse(ra_fixture: &str) -> ChangeFixture { pub fn parse(ra_fixture: &str) -> ChangeFixture {
let fixture = Fixture::parse(ra_fixture); let fixture = Fixture::parse(ra_fixture);
let mut change = Change::new(); let mut change = Change::new();
@ -132,6 +132,7 @@ impl ChangeFixture {
let mut crates = FxHashMap::default(); let mut crates = FxHashMap::default();
let mut crate_deps = Vec::new(); let mut crate_deps = Vec::new();
let mut default_crate_root: Option<FileId> = None; let mut default_crate_root: Option<FileId> = None;
let mut default_cfg = CfgOptions::default();
let mut file_set = FileSet::default(); let mut file_set = FileSet::default();
let source_root_prefix = "/".to_string(); let source_root_prefix = "/".to_string();
@ -171,6 +172,7 @@ impl ChangeFixture {
} else if meta.path == "/main.rs" || meta.path == "/lib.rs" { } else if meta.path == "/main.rs" || meta.path == "/lib.rs" {
assert!(default_crate_root.is_none()); assert!(default_crate_root.is_none());
default_crate_root = Some(file_id); default_crate_root = Some(file_id);
default_cfg = meta.cfg;
} }
change.change_file(file_id, Some(Arc::new(text))); change.change_file(file_id, Some(Arc::new(text)));
@ -185,8 +187,8 @@ impl ChangeFixture {
crate_graph.add_crate_root( crate_graph.add_crate_root(
crate_root, crate_root,
Edition::Edition2018, Edition::Edition2018,
None, Some("test".to_string()),
CfgOptions::default(), default_cfg,
Env::default(), Env::default(),
Default::default(), Default::default(),
); );

View file

@ -181,8 +181,8 @@ fn caller() {
call<|>ee(); call<|>ee();
} }
"#, "#,
"callee FN FileId(1) 0..14 3..9", "callee FN FileId(0) 0..14 3..9",
&["caller FN FileId(1) 15..44 18..24 : [33..39]"], &["caller FN FileId(0) 15..44 18..24 : [33..39]"],
&[], &[],
); );
} }
@ -197,8 +197,8 @@ fn caller() {
callee(); callee();
} }
"#, "#,
"callee FN FileId(1) 0..14 3..9", "callee FN FileId(0) 0..14 3..9",
&["caller FN FileId(1) 15..44 18..24 : [33..39]"], &["caller FN FileId(0) 15..44 18..24 : [33..39]"],
&[], &[],
); );
} }
@ -214,8 +214,8 @@ fn caller() {
callee(); callee();
} }
"#, "#,
"callee FN FileId(1) 0..14 3..9", "callee FN FileId(0) 0..14 3..9",
&["caller FN FileId(1) 15..58 18..24 : [33..39, 47..53]"], &["caller FN FileId(0) 15..58 18..24 : [33..39, 47..53]"],
&[], &[],
); );
} }
@ -234,10 +234,10 @@ fn caller2() {
callee(); callee();
} }
"#, "#,
"callee FN FileId(1) 0..14 3..9", "callee FN FileId(0) 0..14 3..9",
&[ &[
"caller1 FN FileId(1) 15..45 18..25 : [34..40]", "caller1 FN FileId(0) 15..45 18..25 : [34..40]",
"caller2 FN FileId(1) 47..77 50..57 : [66..72]", "caller2 FN FileId(0) 47..77 50..57 : [66..72]",
], ],
&[], &[],
); );
@ -263,10 +263,10 @@ mod tests {
} }
} }
"#, "#,
"callee FN FileId(1) 0..14 3..9", "callee FN FileId(0) 0..14 3..9",
&[ &[
"caller1 FN FileId(1) 15..45 18..25 : [34..40]", "caller1 FN FileId(0) 15..45 18..25 : [34..40]",
"test_caller FN FileId(1) 95..149 110..121 : [134..140]", "test_caller FN FileId(0) 95..149 110..121 : [134..140]",
], ],
&[], &[],
); );
@ -287,8 +287,8 @@ fn caller() {
//- /foo/mod.rs //- /foo/mod.rs
pub fn callee() {} pub fn callee() {}
"#, "#,
"callee FN FileId(2) 0..18 7..13", "callee FN FileId(1) 0..18 7..13",
&["caller FN FileId(1) 27..56 30..36 : [45..51]"], &["caller FN FileId(0) 27..56 30..36 : [45..51]"],
&[], &[],
); );
} }
@ -304,9 +304,9 @@ fn call<|>er() {
callee(); callee();
} }
"#, "#,
"caller FN FileId(1) 15..58 18..24", "caller FN FileId(0) 15..58 18..24",
&[], &[],
&["callee FN FileId(1) 0..14 3..9 : [33..39, 47..53]"], &["callee FN FileId(0) 0..14 3..9 : [33..39, 47..53]"],
); );
} }
@ -325,9 +325,9 @@ fn call<|>er() {
//- /foo/mod.rs //- /foo/mod.rs
pub fn callee() {} pub fn callee() {}
"#, "#,
"caller FN FileId(1) 27..56 30..36", "caller FN FileId(0) 27..56 30..36",
&[], &[],
&["callee FN FileId(2) 0..18 7..13 : [45..51]"], &["callee FN FileId(1) 0..18 7..13 : [45..51]"],
); );
} }
@ -348,9 +348,9 @@ fn caller3() {
} }
"#, "#,
"caller2 FN FileId(1) 33..64 36..43", "caller2 FN FileId(0) 33..64 36..43",
&["caller1 FN FileId(1) 0..31 3..10 : [19..26]"], &["caller1 FN FileId(0) 0..31 3..10 : [19..26]"],
&["caller3 FN FileId(1) 66..83 69..76 : [52..59]"], &["caller3 FN FileId(0) 66..83 69..76 : [52..59]"],
); );
} }
@ -368,9 +368,9 @@ fn main() {
a<|>() a<|>()
} }
"#, "#,
"a FN FileId(1) 0..18 3..4", "a FN FileId(0) 0..18 3..4",
&["main FN FileId(1) 31..52 34..38 : [47..48]"], &["main FN FileId(0) 31..52 34..38 : [47..48]"],
&["b FN FileId(1) 20..29 23..24 : [13..14]"], &["b FN FileId(0) 20..29 23..24 : [13..14]"],
); );
check_hierarchy( check_hierarchy(
@ -385,8 +385,8 @@ fn main() {
a() a()
} }
"#, "#,
"b FN FileId(1) 20..29 23..24", "b FN FileId(0) 20..29 23..24",
&["a FN FileId(1) 0..18 3..4 : [13..14]"], &["a FN FileId(0) 0..18 3..4 : [13..14]"],
&[], &[],
); );
} }

View file

@ -495,13 +495,13 @@ Some multi-line comment<|>
fn test_completion_await_impls_future() { fn test_completion_await_impls_future() {
check( check(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:std
use std::future::*; use std::future::*;
struct A {} struct A {}
impl Future for A {} impl Future for A {}
fn foo(a: A) { a.<|> } fn foo(a: A) { a.<|> }
//- /std/lib.rs //- /std/lib.rs crate:std
pub mod future { pub mod future {
#[lang = "future_trait"] #[lang = "future_trait"]
pub trait Future {} pub trait Future {}
@ -514,14 +514,14 @@ pub mod future {
check( check(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:std
use std::future::*; use std::future::*;
fn foo() { fn foo() {
let a = async {}; let a = async {};
a.<|> a.<|>
} }
//- /std/lib.rs //- /std/lib.rs crate:std
pub mod future { pub mod future {
#[lang = "future_trait"] #[lang = "future_trait"]
pub trait Future { pub trait Future {

View file

@ -300,7 +300,7 @@ mod tests {
// "#, // "#,
// expect![[r#" // expect![[r#"
// md bar; // md bar;
// "#]], // "#]],foo
// ); // );
// } // }
@ -308,7 +308,7 @@ mod tests {
fn already_declared_bin_module_completion_omitted() { fn already_declared_bin_module_completion_omitted() {
check( check(
r#" r#"
//- /src/bin.rs //- /src/bin.rs crate:main
fn main() {} fn main() {}
//- /src/bin/foo.rs //- /src/bin/foo.rs
mod <|> mod <|>

View file

@ -422,10 +422,10 @@ fn foo() { let _ = U::<|> }
fn completes_use_paths_across_crates() { fn completes_use_paths_across_crates() {
check( check(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:foo
use foo::<|>; use foo::<|>;
//- /foo/lib.rs //- /foo/lib.rs crate:foo
pub mod bar { pub struct S; } pub mod bar { pub struct S; }
"#, "#,
expect![[r#" expect![[r#"

View file

@ -271,10 +271,10 @@ fn quux() { <|> }
fn completes_extern_prelude() { fn completes_extern_prelude() {
check( check(
r#" r#"
//- /lib.rs //- /lib.rs crate:main deps:other_crate
use <|>; use <|>;
//- /other_crate/lib.rs //- /other_crate/lib.rs crate:other_crate
// nothing here // nothing here
"#, "#,
expect![[r#" expect![[r#"
@ -350,10 +350,10 @@ fn foo() {
fn completes_prelude() { fn completes_prelude() {
check( check(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:std
fn foo() { let x: <|> } fn foo() { let x: <|> }
//- /std/lib.rs //- /std/lib.rs crate:std
#[prelude_import] #[prelude_import]
use prelude::*; use prelude::*;
@ -371,16 +371,16 @@ mod prelude { struct Option; }
fn completes_std_prelude_if_core_is_defined() { fn completes_std_prelude_if_core_is_defined() {
check( check(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:core,std
fn foo() { let x: <|> } fn foo() { let x: <|> }
//- /core/lib.rs //- /core/lib.rs crate:core
#[prelude_import] #[prelude_import]
use prelude::*; use prelude::*;
mod prelude { struct Option; } mod prelude { struct Option; }
//- /std/lib.rs //- /std/lib.rs crate:std deps:core
#[prelude_import] #[prelude_import]
use prelude::*; use prelude::*;

View file

@ -1172,9 +1172,9 @@ fn foo(xs: Vec<i128>)
check_edit( check_edit(
"frobnicate!", "frobnicate!",
r#" r#"
//- /main.rs //- /main.rs crate:main deps:foo
use foo::<|>; use foo::<|>;
//- /foo/lib.rs //- /foo/lib.rs crate:foo
#[macro_export] #[macro_export]
macro_rules frobnicate { () => () } macro_rules frobnicate { () => () }
"#, "#,

View file

@ -219,7 +219,7 @@ mod tests {
use test_utils::assert_eq_text; use test_utils::assert_eq_text;
use crate::{ use crate::{
mock_analysis::{analysis_and_position, single_file, MockAnalysis}, mock_analysis::{analysis_and_position, many_files, single_file},
DiagnosticsConfig, DiagnosticsConfig,
}; };
@ -282,9 +282,7 @@ mod tests {
/// Takes a multi-file input fixture with annotated cursor position and checks that no diagnostics /// Takes a multi-file input fixture with annotated cursor position and checks that no diagnostics
/// apply to the file containing the cursor. /// apply to the file containing the cursor.
fn check_no_diagnostics(ra_fixture: &str) { fn check_no_diagnostics(ra_fixture: &str) {
let mock = MockAnalysis::with_files(ra_fixture); let (analysis, files) = many_files(ra_fixture);
let files = mock.files().map(|(it, _)| it).collect::<Vec<_>>();
let analysis = mock.analysis();
let diagnostics = files let diagnostics = files
.into_iter() .into_iter()
.flat_map(|file_id| { .flat_map(|file_id| {
@ -304,7 +302,7 @@ mod tests {
fn test_wrap_return_type() { fn test_wrap_return_type() {
check_fix( check_fix(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:core
use core::result::Result::{self, Ok, Err}; use core::result::Result::{self, Ok, Err};
fn div(x: i32, y: i32) -> Result<i32, ()> { fn div(x: i32, y: i32) -> Result<i32, ()> {
@ -313,7 +311,7 @@ fn div(x: i32, y: i32) -> Result<i32, ()> {
} }
x / y<|> x / y<|>
} }
//- /core/lib.rs //- /core/lib.rs crate:core
pub mod result { pub mod result {
pub enum Result<T, E> { Ok(T), Err(E) } pub enum Result<T, E> { Ok(T), Err(E) }
} }
@ -335,7 +333,7 @@ fn div(x: i32, y: i32) -> Result<i32, ()> {
fn test_wrap_return_type_handles_generic_functions() { fn test_wrap_return_type_handles_generic_functions() {
check_fix( check_fix(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:core
use core::result::Result::{self, Ok, Err}; use core::result::Result::{self, Ok, Err};
fn div<T>(x: T) -> Result<T, i32> { fn div<T>(x: T) -> Result<T, i32> {
@ -344,7 +342,7 @@ fn div<T>(x: T) -> Result<T, i32> {
} }
<|>x <|>x
} }
//- /core/lib.rs //- /core/lib.rs crate:core
pub mod result { pub mod result {
pub enum Result<T, E> { Ok(T), Err(E) } pub enum Result<T, E> { Ok(T), Err(E) }
} }
@ -366,7 +364,7 @@ fn div<T>(x: T) -> Result<T, i32> {
fn test_wrap_return_type_handles_type_aliases() { fn test_wrap_return_type_handles_type_aliases() {
check_fix( check_fix(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:core
use core::result::Result::{self, Ok, Err}; use core::result::Result::{self, Ok, Err};
type MyResult<T> = Result<T, ()>; type MyResult<T> = Result<T, ()>;
@ -377,7 +375,7 @@ fn div(x: i32, y: i32) -> MyResult<i32> {
} }
x <|>/ y x <|>/ y
} }
//- /core/lib.rs //- /core/lib.rs crate:core
pub mod result { pub mod result {
pub enum Result<T, E> { Ok(T), Err(E) } pub enum Result<T, E> { Ok(T), Err(E) }
} }
@ -401,12 +399,12 @@ fn div(x: i32, y: i32) -> MyResult<i32> {
fn test_wrap_return_type_not_applicable_when_expr_type_does_not_match_ok_type() { fn test_wrap_return_type_not_applicable_when_expr_type_does_not_match_ok_type() {
check_no_diagnostics( check_no_diagnostics(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:core
use core::result::Result::{self, Ok, Err}; use core::result::Result::{self, Ok, Err};
fn foo() -> Result<(), i32> { 0 } fn foo() -> Result<(), i32> { 0 }
//- /core/lib.rs //- /core/lib.rs crate:core
pub mod result { pub mod result {
pub enum Result<T, E> { Ok(T), Err(E) } pub enum Result<T, E> { Ok(T), Err(E) }
} }
@ -418,14 +416,14 @@ pub mod result {
fn test_wrap_return_type_not_applicable_when_return_type_is_not_result() { fn test_wrap_return_type_not_applicable_when_return_type_is_not_result() {
check_no_diagnostics( check_no_diagnostics(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:core
use core::result::Result::{self, Ok, Err}; use core::result::Result::{self, Ok, Err};
enum SomeOtherEnum { Ok(i32), Err(String) } enum SomeOtherEnum { Ok(i32), Err(String) }
fn foo() -> SomeOtherEnum { 0 } fn foo() -> SomeOtherEnum { 0 }
//- /core/lib.rs //- /core/lib.rs crate:core
pub mod result { pub mod result {
pub enum Result<T, E> { Ok(T), Err(E) } pub enum Result<T, E> { Ok(T), Err(E) }
} }
@ -567,7 +565,7 @@ fn test_fn() {
file_system_edits: [ file_system_edits: [
CreateFile { CreateFile {
anchor: FileId( anchor: FileId(
1, 0,
), ),
dst: "foo.rs", dst: "foo.rs",
}, },

View file

@ -439,7 +439,7 @@ fn foo() { enum FooInner { } }
[ [
NavigationTarget { NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..17, full_range: 0..17,
focus_range: Some( focus_range: Some(
@ -455,7 +455,7 @@ fn foo() { enum FooInner { } }
}, },
NavigationTarget { NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 29..46, full_range: 29..46,
focus_range: Some( focus_range: Some(

View file

@ -103,12 +103,11 @@ mod tests {
use base_db::FileRange; use base_db::FileRange;
use syntax::{TextRange, TextSize}; use syntax::{TextRange, TextSize};
use crate::mock_analysis::MockAnalysis; use crate::mock_analysis::analysis_and_annotations;
fn check(ra_fixture: &str) { fn check(ra_fixture: &str) {
let (mock, position) = MockAnalysis::with_files_and_position(ra_fixture); let (analysis, position, mut annotations) = analysis_and_annotations(ra_fixture);
let (mut expected, data) = mock.annotation(); let (mut expected, data) = annotations.pop().unwrap();
let analysis = mock.analysis();
match data.as_str() { match data.as_str() {
"" => (), "" => (),
"file" => { "file" => {
@ -133,9 +132,9 @@ mod tests {
fn goto_def_for_extern_crate() { fn goto_def_for_extern_crate() {
check( check(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:std
extern crate std<|>; extern crate std<|>;
//- /std/lib.rs //- /std/lib.rs crate:std
// empty // empty
//^ file //^ file
"#, "#,
@ -146,9 +145,9 @@ mod tests {
fn goto_def_for_renamed_extern_crate() { fn goto_def_for_renamed_extern_crate() {
check( check(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:std
extern crate std as abc<|>; extern crate std as abc<|>;
//- /std/lib.rs //- /std/lib.rs crate:std
// empty // empty
//^ file //^ file
"#, "#,
@ -342,10 +341,10 @@ fn bar() {
fn goto_def_for_use_alias() { fn goto_def_for_use_alias() {
check( check(
r#" r#"
//- /lib.rs //- /lib.rs crate:main deps:foo
use foo as bar<|>; use foo as bar<|>;
//- /foo/lib.rs //- /foo/lib.rs crate:foo
// empty // empty
//^ file //^ file
"#, "#,
@ -356,10 +355,10 @@ use foo as bar<|>;
fn goto_def_for_use_alias_foo_macro() { fn goto_def_for_use_alias_foo_macro() {
check( check(
r#" r#"
//- /lib.rs //- /lib.rs crate:main deps:foo
use foo::foo as bar<|>; use foo::foo as bar<|>;
//- /foo/lib.rs //- /foo/lib.rs crate:foo
#[macro_export] #[macro_export]
macro_rules! foo { () => { () } } macro_rules! foo { () => { () } }
//^^^ //^^^
@ -371,7 +370,6 @@ macro_rules! foo { () => { () } }
fn goto_def_for_methods() { fn goto_def_for_methods() {
check( check(
r#" r#"
//- /lib.rs
struct Foo; struct Foo;
impl Foo { impl Foo {
fn frobnicate(&self) { } fn frobnicate(&self) { }

View file

@ -76,12 +76,10 @@ fn impls_for_trait(
mod tests { mod tests {
use base_db::FileRange; use base_db::FileRange;
use crate::mock_analysis::MockAnalysis; use crate::mock_analysis::analysis_and_annotations;
fn check(ra_fixture: &str) { fn check(ra_fixture: &str) {
let (mock, position) = MockAnalysis::with_files_and_position(ra_fixture); let (analysis, position, annotations) = analysis_and_annotations(ra_fixture);
let annotations = mock.annotations();
let analysis = mock.analysis();
let navs = analysis.goto_implementation(position).unwrap().unwrap().info; let navs = analysis.goto_implementation(position).unwrap().unwrap().info;

View file

@ -56,13 +56,12 @@ fn pick_best(tokens: TokenAtOffset<SyntaxToken>) -> Option<SyntaxToken> {
mod tests { mod tests {
use base_db::FileRange; use base_db::FileRange;
use crate::mock_analysis::MockAnalysis; use crate::mock_analysis::analysis_and_annotations;
fn check(ra_fixture: &str) { fn check(ra_fixture: &str) {
let (mock, position) = MockAnalysis::with_files_and_position(ra_fixture); let (analysis, position, mut annotations) = analysis_and_annotations(ra_fixture);
let (expected, data) = mock.annotation(); let (expected, data) = annotations.pop().unwrap();
assert!(data.is_empty()); assert!(data.is_empty());
let analysis = mock.analysis();
let mut navs = analysis.goto_type_definition(position).unwrap().unwrap().info; let mut navs = analysis.goto_type_definition(position).unwrap().unwrap().info;
assert_eq!(navs.len(), 1); assert_eq!(navs.len(), 1);

View file

@ -1275,7 +1275,7 @@ fn bar() { fo<|>o(); }
Implementaion( Implementaion(
FilePosition { FilePosition {
file_id: FileId( file_id: FileId(
1, 0,
), ),
offset: 13, offset: 13,
}, },
@ -1289,9 +1289,9 @@ fn bar() { fo<|>o(); }
fn test_hover_extern_crate() { fn test_hover_extern_crate() {
check( check(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:std
extern crate st<|>d; extern crate st<|>d;
//- /std/lib.rs //- /std/lib.rs crate:std
//! Standard library for this test //! Standard library for this test
//! //!
//! Printed? //! Printed?
@ -1307,9 +1307,9 @@ extern crate st<|>d;
); );
check( check(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:std
extern crate std as ab<|>c; extern crate std as ab<|>c;
//- /std/lib.rs //- /std/lib.rs crate:std
//! Standard library for this test //! Standard library for this test
//! //!
//! Printed? //! Printed?
@ -1989,7 +1989,7 @@ fn foo() { let bar = Bar; bar.fo<|>o(); }
Implementaion( Implementaion(
FilePosition { FilePosition {
file_id: FileId( file_id: FileId(
1, 0,
), ),
offset: 6, offset: 6,
}, },
@ -2008,7 +2008,7 @@ fn foo() { let bar = Bar; bar.fo<|>o(); }
Implementaion( Implementaion(
FilePosition { FilePosition {
file_id: FileId( file_id: FileId(
1, 0,
), ),
offset: 7, offset: 7,
}, },
@ -2027,7 +2027,7 @@ fn foo() { let bar = Bar; bar.fo<|>o(); }
Implementaion( Implementaion(
FilePosition { FilePosition {
file_id: FileId( file_id: FileId(
1, 0,
), ),
offset: 6, offset: 6,
}, },
@ -2046,7 +2046,7 @@ fn foo() { let bar = Bar; bar.fo<|>o(); }
Implementaion( Implementaion(
FilePosition { FilePosition {
file_id: FileId( file_id: FileId(
1, 0,
), ),
offset: 5, offset: 5,
}, },
@ -2069,7 +2069,7 @@ fn foo_<|>test() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..24, full_range: 0..24,
focus_range: Some( focus_range: Some(
@ -2112,7 +2112,7 @@ mod tests<|> {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..46, full_range: 0..46,
focus_range: Some( focus_range: Some(
@ -2151,7 +2151,7 @@ fn main() { let s<|>t = S{ f1:0 }; }
mod_path: "test::S", mod_path: "test::S",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..19, full_range: 0..19,
focus_range: Some( focus_range: Some(
@ -2190,7 +2190,7 @@ fn main() { let s<|>t = S{ f1:Arg(0) }; }
mod_path: "test::S", mod_path: "test::S",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 17..37, full_range: 17..37,
focus_range: Some( focus_range: Some(
@ -2209,7 +2209,7 @@ fn main() { let s<|>t = S{ f1:Arg(0) }; }
mod_path: "test::Arg", mod_path: "test::Arg",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..16, full_range: 0..16,
focus_range: Some( focus_range: Some(
@ -2248,7 +2248,7 @@ fn main() { let s<|>t = S{ f1: S{ f1: Arg(0) } }; }
mod_path: "test::S", mod_path: "test::S",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 17..37, full_range: 17..37,
focus_range: Some( focus_range: Some(
@ -2267,7 +2267,7 @@ fn main() { let s<|>t = S{ f1: S{ f1: Arg(0) } }; }
mod_path: "test::Arg", mod_path: "test::Arg",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..16, full_range: 0..16,
focus_range: Some( focus_range: Some(
@ -2309,7 +2309,7 @@ fn main() { let s<|>t = (A(1), B(2), M::C(3) ); }
mod_path: "test::A", mod_path: "test::A",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..14, full_range: 0..14,
focus_range: Some( focus_range: Some(
@ -2328,7 +2328,7 @@ fn main() { let s<|>t = (A(1), B(2), M::C(3) ); }
mod_path: "test::B", mod_path: "test::B",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 15..29, full_range: 15..29,
focus_range: Some( focus_range: Some(
@ -2347,7 +2347,7 @@ fn main() { let s<|>t = (A(1), B(2), M::C(3) ); }
mod_path: "test::M::C", mod_path: "test::M::C",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 42..60, full_range: 42..60,
focus_range: Some( focus_range: Some(
@ -2386,7 +2386,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..12, full_range: 0..12,
focus_range: Some( focus_range: Some(
@ -2426,7 +2426,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..15, full_range: 0..15,
focus_range: Some( focus_range: Some(
@ -2445,7 +2445,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::S", mod_path: "test::S",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 16..25, full_range: 16..25,
focus_range: Some( focus_range: Some(
@ -2485,7 +2485,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..12, full_range: 0..12,
focus_range: Some( focus_range: Some(
@ -2504,7 +2504,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::Bar", mod_path: "test::Bar",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 13..25, full_range: 13..25,
focus_range: Some( focus_range: Some(
@ -2547,7 +2547,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..15, full_range: 0..15,
focus_range: Some( focus_range: Some(
@ -2566,7 +2566,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::Bar", mod_path: "test::Bar",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 16..31, full_range: 16..31,
focus_range: Some( focus_range: Some(
@ -2585,7 +2585,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::S1", mod_path: "test::S1",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 32..44, full_range: 32..44,
focus_range: Some( focus_range: Some(
@ -2604,7 +2604,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::S2", mod_path: "test::S2",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 45..57, full_range: 45..57,
focus_range: Some( focus_range: Some(
@ -2641,7 +2641,7 @@ fn foo(ar<|>g: &impl Foo) {}
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..12, full_range: 0..12,
focus_range: Some( focus_range: Some(
@ -2681,7 +2681,7 @@ fn foo(ar<|>g: &impl Foo + Bar<S>) {}
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..12, full_range: 0..12,
focus_range: Some( focus_range: Some(
@ -2700,7 +2700,7 @@ fn foo(ar<|>g: &impl Foo + Bar<S>) {}
mod_path: "test::Bar", mod_path: "test::Bar",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 13..28, full_range: 13..28,
focus_range: Some( focus_range: Some(
@ -2719,7 +2719,7 @@ fn foo(ar<|>g: &impl Foo + Bar<S>) {}
mod_path: "test::S", mod_path: "test::S",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 29..39, full_range: 29..39,
focus_range: Some( focus_range: Some(
@ -2764,7 +2764,7 @@ mod future {
mod_path: "test::future::Future", mod_path: "test::future::Future",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 101..163, full_range: 101..163,
focus_range: Some( focus_range: Some(
@ -2783,7 +2783,7 @@ mod future {
mod_path: "test::S", mod_path: "test::S",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..9, full_range: 0..9,
focus_range: Some( focus_range: Some(
@ -2821,7 +2821,7 @@ fn foo(ar<|>g: &impl Foo<S>) {}
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..15, full_range: 0..15,
focus_range: Some( focus_range: Some(
@ -2840,7 +2840,7 @@ fn foo(ar<|>g: &impl Foo<S>) {}
mod_path: "test::S", mod_path: "test::S",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 16..27, full_range: 16..27,
focus_range: Some( focus_range: Some(
@ -2883,7 +2883,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::B", mod_path: "test::B",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 42..55, full_range: 42..55,
focus_range: Some( focus_range: Some(
@ -2902,7 +2902,7 @@ fn main() { let s<|>t = foo(); }
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..12, full_range: 0..12,
focus_range: Some( focus_range: Some(
@ -2939,7 +2939,7 @@ fn foo(ar<|>g: &dyn Foo) {}
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..12, full_range: 0..12,
focus_range: Some( focus_range: Some(
@ -2977,7 +2977,7 @@ fn foo(ar<|>g: &dyn Foo<S>) {}
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..15, full_range: 0..15,
focus_range: Some( focus_range: Some(
@ -2996,7 +2996,7 @@ fn foo(ar<|>g: &dyn Foo<S>) {}
mod_path: "test::S", mod_path: "test::S",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 16..27, full_range: 16..27,
focus_range: Some( focus_range: Some(
@ -3037,7 +3037,7 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
mod_path: "test::ImplTrait", mod_path: "test::ImplTrait",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..21, full_range: 0..21,
focus_range: Some( focus_range: Some(
@ -3056,7 +3056,7 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
mod_path: "test::B", mod_path: "test::B",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 43..57, full_range: 43..57,
focus_range: Some( focus_range: Some(
@ -3075,7 +3075,7 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
mod_path: "test::DynTrait", mod_path: "test::DynTrait",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 22..42, full_range: 22..42,
focus_range: Some( focus_range: Some(
@ -3094,7 +3094,7 @@ fn foo(a<|>rg: &impl ImplTrait<B<dyn DynTrait<B<S>>>>) {}
mod_path: "test::S", mod_path: "test::S",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 58..69, full_range: 58..69,
focus_range: Some( focus_range: Some(
@ -3142,7 +3142,7 @@ fn main() { let s<|>t = test().get(); }
mod_path: "test::Foo", mod_path: "test::Foo",
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 0..62, full_range: 0..62,
focus_range: Some( focus_range: Some(

View file

@ -1,174 +1,73 @@
//! FIXME: write short doc here //! FIXME: write short doc here
use std::sync::Arc;
use base_db::{CrateName, FileSet, SourceRoot, VfsPath}; use base_db::fixture::ChangeFixture;
use cfg::CfgOptions; use test_utils::{extract_annotations, RangeOrOffset};
use test_utils::{
extract_annotations, extract_range_or_offset, Fixture, RangeOrOffset, CURSOR_MARKER,
};
use crate::{Analysis, AnalysisHost, Change, CrateGraph, Edition, FileId, FilePosition, FileRange}; use crate::{Analysis, AnalysisHost, FileId, FilePosition, FileRange};
/// Mock analysis is used in test to bootstrap an AnalysisHost/Analysis /// Creates analysis from a multi-file fixture, returns positions marked with <|>.
/// from a set of in-memory files. pub(crate) fn analysis_and_position(ra_fixture: &str) -> (Analysis, FilePosition) {
#[derive(Debug, Default)] let mut host = AnalysisHost::default();
pub(crate) struct MockAnalysis { let change_fixture = ChangeFixture::parse(ra_fixture);
files: Vec<Fixture>, host.db.apply_change(change_fixture.change);
} let (file_id, range_or_offset) = change_fixture.file_position.expect("expected a marker (<|>)");
impl MockAnalysis {
/// Creates `MockAnalysis` using a fixture data in the following format:
///
/// ```not_rust
/// //- /main.rs
/// mod foo;
/// fn main() {}
///
/// //- /foo.rs
/// struct Baz;
/// ```
pub(crate) fn with_files(ra_fixture: &str) -> MockAnalysis {
let (res, pos) = MockAnalysis::with_fixture(ra_fixture);
assert!(pos.is_none());
res
}
/// Same as `with_files`, but requires that a single file contains a `<|>` marker,
/// whose position is also returned.
pub(crate) fn with_files_and_position(fixture: &str) -> (MockAnalysis, FilePosition) {
let (res, position) = MockAnalysis::with_fixture(fixture);
let (file_id, range_or_offset) = position.expect("expected a marker (<|>)");
let offset = match range_or_offset { let offset = match range_or_offset {
RangeOrOffset::Range(_) => panic!(), RangeOrOffset::Range(_) => panic!(),
RangeOrOffset::Offset(it) => it, RangeOrOffset::Offset(it) => it,
}; };
(res, FilePosition { file_id, offset }) (host.analysis(), FilePosition { file_id, offset })
}
fn with_fixture(fixture: &str) -> (MockAnalysis, Option<(FileId, RangeOrOffset)>) {
let mut position = None;
let mut res = MockAnalysis::default();
for mut entry in Fixture::parse(fixture) {
if entry.text.contains(CURSOR_MARKER) {
assert!(position.is_none(), "only one marker (<|>) per fixture is allowed");
let (range_or_offset, text) = extract_range_or_offset(&entry.text);
entry.text = text;
let file_id = res.add_file_fixture(entry);
position = Some((file_id, range_or_offset));
} else {
res.add_file_fixture(entry);
}
}
(res, position)
}
fn add_file_fixture(&mut self, fixture: Fixture) -> FileId {
let file_id = FileId((self.files.len() + 1) as u32);
self.files.push(fixture);
file_id
}
pub(crate) fn id_of(&self, path: &str) -> FileId {
let (file_id, _) =
self.files().find(|(_, data)| path == data.path).expect("no file in this mock");
file_id
}
pub(crate) fn annotations(&self) -> Vec<(FileRange, String)> {
self.files()
.flat_map(|(file_id, fixture)| {
let annotations = extract_annotations(&fixture.text);
annotations
.into_iter()
.map(move |(range, data)| (FileRange { file_id, range }, data))
})
.collect()
}
pub(crate) fn files(&self) -> impl Iterator<Item = (FileId, &Fixture)> + '_ {
self.files.iter().enumerate().map(|(idx, fixture)| (FileId(idx as u32 + 1), fixture))
}
pub(crate) fn annotation(&self) -> (FileRange, String) {
let mut all = self.annotations();
assert_eq!(all.len(), 1);
all.pop().unwrap()
}
pub(crate) fn analysis_host(self) -> AnalysisHost {
let mut host = AnalysisHost::default();
let mut change = Change::new();
let mut file_set = FileSet::default();
let mut crate_graph = CrateGraph::default();
let mut root_crate = None;
for (i, data) in self.files.into_iter().enumerate() {
let path = data.path;
assert!(path.starts_with('/'));
let mut cfg = CfgOptions::default();
data.cfg_atoms.iter().for_each(|it| cfg.insert_atom(it.into()));
data.cfg_key_values.iter().for_each(|(k, v)| cfg.insert_key_value(k.into(), v.into()));
let edition: Edition =
data.edition.and_then(|it| it.parse().ok()).unwrap_or(Edition::Edition2018);
let file_id = FileId(i as u32 + 1);
let env = data.env.into_iter().collect();
if path == "/lib.rs" || path == "/main.rs" {
root_crate = Some(crate_graph.add_crate_root(
file_id,
edition,
Some("test".to_string()),
cfg,
env,
Default::default(),
));
} else if path.ends_with("/lib.rs") {
let base = &path[..path.len() - "/lib.rs".len()];
let crate_name = &base[base.rfind('/').unwrap() + '/'.len_utf8()..];
let other_crate = crate_graph.add_crate_root(
file_id,
edition,
Some(crate_name.to_string()),
cfg,
env,
Default::default(),
);
if let Some(root_crate) = root_crate {
crate_graph
.add_dep(root_crate, CrateName::new(crate_name).unwrap(), other_crate)
.unwrap();
}
}
let path = VfsPath::new_virtual_path(path.to_string());
file_set.insert(file_id, path);
change.change_file(file_id, Some(Arc::new(data.text).to_owned()));
}
change.set_crate_graph(crate_graph);
change.set_roots(vec![SourceRoot::new_local(file_set)]);
host.apply_change(change);
host
}
pub(crate) fn analysis(self) -> Analysis {
self.analysis_host().analysis()
}
}
/// Creates analysis from a multi-file fixture, returns positions marked with <|>.
pub(crate) fn analysis_and_position(ra_fixture: &str) -> (Analysis, FilePosition) {
let (mock, position) = MockAnalysis::with_files_and_position(ra_fixture);
(mock.analysis(), position)
} }
/// Creates analysis for a single file. /// Creates analysis for a single file.
pub(crate) fn single_file(ra_fixture: &str) -> (Analysis, FileId) { pub(crate) fn single_file(ra_fixture: &str) -> (Analysis, FileId) {
let mock = MockAnalysis::with_files(ra_fixture); let mut host = AnalysisHost::default();
let file_id = mock.id_of("/main.rs"); let change_fixture = ChangeFixture::parse(ra_fixture);
(mock.analysis(), file_id) host.db.apply_change(change_fixture.change);
(host.analysis(), change_fixture.files[0])
}
/// Creates analysis for a single file.
pub(crate) fn many_files(ra_fixture: &str) -> (Analysis, Vec<FileId>) {
let mut host = AnalysisHost::default();
let change_fixture = ChangeFixture::parse(ra_fixture);
host.db.apply_change(change_fixture.change);
(host.analysis(), change_fixture.files)
} }
/// Creates analysis for a single file, returns range marked with a pair of <|>. /// Creates analysis for a single file, returns range marked with a pair of <|>.
pub(crate) fn analysis_and_range(ra_fixture: &str) -> (Analysis, FileRange) { pub(crate) fn analysis_and_range(ra_fixture: &str) -> (Analysis, FileRange) {
let (res, position) = MockAnalysis::with_fixture(ra_fixture); let mut host = AnalysisHost::default();
let (file_id, range_or_offset) = position.expect("expected a marker (<|>)"); let change_fixture = ChangeFixture::parse(ra_fixture);
host.db.apply_change(change_fixture.change);
let (file_id, range_or_offset) = change_fixture.file_position.expect("expected a marker (<|>)");
let range = match range_or_offset { let range = match range_or_offset {
RangeOrOffset::Range(it) => it, RangeOrOffset::Range(it) => it,
RangeOrOffset::Offset(_) => panic!(), RangeOrOffset::Offset(_) => panic!(),
}; };
(res.analysis(), FileRange { file_id, range }) (host.analysis(), FileRange { file_id, range })
}
/// Creates analysis from a multi-file fixture, returns positions marked with <|>.
pub(crate) fn analysis_and_annotations(
ra_fixture: &str,
) -> (Analysis, FilePosition, Vec<(FileRange, String)>) {
let mut host = AnalysisHost::default();
let change_fixture = ChangeFixture::parse(ra_fixture);
host.db.apply_change(change_fixture.change);
let (file_id, range_or_offset) = change_fixture.file_position.expect("expected a marker (<|>)");
let offset = match range_or_offset {
RangeOrOffset::Range(_) => panic!(),
RangeOrOffset::Offset(it) => it,
};
let annotations = change_fixture
.files
.iter()
.flat_map(|&file_id| {
let file_text = host.analysis().file_text(file_id).unwrap();
let annotations = extract_annotations(&file_text);
annotations.into_iter().map(move |(range, data)| (FileRange { file_id, range }, data))
})
.collect();
(host.analysis(), FilePosition { file_id, offset }, annotations)
} }

View file

@ -63,15 +63,9 @@ pub(crate) fn crate_for(db: &RootDatabase, file_id: FileId) -> Vec<CrateId> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use base_db::Env;
use cfg::CfgOptions;
use test_utils::mark; use test_utils::mark;
use crate::{ use crate::mock_analysis::{analysis_and_position, single_file};
mock_analysis::{analysis_and_position, MockAnalysis},
Change, CrateGraph,
Edition::Edition2018,
};
#[test] #[test]
fn test_resolve_parent_module() { fn test_resolve_parent_module() {
@ -84,7 +78,7 @@ mod tests {
", ",
); );
let nav = analysis.parent_module(pos).unwrap().pop().unwrap(); let nav = analysis.parent_module(pos).unwrap().pop().unwrap();
nav.assert_match("foo MODULE FileId(1) 0..8"); nav.assert_match("foo MODULE FileId(0) 0..8");
} }
#[test] #[test]
@ -103,7 +97,7 @@ mod tests {
", ",
); );
let nav = analysis.parent_module(pos).unwrap().pop().unwrap(); let nav = analysis.parent_module(pos).unwrap().pop().unwrap();
nav.assert_match("foo MODULE FileId(1) 0..8"); nav.assert_match("foo MODULE FileId(0) 0..8");
} }
#[test] #[test]
@ -119,37 +113,19 @@ mod tests {
", ",
); );
let nav = analysis.parent_module(pos).unwrap().pop().unwrap(); let nav = analysis.parent_module(pos).unwrap().pop().unwrap();
nav.assert_match("baz MODULE FileId(1) 32..44"); nav.assert_match("baz MODULE FileId(0) 32..44");
} }
#[test] #[test]
fn test_resolve_crate_root() { fn test_resolve_crate_root() {
let mock = MockAnalysis::with_files( let (analysis, file_id) = single_file(
r#" r#"
//- /bar.rs //- /main.rs
mod foo; mod foo;
//- /foo.rs //- /foo.rs
// empty <|>
"#, "#,
); );
let root_file = mock.id_of("/bar.rs"); assert_eq!(analysis.crate_for(file_id).unwrap().len(), 1);
let mod_file = mock.id_of("/foo.rs");
let mut host = mock.analysis_host();
assert!(host.analysis().crate_for(mod_file).unwrap().is_empty());
let mut crate_graph = CrateGraph::default();
let crate_id = crate_graph.add_crate_root(
root_file,
Edition2018,
None,
CfgOptions::default(),
Env::default(),
Default::default(),
);
let mut change = Change::new();
change.set_crate_graph(crate_graph);
host.apply_change(change);
assert_eq!(host.analysis().crate_for(mod_file).unwrap(), vec![crate_id]);
} }
} }

View file

@ -190,10 +190,11 @@ fn get_struct_def_name_for_struct_literal_search(
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use base_db::FileId;
use expect_test::{expect, Expect}; use expect_test::{expect, Expect};
use stdx::format_to; use stdx::format_to;
use crate::{mock_analysis::MockAnalysis, SearchScope}; use crate::{mock_analysis::analysis_and_position, SearchScope};
#[test] #[test]
fn test_struct_literal_after_space() { fn test_struct_literal_after_space() {
@ -211,9 +212,9 @@ fn main() {
} }
"#, "#,
expect![[r#" expect![[r#"
Foo STRUCT FileId(1) 0..26 7..10 Other Foo STRUCT FileId(0) 0..26 7..10 Other
FileId(1) 101..104 StructLiteral FileId(0) 101..104 StructLiteral
"#]], "#]],
); );
} }
@ -229,10 +230,10 @@ struct Foo<|> {}
} }
"#, "#,
expect![[r#" expect![[r#"
Foo STRUCT FileId(1) 0..13 7..10 Other Foo STRUCT FileId(0) 0..13 7..10 Other
FileId(1) 41..44 Other FileId(0) 41..44 Other
FileId(1) 54..57 StructLiteral FileId(0) 54..57 StructLiteral
"#]], "#]],
); );
} }
@ -248,9 +249,9 @@ struct Foo<T> <|>{}
} }
"#, "#,
expect![[r#" expect![[r#"
Foo STRUCT FileId(1) 0..16 7..10 Other Foo STRUCT FileId(0) 0..16 7..10 Other
FileId(1) 64..67 StructLiteral FileId(0) 64..67 StructLiteral
"#]], "#]],
); );
} }
@ -267,9 +268,9 @@ fn main() {
} }
"#, "#,
expect![[r#" expect![[r#"
Foo STRUCT FileId(1) 0..16 7..10 Other Foo STRUCT FileId(0) 0..16 7..10 Other
FileId(1) 54..57 StructLiteral FileId(0) 54..57 StructLiteral
"#]], "#]],
); );
} }
@ -290,12 +291,12 @@ fn main() {
i = 5; i = 5;
}"#, }"#,
expect![[r#" expect![[r#"
i IDENT_PAT FileId(1) 24..25 Other Write i IDENT_PAT FileId(0) 24..25 Other Write
FileId(1) 50..51 Other Write FileId(0) 50..51 Other Write
FileId(1) 54..55 Other Read FileId(0) 54..55 Other Read
FileId(1) 76..77 Other Write FileId(0) 76..77 Other Write
FileId(1) 94..95 Other Write FileId(0) 94..95 Other Write
"#]], "#]],
); );
} }
@ -314,10 +315,10 @@ fn bar() {
} }
"#, "#,
expect![[r#" expect![[r#"
spam IDENT_PAT FileId(1) 19..23 Other spam IDENT_PAT FileId(0) 19..23 Other
FileId(1) 34..38 Other Read FileId(0) 34..38 Other Read
FileId(1) 41..45 Other Read FileId(0) 41..45 Other Read
"#]], "#]],
); );
} }
@ -329,9 +330,9 @@ fn bar() {
fn foo(i : u32) -> u32 { i<|> } fn foo(i : u32) -> u32 { i<|> }
"#, "#,
expect![[r#" expect![[r#"
i IDENT_PAT FileId(1) 7..8 Other i IDENT_PAT FileId(0) 7..8 Other
FileId(1) 25..26 Other Read FileId(0) 25..26 Other Read
"#]], "#]],
); );
} }
@ -343,9 +344,9 @@ fn foo(i : u32) -> u32 { i<|> }
fn foo(i<|> : u32) -> u32 { i } fn foo(i<|> : u32) -> u32 { i }
"#, "#,
expect![[r#" expect![[r#"
i IDENT_PAT FileId(1) 7..8 Other i IDENT_PAT FileId(0) 7..8 Other
FileId(1) 25..26 Other Read FileId(0) 25..26 Other Read
"#]], "#]],
); );
} }
@ -364,9 +365,9 @@ fn main(s: Foo) {
} }
"#, "#,
expect![[r#" expect![[r#"
spam RECORD_FIELD FileId(1) 17..30 21..25 Other spam RECORD_FIELD FileId(0) 17..30 21..25 Other
FileId(1) 67..71 Other Read FileId(0) 67..71 Other Read
"#]], "#]],
); );
} }
@ -381,7 +382,7 @@ impl Foo {
} }
"#, "#,
expect![[r#" expect![[r#"
f FN FileId(1) 27..43 30..31 Other f FN FileId(0) 27..43 30..31 Other
"#]], "#]],
); );
@ -398,7 +399,7 @@ enum Foo {
} }
"#, "#,
expect![[r#" expect![[r#"
B VARIANT FileId(1) 22..23 22..23 Other B VARIANT FileId(0) 22..23 22..23 Other
"#]], "#]],
); );
@ -439,10 +440,10 @@ fn f() {
} }
"#, "#,
expect![[r#" expect![[r#"
Foo STRUCT FileId(2) 17..51 28..31 Other Foo STRUCT FileId(1) 17..51 28..31 Other
FileId(1) 53..56 StructLiteral FileId(0) 53..56 StructLiteral
FileId(3) 79..82 StructLiteral FileId(2) 79..82 StructLiteral
"#]], "#]],
); );
} }
@ -469,9 +470,9 @@ pub struct Foo {
} }
"#, "#,
expect![[r#" expect![[r#"
foo SOURCE_FILE FileId(2) 0..35 Other foo SOURCE_FILE FileId(1) 0..35 Other
FileId(1) 14..17 Other FileId(0) 14..17 Other
"#]], "#]],
); );
} }
@ -497,10 +498,10 @@ pub(super) struct Foo<|> {
} }
"#, "#,
expect![[r#" expect![[r#"
Foo STRUCT FileId(3) 0..41 18..21 Other Foo STRUCT FileId(2) 0..41 18..21 Other
FileId(2) 20..23 Other FileId(1) 20..23 Other
FileId(2) 47..50 StructLiteral FileId(1) 47..50 StructLiteral
"#]], "#]],
); );
} }
@ -525,20 +526,20 @@ pub(super) struct Foo<|> {
code, code,
None, None,
expect![[r#" expect![[r#"
quux FN FileId(1) 19..35 26..30 Other quux FN FileId(0) 19..35 26..30 Other
FileId(1) 16..20 StructLiteral
FileId(2) 16..20 StructLiteral FileId(2) 16..20 StructLiteral
FileId(3) 16..20 StructLiteral
"#]], "#]],
); );
check_with_scope( check_with_scope(
code, code,
Some("/bar.rs"), Some(SearchScope::single_file(FileId(2))),
expect![[r#" expect![[r#"
quux FN FileId(1) 19..35 26..30 Other quux FN FileId(0) 19..35 26..30 Other
FileId(3) 16..20 StructLiteral FileId(2) 16..20 StructLiteral
"#]], "#]],
); );
} }
@ -556,10 +557,10 @@ fn foo() {
} }
"#, "#,
expect![[r#" expect![[r#"
m1 MACRO_CALL FileId(1) 0..46 29..31 Other m1 MACRO_CALL FileId(0) 0..46 29..31 Other
FileId(1) 63..65 StructLiteral FileId(0) 63..65 StructLiteral
FileId(1) 73..75 StructLiteral FileId(0) 73..75 StructLiteral
"#]], "#]],
); );
} }
@ -574,10 +575,10 @@ fn foo() {
} }
"#, "#,
expect![[r#" expect![[r#"
i IDENT_PAT FileId(1) 23..24 Other Write i IDENT_PAT FileId(0) 23..24 Other Write
FileId(1) 34..35 Other Write FileId(0) 34..35 Other Write
FileId(1) 38..39 Other Read FileId(0) 38..39 Other Read
"#]], "#]],
); );
} }
@ -596,10 +597,10 @@ fn foo() {
} }
"#, "#,
expect![[r#" expect![[r#"
f RECORD_FIELD FileId(1) 15..21 15..16 Other f RECORD_FIELD FileId(0) 15..21 15..16 Other
FileId(1) 55..56 Other Read FileId(0) 55..56 Other Read
FileId(1) 68..69 Other Write FileId(0) 68..69 Other Write
"#]], "#]],
); );
} }
@ -614,9 +615,9 @@ fn foo() {
} }
"#, "#,
expect![[r#" expect![[r#"
i IDENT_PAT FileId(1) 19..20 Other i IDENT_PAT FileId(0) 19..20 Other
FileId(1) 26..27 Other Write FileId(0) 26..27 Other Write
"#]], "#]],
); );
} }
@ -638,9 +639,9 @@ fn main() {
} }
"#, "#,
expect![[r#" expect![[r#"
new FN FileId(1) 54..81 61..64 Other new FN FileId(0) 54..81 61..64 Other
FileId(1) 126..129 StructLiteral FileId(0) 126..129 StructLiteral
"#]], "#]],
); );
} }
@ -660,10 +661,10 @@ use crate::f;
fn g() { f(); } fn g() { f(); }
"#, "#,
expect![[r#" expect![[r#"
f FN FileId(1) 22..31 25..26 Other f FN FileId(0) 22..31 25..26 Other
FileId(2) 11..12 Other FileId(1) 11..12 Other
FileId(2) 24..25 StructLiteral FileId(1) 24..25 StructLiteral
"#]], "#]],
); );
} }
@ -672,11 +673,8 @@ fn g() { f(); }
check_with_scope(ra_fixture, None, expect) check_with_scope(ra_fixture, None, expect)
} }
fn check_with_scope(ra_fixture: &str, search_scope: Option<&str>, expect: Expect) { fn check_with_scope(ra_fixture: &str, search_scope: Option<SearchScope>, expect: Expect) {
let (mock_analysis, pos) = MockAnalysis::with_files_and_position(ra_fixture); let (analysis, pos) = analysis_and_position(ra_fixture);
let search_scope =
search_scope.map(|path| SearchScope::single_file(mock_analysis.id_of(path)));
let analysis = mock_analysis.analysis();
let refs = analysis.find_all_refs(pos, search_scope).unwrap().unwrap(); let refs = analysis.find_all_refs(pos, search_scope).unwrap().unwrap();
let mut actual = String::new(); let mut actual = String::new();

View file

@ -602,7 +602,7 @@ mod foo<|>;
source_file_edits: [ source_file_edits: [
SourceFileEdit { SourceFileEdit {
file_id: FileId( file_id: FileId(
2, 1,
), ),
edit: TextEdit { edit: TextEdit {
indels: [ indels: [
@ -617,10 +617,10 @@ mod foo<|>;
file_system_edits: [ file_system_edits: [
MoveFile { MoveFile {
src: FileId( src: FileId(
3, 2,
), ),
anchor: FileId( anchor: FileId(
3, 2,
), ),
dst: "foo2.rs", dst: "foo2.rs",
}, },
@ -655,7 +655,7 @@ use crate::foo<|>::FooContent;
source_file_edits: [ source_file_edits: [
SourceFileEdit { SourceFileEdit {
file_id: FileId( file_id: FileId(
1, 0,
), ),
edit: TextEdit { edit: TextEdit {
indels: [ indels: [
@ -668,7 +668,7 @@ use crate::foo<|>::FooContent;
}, },
SourceFileEdit { SourceFileEdit {
file_id: FileId( file_id: FileId(
3, 2,
), ),
edit: TextEdit { edit: TextEdit {
indels: [ indels: [
@ -683,10 +683,10 @@ use crate::foo<|>::FooContent;
file_system_edits: [ file_system_edits: [
MoveFile { MoveFile {
src: FileId( src: FileId(
2, 1,
), ),
anchor: FileId( anchor: FileId(
2, 1,
), ),
dst: "quux.rs", dst: "quux.rs",
}, },
@ -715,7 +715,7 @@ mod fo<|>o;
source_file_edits: [ source_file_edits: [
SourceFileEdit { SourceFileEdit {
file_id: FileId( file_id: FileId(
1, 0,
), ),
edit: TextEdit { edit: TextEdit {
indels: [ indels: [
@ -730,10 +730,10 @@ mod fo<|>o;
file_system_edits: [ file_system_edits: [
MoveFile { MoveFile {
src: FileId( src: FileId(
2, 1,
), ),
anchor: FileId( anchor: FileId(
2, 1,
), ),
dst: "../foo2/mod.rs", dst: "../foo2/mod.rs",
}, },
@ -763,7 +763,7 @@ mod outer { mod fo<|>o; }
source_file_edits: [ source_file_edits: [
SourceFileEdit { SourceFileEdit {
file_id: FileId( file_id: FileId(
1, 0,
), ),
edit: TextEdit { edit: TextEdit {
indels: [ indels: [
@ -778,10 +778,10 @@ mod outer { mod fo<|>o; }
file_system_edits: [ file_system_edits: [
MoveFile { MoveFile {
src: FileId( src: FileId(
2, 1,
), ),
anchor: FileId( anchor: FileId(
2, 1,
), ),
dst: "bar.rs", dst: "bar.rs",
}, },
@ -834,7 +834,7 @@ pub mod foo<|>;
source_file_edits: [ source_file_edits: [
SourceFileEdit { SourceFileEdit {
file_id: FileId( file_id: FileId(
2, 1,
), ),
edit: TextEdit { edit: TextEdit {
indels: [ indels: [
@ -847,7 +847,7 @@ pub mod foo<|>;
}, },
SourceFileEdit { SourceFileEdit {
file_id: FileId( file_id: FileId(
1, 0,
), ),
edit: TextEdit { edit: TextEdit {
indels: [ indels: [
@ -862,10 +862,10 @@ pub mod foo<|>;
file_system_edits: [ file_system_edits: [
MoveFile { MoveFile {
src: FileId( src: FileId(
3, 2,
), ),
anchor: FileId( anchor: FileId(
3, 2,
), ),
dst: "foo2.rs", dst: "foo2.rs",
}, },

View file

@ -335,7 +335,7 @@ fn bench() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 1..13, full_range: 1..13,
focus_range: Some( focus_range: Some(
@ -353,7 +353,7 @@ fn bench() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 15..39, full_range: 15..39,
focus_range: Some( focus_range: Some(
@ -378,7 +378,7 @@ fn bench() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 41..75, full_range: 41..75,
focus_range: Some( focus_range: Some(
@ -403,7 +403,7 @@ fn bench() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 77..99, full_range: 77..99,
focus_range: Some( focus_range: Some(
@ -494,7 +494,7 @@ fn should_have_no_runnable_6() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 1..13, full_range: 1..13,
focus_range: Some( focus_range: Some(
@ -512,7 +512,7 @@ fn should_have_no_runnable_6() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 15..74, full_range: 15..74,
focus_range: None, focus_range: None,
@ -532,7 +532,7 @@ fn should_have_no_runnable_6() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 76..148, full_range: 76..148,
focus_range: None, focus_range: None,
@ -552,7 +552,7 @@ fn should_have_no_runnable_6() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 150..254, full_range: 150..254,
focus_range: None, focus_range: None,
@ -596,7 +596,7 @@ impl Data {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 1..13, full_range: 1..13,
focus_range: Some( focus_range: Some(
@ -614,7 +614,7 @@ impl Data {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 44..98, full_range: 44..98,
focus_range: None, focus_range: None,
@ -653,7 +653,7 @@ mod test_mod {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 1..51, full_range: 1..51,
focus_range: Some( focus_range: Some(
@ -673,7 +673,7 @@ mod test_mod {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 20..49, full_range: 20..49,
focus_range: Some( focus_range: Some(
@ -733,7 +733,7 @@ mod root_tests {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 22..323, full_range: 22..323,
focus_range: Some( focus_range: Some(
@ -753,7 +753,7 @@ mod root_tests {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 51..192, full_range: 51..192,
focus_range: Some( focus_range: Some(
@ -773,7 +773,7 @@ mod root_tests {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 84..126, full_range: 84..126,
focus_range: Some( focus_range: Some(
@ -798,7 +798,7 @@ mod root_tests {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 140..182, full_range: 140..182,
focus_range: Some( focus_range: Some(
@ -823,7 +823,7 @@ mod root_tests {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 202..286, full_range: 202..286,
focus_range: Some( focus_range: Some(
@ -843,7 +843,7 @@ mod root_tests {
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 235..276, full_range: 235..276,
focus_range: Some( focus_range: Some(
@ -886,7 +886,7 @@ fn test_foo1() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 1..50, full_range: 1..50,
focus_range: Some( focus_range: Some(
@ -934,7 +934,7 @@ fn test_foo1() {}
Runnable { Runnable {
nav: NavigationTarget { nav: NavigationTarget {
file_id: FileId( file_id: FileId(
1, 0,
), ),
full_range: 1..72, full_range: 1..72,
focus_range: Some( focus_range: Some(

View file

@ -462,12 +462,12 @@ macro_rules! noop {
fn test_extern_crate() { fn test_extern_crate() {
check_highlighting( check_highlighting(
r#" r#"
//- /main.rs //- /main.rs crate:main deps:std,alloc
extern crate std; extern crate std;
extern crate alloc as abc; extern crate alloc as abc;
//- /std/lib.rs //- /std/lib.rs crate:std
pub struct S; pub struct S;
//- /alloc/lib.rs //- /alloc/lib.rs crate:alloc
pub struct A pub struct A
"#, "#,
expect_file!["./test_data/highlight_extern_crate.html"], expect_file!["./test_data/highlight_extern_crate.html"],