From 8de3f7ee538b0fee7783c18b03042dc3f12ca84b Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Fri, 23 Jul 2021 16:37:19 +0200 Subject: [PATCH] Move out unqualified_path completion tests --- .../ide_completion/src/completions/record.rs | 1 - .../ide_completion/src/completions/snippet.rs | 23 -- .../src/completions/unqualified_path.rs | 301 +----------------- crates/ide_completion/src/tests.rs | 1 + crates/ide_completion/src/tests/expression.rs | 249 +++++++++++++++ 5 files changed, 251 insertions(+), 324 deletions(-) create mode 100644 crates/ide_completion/src/tests/expression.rs diff --git a/crates/ide_completion/src/completions/record.rs b/crates/ide_completion/src/completions/record.rs index c7cf5e3e4b..151297042b 100644 --- a/crates/ide_completion/src/completions/record.rs +++ b/crates/ide_completion/src/completions/record.rs @@ -47,7 +47,6 @@ pub(crate) fn complete_record(acc: &mut Completions, ctx: &CompletionContext) -> #[cfg(test)] mod tests { - use crate::tests::check_edit; #[test] diff --git a/crates/ide_completion/src/completions/snippet.rs b/crates/ide_completion/src/completions/snippet.rs index 6237a6ef1e..a896a759ab 100644 --- a/crates/ide_completion/src/completions/snippet.rs +++ b/crates/ide_completion/src/completions/snippet.rs @@ -86,26 +86,3 @@ fn ${1:feature}() { let item = snippet(ctx, cap, "macro_rules", "macro_rules! $1 {\n\t($2) => {\n\t\t$0\n\t};\n}"); item.add_to(acc); } - -#[cfg(test)] -mod tests { - use expect_test::{expect, Expect}; - - use crate::{tests::filtered_completion_list, CompletionKind}; - - fn check(ra_fixture: &str, expect: Expect) { - let actual = filtered_completion_list(ra_fixture, CompletionKind::Snippet); - expect.assert_eq(&actual) - } - - #[test] - fn completes_snippets_in_expressions() { - check( - r#"fn foo(x: i32) { $0 }"#, - expect![[r#" - sn pd - sn ppd - "#]], - ); - } -} diff --git a/crates/ide_completion/src/completions/unqualified_path.rs b/crates/ide_completion/src/completions/unqualified_path.rs index 62ec0df799..8258026182 100644 --- a/crates/ide_completion/src/completions/unqualified_path.rs +++ b/crates/ide_completion/src/completions/unqualified_path.rs @@ -87,7 +87,7 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC if let ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) | ScopeDef::Label(_) = res { - cov_mark::hit!(skip_lifetime_completion); + cov_mark::hit!(unqualified_skip_lifetime_completion); return; } let add_resolution = match res { @@ -155,51 +155,6 @@ fn main() { ) } - #[test] - fn completes_generic_params() { - check( - r#"fn quux() { $0 }"#, - expect![[r#" - tp T - fn quux() fn() - "#]], - ); - check( - r#"fn quux() { $0 }"#, - expect![[r#" - cp C - fn quux() fn() - "#]], - ); - } - - #[test] - fn does_not_complete_lifetimes() { - cov_mark::check!(skip_lifetime_completion); - check( - r#"fn quux<'a>() { $0 }"#, - expect![[r#" - fn quux() fn() - "#]], - ); - } - - #[test] - fn completes_module_items() { - check( - r#" -struct S; -enum E {} -fn quux() { $0 } -"#, - expect![[r#" - st S - fn quux() fn() - en E - "#]], - ); - } - /// Regression test for issue #6091. #[test] fn correctly_completes_module_items_prefixed_with_underscore() { @@ -220,55 +175,6 @@ fn _alpha() {} ) } - #[test] - fn completes_module_items_in_nested_modules() { - check( - r#" -struct Foo; -mod m { - struct Bar; - fn quux() { $0 } -} -"#, - expect![[r#" - fn quux() fn() - st Bar - "#]], - ); - } - - #[test] - fn dont_show_both_completions_for_shadowing() { - check( - r#" -fn foo() { - let bar = 92; - { - let bar = 62; - drop($0) - } -} -"#, - // FIXME: should be only one bar here - expect![[r#" - lc bar i32 - lc bar i32 - fn foo() fn() - "#]], - ); - } - - #[test] - fn completes_self_in_methods() { - check( - r#"impl S { fn foo(&self) { $0 } }"#, - expect![[r#" - lc self &{unknown} - sp Self - "#]], - ); - } - #[test] fn completes_prelude() { check( @@ -318,32 +224,6 @@ mod macros { ); } - #[test] - fn does_not_complete_non_fn_macros() { - check( - r#" -#[rustc_builtin_macro] -pub macro Clone {} - -fn f() {$0} -"#, - expect![[r#" - fn f() fn() - "#]], - ); - check( - r#" -#[rustc_builtin_macro] -pub macro bench {} - -fn f() {$0} -"#, - expect![[r#" - fn f() fn() - "#]], - ); - } - #[test] fn completes_std_prelude_if_core_is_defined() { check( @@ -372,183 +252,4 @@ pub mod prelude { "#]], ); } - - #[test] - fn completes_macros_as_value() { - check( - r#" -macro_rules! foo { () => {} } - -#[macro_use] -mod m1 { - macro_rules! bar { () => {} } -} - -mod m2 { - macro_rules! nope { () => {} } - - #[macro_export] - macro_rules! baz { () => {} } -} - -fn main() { let v = $0 } -"#, - expect![[r##" - md m1 - ma baz!(…) #[macro_export] macro_rules! baz - fn main() fn() - md m2 - ma bar!(…) macro_rules! bar - ma foo!(…) macro_rules! foo - "##]], - ); - } - - #[test] - fn completes_both_macro_and_value() { - check( - r#" -macro_rules! foo { () => {} } -fn foo() { $0 } -"#, - expect![[r#" - fn foo() fn() - ma foo!(…) macro_rules! foo - "#]], - ); - } - - #[test] - fn completes_macros_as_stmt() { - check( - r#" -macro_rules! foo { () => {} } -fn main() { $0 } -"#, - expect![[r#" - fn main() fn() - ma foo!(…) macro_rules! foo - "#]], - ); - } - - #[test] - fn completes_local_item() { - check( - r#" -fn main() { - return f$0; - fn frobnicate() {} -} -"#, - expect![[r#" - fn frobnicate() fn() - fn main() fn() - "#]], - ); - } - - #[test] - fn completes_in_simple_macro_1() { - check( - r#" -macro_rules! m { ($e:expr) => { $e } } -fn quux(x: i32) { - let y = 92; - m!($0); -} -"#, - expect![[r#" - lc y i32 - lc x i32 - fn quux(…) fn(i32) - ma m!(…) macro_rules! m - "#]], - ); - } - - #[test] - fn completes_in_simple_macro_2() { - check( - r" -macro_rules! m { ($e:expr) => { $e } } -fn quux(x: i32) { - let y = 92; - m!(x$0); -} -", - expect![[r#" - lc y i32 - lc x i32 - fn quux(…) fn(i32) - ma m!(…) macro_rules! m - "#]], - ); - } - - #[test] - fn completes_in_simple_macro_without_closing_parens() { - check( - r#" -macro_rules! m { ($e:expr) => { $e } } -fn quux(x: i32) { - let y = 92; - m!(x$0 -} -"#, - expect![[r#" - lc y i32 - lc x i32 - fn quux(…) fn(i32) - ma m!(…) macro_rules! m - "#]], - ); - } - - #[test] - fn completes_unresolved_uses() { - check( - r#" -use spam::Quux; - -fn main() { $0 } -"#, - expect![[r#" - fn main() fn() - ?? Quux - "#]], - ); - } - - #[test] - fn completes_enum_variant_basic_expr() { - check( - r#" -enum Foo { Bar, Baz, Quux } -fn main() { let foo: Foo = Q$0 } -"#, - expect![[r#" - ev Foo::Bar () - ev Foo::Baz () - ev Foo::Quux () - en Foo - fn main() fn() - "#]], - ) - } - - #[test] - fn completes_enum_variant_from_module() { - check( - r#" -mod m { pub enum E { V } } -fn f() -> m::E { V$0 } -"#, - expect![[r#" - ev m::E::V () - md m - fn f() fn() -> E - "#]], - ) - } } diff --git a/crates/ide_completion/src/tests.rs b/crates/ide_completion/src/tests.rs index b7ba0a893a..8575914509 100644 --- a/crates/ide_completion/src/tests.rs +++ b/crates/ide_completion/src/tests.rs @@ -8,6 +8,7 @@ //! completed where, not how. mod attribute; +mod expression; mod fn_param; mod item_list; mod item; diff --git a/crates/ide_completion/src/tests/expression.rs b/crates/ide_completion/src/tests/expression.rs new file mode 100644 index 0000000000..fb9f7a5a3b --- /dev/null +++ b/crates/ide_completion/src/tests/expression.rs @@ -0,0 +1,249 @@ +//! Completion tests for expressions. +use expect_test::{expect, Expect}; + +use crate::tests::{completion_list, BASE_ITEMS_FIXTURE}; + +fn check(ra_fixture: &str, expect: Expect) { + let actual = completion_list(&format!("{}{}", BASE_ITEMS_FIXTURE, ra_fixture)); + expect.assert_eq(&actual) +} + +fn check_empty(ra_fixture: &str, expect: Expect) { + let actual = completion_list(ra_fixture); + expect.assert_eq(&actual); +} + +#[test] +fn completes_various_bindings() { + check_empty( + r#" +fn func(param0 @ (param1, param2): (i32, i32)) { + let letlocal = 92; + if let ifletlocal = 100 { + match 0 { + matcharm => 1 + $0, + otherwise => (), + } + } + let letlocal2 = 44; +} +"#, + expect![[r#" + kw unsafe + kw match + kw while + kw while let + kw loop + kw if + kw if let + kw for + kw true + kw false + kw return + kw self + kw super + kw crate + lc matcharm i32 + lc ifletlocal i32 + lc letlocal i32 + lc param0 (i32, i32) + lc param1 i32 + lc param2 i32 + fn func(…) fn((i32, i32)) + bt u32 + "#]], + ); +} + +#[test] +fn completes_all_the_things() { + cov_mark::check!(unqualified_skip_lifetime_completion); + check( + r#" +use non_existant::Unresolved; +mod qualified { pub enum Enum { Variant } } + +impl Unit { + fn foo<'lifetime, TypeParam, const CONST_PARAM: usize>(self) { + fn local_func() {} + $0 + } +} +"#, + expect![[r##" + kw unsafe + kw fn + kw const + kw type + kw impl + kw extern + kw use + kw trait + kw static + kw mod + kw match + kw while + kw while let + kw loop + kw if + kw if let + kw for + kw true + kw false + kw let + kw return + sn pd + sn ppd + kw self + kw super + kw crate + fn local_func() fn() + bt u32 + lc self Unit + tp TypeParam + cp CONST_PARAM + sp Self + tt Trait + en Enum + st Record + st Tuple + md module + st Unit + md qualified + ma makro!(…) #[macro_export] macro_rules! makro + ?? Unresolved + fn function() fn() + sc STATIC + ev TupleV(…) (u32) + ct CONST + ma makro!(…) #[macro_export] macro_rules! makro + me self.foo() fn(self) + "##]], + ); +} + +#[test] +fn shadowing_shows_single_completion() { + check_empty( + r#" +fn foo() { + let bar = 92; + { + let bar = 62; + drop($0) + } +} +"#, + // FIXME: should be only one bar here + expect![[r#" + kw unsafe + kw match + kw while + kw while let + kw loop + kw if + kw if let + kw for + kw true + kw false + kw return + kw self + kw super + kw crate + lc bar i32 + lc bar i32 + fn foo() fn() + bt u32 + "#]], + ); +} + +#[test] +fn in_macro_expr_frag() { + check_empty( + r#" +macro_rules! m { ($e:expr) => { $e } } +fn quux(x: i32) { + m!($0); +} +"#, + expect![[r#" + kw unsafe + kw match + kw while + kw while let + kw loop + kw if + kw if let + kw for + kw true + kw false + kw return + kw self + kw super + kw crate + bt u32 + lc x i32 + fn quux(…) fn(i32) + ma m!(…) macro_rules! m + "#]], + ); + check_empty( + r" +macro_rules! m { ($e:expr) => { $e } } +fn quux(x: i32) { + m!(x$0); +} +", + expect![[r#" + kw unsafe + kw match + kw while + kw while let + kw loop + kw if + kw if let + kw for + kw true + kw false + kw return + kw self + kw super + kw crate + bt u32 + lc x i32 + fn quux(…) fn(i32) + ma m!(…) macro_rules! m + "#]], + ); + check_empty( + r#" +macro_rules! m { ($e:expr) => { $e } } +fn quux(x: i32) { + let y = 92; + m!(x$0 +} +"#, + expect![[r#" + kw unsafe + kw match + kw while + kw while let + kw loop + kw if + kw if let + kw for + kw true + kw false + kw return + kw self + kw super + kw crate + lc y i32 + bt u32 + lc x i32 + fn quux(…) fn(i32) + ma m!(…) macro_rules! m + "#]], + ); +}