checker: minor cleanup in match_expr() (#13753)

pull/13754/head
yuyi 2022-03-16 21:39:57 +08:00 committed by GitHub
parent 33167960ed
commit 315e07abf6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 26 additions and 34 deletions

View File

@ -66,40 +66,36 @@ pub fn (mut c Checker) match_expr(mut node ast.MatchExpr) ast.Type {
// If the last statement is an expression, return its type // If the last statement is an expression, return its type
if branch.stmts.len > 0 { if branch.stmts.len > 0 {
mut stmt := branch.stmts[branch.stmts.len - 1] mut stmt := branch.stmts[branch.stmts.len - 1]
match mut stmt { if mut stmt is ast.ExprStmt {
ast.ExprStmt { if node.is_expr {
if node.is_expr { c.expected_type = node.expected_type
c.expected_type = node.expected_type }
expr_type := c.expr(stmt.expr)
if first_iteration {
if node.is_expr && (node.expected_type.has_flag(.optional)
|| c.table.type_kind(node.expected_type) == .sum_type) {
ret_type = node.expected_type
} else {
ret_type = expr_type
} }
expr_type := c.expr(stmt.expr) stmt.typ = expr_type
if first_iteration { } else if node.is_expr && ret_type.idx() != expr_type.idx() {
if node.is_expr && (node.expected_type.has_flag(.optional) if !c.check_types(ret_type, expr_type) && !c.check_types(expr_type, ret_type) {
|| c.table.type_kind(node.expected_type) == .sum_type) { ret_sym := c.table.sym(ret_type)
ret_type = node.expected_type is_noreturn := is_noreturn_callexpr(stmt.expr)
} else { if !(node.is_expr && ret_sym.kind == .sum_type
ret_type = expr_type && (ret_type.has_flag(.generic)
} || c.table.is_sumtype_or_in_variant(ret_type, expr_type)))
stmt.typ = expr_type && !is_noreturn {
} else if node.is_expr && ret_type.idx() != expr_type.idx() { c.error('return type mismatch, it should be `$ret_sym.name`',
if !c.check_types(ret_type, expr_type) stmt.expr.pos())
&& !c.check_types(expr_type, ret_type) {
ret_sym := c.table.sym(ret_type)
is_noreturn := is_noreturn_callexpr(stmt.expr)
if !(node.is_expr && ret_sym.kind == .sum_type
&& (ret_type.has_flag(.generic)
|| c.table.is_sumtype_or_in_variant(ret_type, expr_type)))
&& !is_noreturn {
c.error('return type mismatch, it should be `$ret_sym.name`',
stmt.expr.pos())
}
} }
} }
} }
else { } else {
if node.is_expr && ret_type != ast.void_type { if node.is_expr && ret_type != ast.void_type {
c.error('`match` expression requires an expression as the last statement of every branch', c.error('`match` expression requires an expression as the last statement of every branch',
stmt.pos) stmt.pos)
}
} }
} }
} }
@ -122,10 +118,6 @@ pub fn (mut c Checker) match_expr(mut node ast.MatchExpr) ast.Type {
c.returns = false c.returns = false
} }
} }
// if ret_type != ast.void_type {
// node.is_expr = c.expected_type != ast.void_type
// node.expected_type = c.expected_type
// }
node.return_type = ret_type node.return_type = ret_type
cond_var := c.get_base_name(&node.cond) cond_var := c.get_base_name(&node.cond)
if cond_var != '' { if cond_var != '' {