mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-02 07:22:42 +00:00
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:
commit
4f7d1a9d69
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user