From 4ee948feaa5a155cc04ec1243fe8d2f680f7c001 Mon Sep 17 00:00:00 2001 From: yuyi Date: Tue, 24 Sep 2024 17:20:19 +0800 Subject: [PATCH] parser: check enum method duplicated (fix #20924) (#22294) --- vlib/v/ast/ast.v | 1 + vlib/v/parser/fn.v | 13 ++++++++++++- .../parser/tests/enum_method_duplicated_err.out | 7 +++++++ .../parser/tests/enum_method_duplicated_err.vv | 17 +++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 vlib/v/parser/tests/enum_method_duplicated_err.out create mode 100644 vlib/v/parser/tests/enum_method_duplicated_err.vv diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index bb3f88261..b88d15b47 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -666,6 +666,7 @@ pub: file string file_mode Language pos token.Pos + name_pos token.Pos return_type_pos token.Pos pub mut: return_type Type diff --git a/vlib/v/parser/fn.v b/vlib/v/parser/fn.v index 85dbb4031..699779ff5 100644 --- a/vlib/v/parser/fn.v +++ b/vlib/v/parser/fn.v @@ -347,7 +347,16 @@ fn (mut p Parser) fn_decl() ast.FnDecl { } } if is_duplicate { - p.error_with_pos('duplicate method `${name}`', name_pos) + if type_sym.kind == .enum_ + && name in ['is_empty', 'has', 'all', 'set', 'set_all', 'clear', 'clear_all', 'toggle', 'zero', 'from'] { + if enum_fn := type_sym.find_method(name) { + name_pos = enum_fn.name_pos + } + p.error_with_pos('duplicate method `${name}`, `${name}` is an enum type built-in method', + name_pos) + } else { + p.error_with_pos('duplicate method `${name}`', name_pos) + } return ast.FnDecl{ scope: unsafe { nil } } @@ -539,6 +548,7 @@ run them via `v file.v` instead', mod: p.mod file: p.file_path pos: start_pos + name_pos: name_pos language: language }) } else { @@ -591,6 +601,7 @@ run them via `v file.v` instead', mod: p.mod file: p.file_path pos: start_pos + name_pos: name_pos language: language }) } diff --git a/vlib/v/parser/tests/enum_method_duplicated_err.out b/vlib/v/parser/tests/enum_method_duplicated_err.out new file mode 100644 index 000000000..a46b0652a --- /dev/null +++ b/vlib/v/parser/tests/enum_method_duplicated_err.out @@ -0,0 +1,7 @@ +vlib/v/parser/tests/enum_method_duplicated_err.vv:13:14: error: duplicate method `has`, `has` is an enum type built-in method + 11 | } + 12 | + 13 | fn (f Flags) has(f2 Flags) bool { + | ~~~ + 14 | return f & f2 > 0 + 15 | } diff --git a/vlib/v/parser/tests/enum_method_duplicated_err.vv b/vlib/v/parser/tests/enum_method_duplicated_err.vv new file mode 100644 index 000000000..115466c41 --- /dev/null +++ b/vlib/v/parser/tests/enum_method_duplicated_err.vv @@ -0,0 +1,17 @@ +@[flag] +enum Flags { + bit0 + bit1 + bit2 + bit3 + bit4 + bit5 + bit6 + bit7 +} + +fn (f Flags) has(f2 Flags) bool { + return f & f2 > 0 +} + +fn main() {} -- 2.39.5