1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

checker: change smartcast(expr_ ast.Expr,..) to smartcast(mut expr ast.Expr,..) (#18777)

This commit is contained in:
yuyi 2023-07-04 21:29:11 +08:00 committed by GitHub
parent 52ddefbdc5
commit 5fd0338399
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 14 additions and 14 deletions

View File

@ -3572,14 +3572,13 @@ fn (mut c Checker) concat_expr(mut node ast.ConcatExpr) ast.Type {
} }
// smartcast takes the expression with the current type which should be smartcasted to the target type in the given scope // smartcast takes the expression with the current type which should be smartcasted to the target type in the given scope
fn (mut c Checker) smartcast(expr_ ast.Expr, cur_type ast.Type, to_type_ ast.Type, mut scope ast.Scope) { fn (mut c Checker) smartcast(mut expr ast.Expr, cur_type ast.Type, to_type_ ast.Type, mut scope ast.Scope) {
sym := c.table.sym(cur_type) sym := c.table.sym(cur_type)
to_type := if sym.kind == .interface_ && c.table.sym(to_type_).kind != .interface_ { to_type := if sym.kind == .interface_ && c.table.sym(to_type_).kind != .interface_ {
to_type_.ref() to_type_.ref()
} else { } else {
to_type_ to_type_
} }
mut expr := unsafe { expr_ }
match mut expr { match mut expr {
ast.SelectorExpr { ast.SelectorExpr {
mut is_mut := false mut is_mut := false

View File

@ -290,7 +290,7 @@ fn (mut c Checker) for_stmt(mut node ast.ForStmt) {
if node.cond.op == .key_is { if node.cond.op == .key_is {
if node.cond.right is ast.TypeNode && node.cond.left in [ast.Ident, ast.SelectorExpr] { if node.cond.right is ast.TypeNode && node.cond.left in [ast.Ident, ast.SelectorExpr] {
if c.table.type_kind(node.cond.left_type) in [.sum_type, .interface_] { if c.table.type_kind(node.cond.left_type) in [.sum_type, .interface_] {
c.smartcast(node.cond.left, node.cond.left_type, node.cond.right_type, mut c.smartcast(mut node.cond.left, node.cond.left_type, node.cond.right_type, mut
node.scope) node.scope)
} }
} }

View File

@ -310,7 +310,7 @@ fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
} }
} else { } else {
// smartcast sumtypes and interfaces when using `is` // smartcast sumtypes and interfaces when using `is`
c.smartcast_if_conds(branch.cond, mut branch.scope) c.smartcast_if_conds(mut branch.cond, mut branch.scope)
if node_is_expr { if node_is_expr {
c.stmts_ending_with_expression(mut branch.stmts) c.stmts_ending_with_expression(mut branch.stmts)
} else { } else {
@ -465,11 +465,11 @@ fn (mut c Checker) if_expr(mut node ast.IfExpr) ast.Type {
return node.typ return node.typ
} }
fn (mut c Checker) smartcast_if_conds(node ast.Expr, mut scope ast.Scope) { fn (mut c Checker) smartcast_if_conds(mut node ast.Expr, mut scope ast.Scope) {
if node is ast.InfixExpr { if mut node is ast.InfixExpr {
if node.op == .and { if node.op == .and {
c.smartcast_if_conds(node.left, mut scope) c.smartcast_if_conds(mut node.left, mut scope)
c.smartcast_if_conds(node.right, mut scope) c.smartcast_if_conds(mut node.right, mut scope)
} else if node.op == .key_is { } else if node.op == .key_is {
right_expr := node.right right_expr := node.right
right_type := match right_expr { right_type := match right_expr {
@ -501,7 +501,7 @@ fn (mut c Checker) smartcast_if_conds(node ast.Expr, mut scope ast.Scope) {
c.error('cannot use type `${expect_str}` as type `${expr_str}`', node.pos) c.error('cannot use type `${expect_str}` as type `${expr_str}`', node.pos)
} }
if node.left in [ast.Ident, ast.SelectorExpr] && node.right is ast.TypeNode { if node.left in [ast.Ident, ast.SelectorExpr] && node.right is ast.TypeNode {
is_variable := if node.left is ast.Ident { is_variable := if mut node.left is ast.Ident {
node.left.kind == .variable node.left.kind == .variable
} else { } else {
true true
@ -512,7 +512,7 @@ fn (mut c Checker) smartcast_if_conds(node ast.Expr, mut scope ast.Scope) {
c.fail_if_immutable(node.left) c.fail_if_immutable(node.left)
} }
// TODO: Add check for sum types in a way that it doesn't break a lot of compiler code // TODO: Add check for sum types in a way that it doesn't break a lot of compiler code
if node.left is ast.Ident if mut node.left is ast.Ident
&& (left_sym.kind == .interface_ && right_sym.kind != .interface_) { && (left_sym.kind == .interface_ && right_sym.kind != .interface_) {
v := scope.find_var(node.left.name) or { &ast.Var{} } v := scope.find_var(node.left.name) or { &ast.Var{} }
if v.is_mut && !node.left.is_mut { if v.is_mut && !node.left.is_mut {
@ -521,14 +521,15 @@ fn (mut c Checker) smartcast_if_conds(node ast.Expr, mut scope ast.Scope) {
} }
} }
if left_sym.kind in [.interface_, .sum_type] { if left_sym.kind in [.interface_, .sum_type] {
c.smartcast(node.left, node.left_type, right_type, mut scope) c.smartcast(mut node.left, node.left_type, right_type, mut
scope)
} }
} }
} }
} }
} }
} else if node is ast.Likely { } else if mut node is ast.Likely {
c.smartcast_if_conds(node.expr, mut scope) c.smartcast_if_conds(mut node.expr, mut scope)
} }
} }

View File

@ -357,7 +357,7 @@ fn (mut c Checker) match_exprs(mut node ast.MatchExpr, cond_type_sym ast.TypeSym
expr_type = expr_types[0].typ expr_type = expr_types[0].typ
} }
c.smartcast(node.cond, node.cond_type, expr_type, mut branch.scope) c.smartcast(mut node.cond, node.cond_type, expr_type, mut branch.scope)
} }
} }
} }