Unnamed repository; edit this file 'description' to name the repository.
-rw-r--r--crates/ide-completion/src/context.rs44
1 files changed, 42 insertions, 2 deletions
diff --git a/crates/ide-completion/src/context.rs b/crates/ide-completion/src/context.rs
index fbf3278ad1..e51ae0dc3b 100644
--- a/crates/ide-completion/src/context.rs
+++ b/crates/ide-completion/src/context.rs
@@ -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) => {
@@ -1590,6 +1600,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);
check_expected_type_and_name(