1 //! Completion tests for expressions.
2 use expect_test
::{expect, Expect}
;
4 use crate::tests
::{check_edit, completion_list, BASE_ITEMS_FIXTURE}
;
6 fn check(ra_fixture
: &str, expect
: Expect
) {
7 let actual
= completion_list(&format
!("{BASE_ITEMS_FIXTURE}{ra_fixture}"));
8 expect
.assert_eq(&actual
)
11 fn check_empty(ra_fixture
: &str, expect
: Expect
) {
12 let actual
= completion_list(ra_fixture
);
13 expect
.assert_eq(&actual
);
17 fn complete_literal_struct_with_a_private_field() {
18 // `FooDesc.bar` is private, the completion should not be triggered.
22 pub struct FooDesc { pub six: bool, pub neuf: Vec<String>, bar: bool }
23 pub fn create_foo(foo_desc: &FooDesc) -> () { () }
29 let foo = create_foo(&$0);
32 // This should not contain `FooDesc {…}`.
37 fn create_foo(…) fn(&FooDesc)
39 ma makro!(…) macro_rules! makro
48 ev TupleV(…) TupleV(u32)
69 fn completes_various_bindings() {
72 fn func(param0 @ (param1, param2): (i32, i32)) {
74 if let ifletlocal = 100 {
84 fn func(…) fn((i32, i32))
110 fn completes_all_the_things_in_fn_body() {
113 use non_existant::Unresolved;
114 mod qualified { pub enum Enum { Variant } }
117 fn foo<'lifetime, TypeParam, const CONST_PARAM: usize>(self) {
123 // `self` is in here twice, once as the module, once as the local
131 ma makro!(…) macro_rules! makro
141 ev TupleV(…) TupleV(u32)
169 me self.foo() fn(self)
178 use non_existant::Unresolved;
179 mod qualified { pub enum Enum { Variant } }
182 fn foo<'lifetime, TypeParam, const CONST_PARAM: usize>(self) {
192 ma makro!(…) macro_rules! makro
201 ev TupleV(…) TupleV(u32)
208 fn complete_in_block() {
254 fn complete_after_if_expr() {
301 fn complete_in_match_arm() {
331 fn completes_in_loop_ctx() {
333 r
"fn my() { loop { $0 } }",
373 fn completes_in_let_initializer() {
375 r
#"fn main() { let _ = $0 }"#,
397 fn struct_initializer_field_expr() {
431 fn shadowing_shows_single_completion() {
432 cov_mark
::check
!(shadowing_shows_single_completion
);
466 fn in_macro_expr_frag() {
469 macro_rules! m { ($e:expr) => { $e } }
477 ma m!(…) macro_rules! m
496 macro_rules! m { ($e:expr) => { $e } }
504 ma m!(…) macro_rules! m
523 macro_rules! m { ($e:expr) => { $e } }
534 fn enum_qualified() {
539 const ASSOC_CONST: () = ();
547 ct ASSOC_CONST const ASSOC_CONST: ()
549 ta AssocType type AssocType = ()
550 ev RecordV {…} RecordV { field: u32 }
551 ev TupleV(…) TupleV(u32)
558 fn ty_qualified_no_drop() {
564 fn drop(&mut self) {}
582 fn variant() -> Self { Enum::Variant() }
589 fn variant fn() -> Enum
596 fn detail_impl_trait_in_return_position() {
601 fn foo<U>() -> impl Trait<U> {}
607 fn foo() fn() -> impl Trait<U>
615 fn detail_async_fn() {
618 //- minicore: future, sized
620 async fn foo() -> u8 {}
621 async fn bar<U>() -> impl Trait<U> {}
627 fn bar() async fn() -> impl Trait<U>
628 fn foo() async fn() -> u8
636 fn detail_impl_trait_in_argument_position() {
643 fn bar<U>(_: impl Trait<U>) {}
650 fn bar(…) fn(impl Trait<U>)
656 fn complete_record_expr_path() {
661 fn test() -> Self { }
663 fn boi(val: Zulu) { }
669 fn test() fn() -> Zulu
675 fn varaiant_with_struct() {
678 pub struct YoloVariant {
687 let t = HH::Yolo(Y$0);
694 st YoloVariant {…} YoloVariant { f: usize }
714 fn return_unit_block() {
715 cov_mark
::check
!(return_unit_block
);
716 check_edit("return", r
#"fn f() { if true { $0 } }"#, r#"fn f() { if true { return; } }"#);
720 fn return_unit_no_block() {
721 cov_mark
::check
!(return_unit_no_block
);
724 r
#"fn f() { match () { () => $0 } }"#,
725 r
#"fn f() { match () { () => return } }"#,
730 fn return_value_block() {
731 cov_mark
::check
!(return_value_block
);
734 r
#"fn f() -> i32 { if true { $0 } }"#,
735 r
#"fn f() -> i32 { if true { return $0; } }"#,
740 fn return_value_no_block() {
741 cov_mark
::check
!(return_value_no_block
);
744 r
#"fn f() -> i32 { match () { () => $0 } }"#,
745 r
#"fn f() -> i32 { match () { () => return $0 } }"#,
750 fn else_completion_after_if() {
753 fn foo() { if foo {} $0 }
793 fn foo() { if foo {} el$0 }
833 fn foo() { bar(if foo {} $0) }
857 fn foo() { bar(if foo {} el$0) }
881 fn foo() { if foo {} $0 let x = 92; }
921 fn foo() { if foo {} el$0 let x = 92; }
961 fn foo() { if foo {} el$0 { let x = 92; } }