Skip to content

Commit

Permalink
parser: allow enum field names being the same as V keywords (#22456)
Browse files Browse the repository at this point in the history
  • Loading branch information
yuyi98 authored Oct 9, 2024
1 parent 3e6fc36 commit 4c82b01
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 5 deletions.
21 changes: 16 additions & 5 deletions vlib/v/parser/parser.v
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
24 changes: 24 additions & 0 deletions vlib/v/tests/enums/enum_field_name_same_as_keyword_test.v
Original file line number Diff line number Diff line change
@@ -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'
}

0 comments on commit 4c82b01

Please sign in to comment.