cgen: use `if foo in [TypeA, TypeB]` in cgen.v (#11518)

pull/11519/head
yuyi 2021-09-17 00:26:53 +08:00 committed by GitHub
parent 1688148828
commit 467afad065
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 10 additions and 11 deletions

View File

@ -2722,9 +2722,8 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
right_sym := g.table.get_type_symbol(unwrapped_val_type) right_sym := g.table.get_type_symbol(unwrapped_val_type)
unaliased_right_sym := g.table.get_final_type_symbol(unwrapped_val_type) unaliased_right_sym := g.table.get_final_type_symbol(unwrapped_val_type)
is_fixed_array_var := unaliased_right_sym.kind == .array_fixed && val !is ast.ArrayInit is_fixed_array_var := unaliased_right_sym.kind == .array_fixed && val !is ast.ArrayInit
&& (val is ast.Ident || val is ast.IndexExpr || val is ast.CallExpr && (val in [ast.Ident, ast.IndexExpr, ast.CallExpr, ast.SelectorExpr]
|| (val is ast.CastExpr && (val as ast.CastExpr).expr !is ast.ArrayInit) || (val is ast.CastExpr && (val as ast.CastExpr).expr !is ast.ArrayInit))
|| val is ast.SelectorExpr)
g.is_assign_lhs = true g.is_assign_lhs = true
g.assign_op = assign_stmt.op g.assign_op = assign_stmt.op
if val_type.has_flag(.optional) { if val_type.has_flag(.optional) {
@ -2877,7 +2876,7 @@ fn (mut g Gen) gen_assign_stmt(assign_stmt ast.AssignStmt) {
} }
} }
} }
if left is ast.Ident || left is ast.SelectorExpr { if left in [ast.Ident, ast.SelectorExpr] {
g.prevent_sum_type_unwrapping_once = true g.prevent_sum_type_unwrapping_once = true
} }
if !is_fixed_array_var || is_decl { if !is_fixed_array_var || is_decl {
@ -3826,7 +3825,7 @@ fn (mut g Gen) selector_expr(node ast.SelectorExpr) {
g.write('.data)') g.write('.data)')
} }
// struct embedding // struct embedding
if sym.info is ast.Struct || sym.info is ast.Aggregate { if sym.info in [ast.Struct, ast.Aggregate] {
if node.from_embed_type != 0 { if node.from_embed_type != 0 {
embed_sym := g.table.get_type_symbol(node.from_embed_type) embed_sym := g.table.get_type_symbol(node.from_embed_type)
embed_name := embed_sym.embed_name() embed_name := embed_sym.embed_name()
@ -3985,8 +3984,8 @@ fn (mut g Gen) need_tmp_var_in_match(node ast.MatchExpr) bool {
if branch.stmts.len == 1 { if branch.stmts.len == 1 {
if branch.stmts[0] is ast.ExprStmt { if branch.stmts[0] is ast.ExprStmt {
stmt := branch.stmts[0] as ast.ExprStmt stmt := branch.stmts[0] as ast.ExprStmt
if stmt.expr is ast.CallExpr || stmt.expr is ast.IfExpr if stmt.expr in [ast.CallExpr, ast.IfExpr, ast.MatchExpr]
|| stmt.expr is ast.MatchExpr || (stmt.expr is ast.IndexExpr || (stmt.expr is ast.IndexExpr
&& (stmt.expr as ast.IndexExpr).or_expr.kind != .absent) { && (stmt.expr as ast.IndexExpr).or_expr.kind != .absent) {
return true return true
} }
@ -4012,8 +4011,9 @@ fn (mut g Gen) match_expr(node ast.MatchExpr) {
if is_expr && !need_tmp_var { if is_expr && !need_tmp_var {
g.inside_ternary++ g.inside_ternary++
} }
if node.cond is ast.Ident || node.cond is ast.SelectorExpr || node.cond is ast.IntegerLiteral if node.cond in [ast.Ident, ast.SelectorExpr, ast.IntegerLiteral, ast.StringLiteral,
|| node.cond is ast.StringLiteral || node.cond is ast.FloatLiteral { ast.FloatLiteral,
] {
cond_var = g.expr_string(node.cond) cond_var = g.expr_string(node.cond)
} else { } else {
line := if is_expr { line := if is_expr {
@ -4336,8 +4336,7 @@ fn (mut g Gen) select_expr(node ast.SelectExpr) {
// send expression // send expression
expr := branch.stmt.expr as ast.InfixExpr expr := branch.stmt.expr as ast.InfixExpr
channels << expr.left channels << expr.left
if expr.right is ast.Ident || expr.right is ast.IndexExpr if expr.right in [ast.Ident, ast.IndexExpr, ast.SelectorExpr, ast.StructInit] {
|| expr.right is ast.SelectorExpr || expr.right is ast.StructInit {
// addressable objects in the `C` output // addressable objects in the `C` output
objs << expr.right objs << expr.right
tmp_objs << '' tmp_objs << ''