From 018975b0418f5b5baa1a5403fce32a53d95e5068 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Thu, 19 May 2022 12:27:43 +0200 Subject: [PATCH] fix: Fix incorrect expected type in completions for match arms --- crates/ide-completion/src/context.rs | 44 ++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/crates/ide-completion/src/context.rs b/crates/ide-completion/src/context.rs index fbf3278ad1f..e51ae0dc3b5 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) => { @@ -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);