From 598de74185b76282db113383e7b70506e15aa311 Mon Sep 17 00:00:00 2001 From: Turiiya <34311583+ttytm@users.noreply.github.com> Date: Sun, 5 May 2024 15:19:23 +0200 Subject: [PATCH] vet, parser: move array_init_one_val checks from parser into vet (#21422) --- cmd/tools/vvet/tests/array_init_one_val.out | 3 ++- cmd/tools/vvet/tests/array_init_one_val.vv | 4 ++++ cmd/tools/vvet/vvet.v | 12 ++++++++++++ vlib/v/parser/expr.v | 5 ----- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/cmd/tools/vvet/tests/array_init_one_val.out b/cmd/tools/vvet/tests/array_init_one_val.out index 42bcd163b..25d3f315f 100644 --- a/cmd/tools/vvet/tests/array_init_one_val.out +++ b/cmd/tools/vvet/tests/array_init_one_val.out @@ -1,2 +1,3 @@ -cmd/tools/vvet/tests/array_init_one_val.vv:2: error: Use `var == value` instead of `var in [value]` +cmd/tools/vvet/tests/array_init_one_val.vv:2: error: Use `1 == 1` instead of `1 in [1]` +cmd/tools/vvet/tests/array_init_one_val.vv:6: error: Use `'foo' != bar` instead of `'foo' !in [bar]` Note: You can run `v fmt -w file.v` to fix these errors automatically diff --git a/cmd/tools/vvet/tests/array_init_one_val.vv b/cmd/tools/vvet/tests/array_init_one_val.vv index 2aa35146d..2e50f0ddc 100644 --- a/cmd/tools/vvet/tests/array_init_one_val.vv +++ b/cmd/tools/vvet/tests/array_init_one_val.vv @@ -2,4 +2,8 @@ fn main() { if 1 in [1] { println('hello world') } + bar := 'bar' + if 'foo' !in [bar] { + println('hello world') + } } diff --git a/cmd/tools/vvet/vvet.v b/cmd/tools/vvet/vvet.v index 63b12624a..e9926ebdf 100644 --- a/cmd/tools/vvet/vvet.v +++ b/cmd/tools/vvet/vvet.v @@ -290,6 +290,7 @@ fn (mut vt Vet) expr(expr ast.Expr) { vt.filtered_lines.assigns(expr.pos) } ast.InfixExpr { + vt.vet_in_condition(expr) vt.expr(expr.right) } ast.CallExpr { @@ -303,6 +304,7 @@ fn (mut vt Vet) expr(expr ast.Expr) { } ast.IfExpr { for b in expr.branches { + vt.expr(b.cond) vt.stmts(b.stmts) } } @@ -342,6 +344,16 @@ fn (vt &Vet) e2string(err vet.Error) string { return '${location} ${kind} ${err.message}' } +fn (mut vt Vet) vet_in_condition(expr ast.InfixExpr) { + if expr.right is ast.ArrayInit && expr.right.exprs.len == 1 && expr.op in [.key_in, .not_in] { + left := expr.left.str() + right := expr.right.exprs[0].str() + eq := if expr.op == .key_in { '==' } else { '!=' } + vt.error('Use `${left} ${eq} ${right}` instead of `${left} ${expr.op} [${right}]`', + expr.pos.line_nr, .vfmt) + } +} + fn (mut vt Vet) error(msg string, line int, fix vet.FixKind) { pos := token.Pos{ line_nr: line + 1 diff --git a/vlib/v/parser/expr.v b/vlib/v/parser/expr.v index b0a208e7f..d87812af7 100644 --- a/vlib/v/parser/expr.v +++ b/vlib/v/parser/expr.v @@ -4,7 +4,6 @@ module parser import v.ast -import v.vet import v.token fn (mut p Parser) expr(precedence int) ast.Expr { @@ -686,10 +685,6 @@ fn (mut p Parser) infix_expr(left ast.Expr) ast.Expr { p.inside_in_array = false } p.expecting_type = prev_expecting_type - if p.pref.is_vet && op in [.key_in, .not_in] && right is ast.ArrayInit && right.exprs.len == 1 { - p.vet_error('Use `var == value` instead of `var in [value]`', pos.line_nr, vet.FixKind.vfmt, - .default) - } mut or_stmts := []ast.Stmt{} mut or_kind := ast.OrKind.absent mut or_pos := p.tok.pos() -- 2.39.5