Merge pull request #21291 from A4-Tacks/expected-nested-match-arm-expr-ty
Fix match arm nested body invalid expected type
This commit is contained in:
commit
0b1740bf76
3 changed files with 43 additions and 0 deletions
|
|
@ -734,6 +734,23 @@ fn expected_type_and_name<'db>(
|
|||
}.map(TypeInfo::original);
|
||||
(ty, None)
|
||||
},
|
||||
ast::MatchArm(it) => {
|
||||
let on_arrow = previous_non_trivia_token(token.clone()).is_some_and(|it| T![=>] == it.kind());
|
||||
let in_body = it.expr().is_some_and(|it| it.syntax().text_range().contains_range(token.text_range()));
|
||||
let match_expr = it.parent_match();
|
||||
|
||||
let ty = if on_arrow || in_body {
|
||||
// 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);
|
||||
sema.type_of_expr(&match_expr.into())
|
||||
} else {
|
||||
// match foo { $0 }
|
||||
cov_mark::hit!(expected_type_match_arm_without_leading_char);
|
||||
match_expr.expr().and_then(|e| sema.type_of_expr(&e))
|
||||
}.map(TypeInfo::original);
|
||||
(ty, None)
|
||||
},
|
||||
ast::IfExpr(it) => {
|
||||
let ty = if let Some(body) = it.then_branch()
|
||||
&& token.text_range().end() > body.syntax().text_range().start()
|
||||
|
|
|
|||
|
|
@ -256,6 +256,22 @@ fn foo() -> Foo {
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn expected_type_match_arm_block_body_without_leading_char() {
|
||||
cov_mark::check!(expected_type_match_arm_body_without_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 { Foo::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);
|
||||
|
|
|
|||
|
|
@ -1096,6 +1096,16 @@ impl ast::MatchGuard {
|
|||
}
|
||||
}
|
||||
|
||||
impl ast::MatchArm {
|
||||
pub fn parent_match(&self) -> ast::MatchExpr {
|
||||
self.syntax()
|
||||
.parent()
|
||||
.and_then(|it| it.parent())
|
||||
.and_then(ast::MatchExpr::cast)
|
||||
.expect("MatchArms are always nested in MatchExprs")
|
||||
}
|
||||
}
|
||||
|
||||
impl From<ast::Item> for ast::AnyHasAttrs {
|
||||
fn from(node: ast::Item) -> Self {
|
||||
Self::new(node)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue