From 4c82b0125e6c85c4b4e39ba8f2f107d6e67685ac Mon Sep 17 00:00:00 2001 From: yuyi Date: Thu, 10 Oct 2024 01:57:00 +0800 Subject: [PATCH] parser: allow enum field names being the same as V keywords (#22456) --- vlib/v/parser/parser.v | 21 ++++++++++++---- .../enum_field_name_same_as_keyword_test.v | 24 +++++++++++++++++++ 2 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 vlib/v/tests/enums/enum_field_name_same_as_keyword_test.v diff --git a/vlib/v/parser/parser.v b/vlib/v/parser/parser.v index 8b91ded8981cd9..73306a74887155 100644 --- a/vlib/v/parser/parser.v +++ b/vlib/v/parser/parser.v @@ -679,17 +679,28 @@ fn (mut p Parser) check_js_name() string { return name } +fn is_ident_name(name string) bool { + if name.len == 0 || !util.name_char_table[name[0]] { + return false + } + for i in 1 .. name.len { + if !util.func_char_table[name[i]] { + return false + } + } + return true +} + fn (mut p Parser) check_name() string { pos := p.tok.pos() name := p.tok.lit if p.tok.kind != .name && p.peek_tok.kind == .dot && name in p.imports { p.register_used_import(name) } - match p.tok.kind { - .key_struct { p.check(.key_struct) } - .key_enum { p.check(.key_enum) } - .key_interface { p.check(.key_interface) } - else { p.check(.name) } + if !is_ident_name(name) { + p.check(.name) + } else { + p.next() } if !p.inside_orm && !p.inside_attr_decl && name == 'sql' { p.error_with_pos('unexpected keyword `sql`, expecting name', pos) diff --git a/vlib/v/tests/enums/enum_field_name_same_as_keyword_test.v b/vlib/v/tests/enums/enum_field_name_same_as_keyword_test.v new file mode 100644 index 00000000000000..935cfdf5f930a9 --- /dev/null +++ b/vlib/v/tests/enums/enum_field_name_same_as_keyword_test.v @@ -0,0 +1,24 @@ +enum Kind { + none + const + enum + struct + interface + sum_type + i32 + f64 +} + +fn type_kind(kind Kind) string { + return '${kind}' +} + +fn test_enum_field_name_same_as_keyword() { + mut ret := type_kind(Kind.none) + println(ret) + assert ret == 'none' + + ret = type_kind(Kind.struct) + println(ret) + assert ret == 'struct' +}