Auto merge of #12309 - Veykril:completion, r=Veykril

fix: Fix incorrect expected type in completions for trailing match arms

Fixes https://github.com/rust-lang/rust-analyzer/issues/12264
This commit is contained in:
bors 2022-05-19 10:34:36 +00:00
commit 4f7d1a9d69

View File

@ -802,9 +802,19 @@ impl<'a> CompletionContext<'a> {
)
}
},
// match foo { $0 }
// match foo { ..., pat => $0 }
ast::MatchExpr(it) => {
cov_mark::hit!(expected_type_match_arm_without_leading_char);
let ty = it.expr().and_then(|e| self.sema.type_of_expr(&e)).map(TypeInfo::original);
let ty = if self.previous_token_is(T![=>]) {
// match foo { ..., pat => $0 }
cov_mark::hit!(expected_type_match_arm_body_without_leading_char);
cov_mark::hit!(expected_type_match_arm_body_with_leading_char);
self.sema.type_of_expr(&it.into())
} else {
// match foo { $0 }
cov_mark::hit!(expected_type_match_arm_without_leading_char);
it.expr().and_then(|e| self.sema.type_of_expr(&e))
}.map(TypeInfo::original);
(ty, None)
},
ast::IfExpr(it) => {
@ -1589,6 +1599,36 @@ fn foo() {
);
}
#[test]
fn expected_type_match_arm_body_without_leading_char() {
cov_mark::check!(expected_type_match_arm_body_without_leading_char);
check_expected_type_and_name(
r#"
struct Foo;
enum E { X }
fn foo() -> Foo {
match E::X { E::X => $0 }
}
"#,
expect![[r#"ty: Foo, name: ?"#]],
);
}
#[test]
fn expected_type_match_body_arm_with_leading_char() {
cov_mark::check!(expected_type_match_arm_body_with_leading_char);
check_expected_type_and_name(
r#"
struct Foo;
enum E { X }
fn foo() -> Foo {
match E::X { E::X => c$0 }
}
"#,
expect![[r#"ty: Foo, name: ?"#]],
);
}
#[test]
fn expected_type_if_let_without_leading_char() {
cov_mark::check!(expected_type_if_let_without_leading_char);