From 97d01a985bc6a844d46f05b3cd0b06188a9c4603 Mon Sep 17 00:00:00 2001 From: Swastik Baranwal Date: Mon, 18 Dec 2023 22:50:38 +0530 Subject: [PATCH] checker: refactor `string` to `enum` error check, handle `EnumName(string_variable)` too (#20210) --- vlib/v/checker/checker.v | 4 ++-- vlib/v/checker/tests/string_to_enum_cast_err.out | 10 +++++++++- vlib/v/checker/tests/string_to_enum_cast_err.vv | 3 +++ 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index 8d3e01b9bf732d..1af632e137d71d 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -3318,8 +3318,8 @@ fn (mut c Checker) cast_expr(mut node ast.CastExpr) ast.Type { } } } - if mut node.expr is ast.StringLiteral { - c.add_error_detail('use ${c.table.type_to_str(node.typ)}.from_string(\'${node.expr.val}\') instead') + if node.expr_type == ast.string_type_idx { + c.add_error_detail('use ${c.table.type_to_str(node.typ)}.from_string(${node.expr}) instead') c.error('cannot cast `string` to `enum`', node.pos) } } diff --git a/vlib/v/checker/tests/string_to_enum_cast_err.out b/vlib/v/checker/tests/string_to_enum_cast_err.out index a4753fcc920a92..dbdf6cd6d235e7 100644 --- a/vlib/v/checker/tests/string_to_enum_cast_err.out +++ b/vlib/v/checker/tests/string_to_enum_cast_err.out @@ -3,5 +3,13 @@ vlib/v/checker/tests/string_to_enum_cast_err.vv:8:7: error: cannot cast `string` 7 | fn main() { 8 | _ := Test('one') | ~~~~~~~~~~~ - 9 | } + 9 | + 10 | my_str := 'one' Details: use main.Test.from_string('one') instead +vlib/v/checker/tests/string_to_enum_cast_err.vv:11:7: error: cannot cast `string` to `enum` + 9 | + 10 | my_str := 'one' + 11 | _ := Test(my_str) + | ~~~~~~~~~~~~ + 12 | } +Details: use main.Test.from_string(my_str) instead diff --git a/vlib/v/checker/tests/string_to_enum_cast_err.vv b/vlib/v/checker/tests/string_to_enum_cast_err.vv index 293e55c79e781f..03794d1d0f524a 100644 --- a/vlib/v/checker/tests/string_to_enum_cast_err.vv +++ b/vlib/v/checker/tests/string_to_enum_cast_err.vv @@ -6,4 +6,7 @@ enum Test { fn main() { _ := Test('one') + + my_str := 'one' + _ := Test(my_str) }