mirror of
https://github.com/vlang/v.git
synced 2025-09-17 11:26:17 -04:00
parser: allow enum field names being the same as V keywords (#22456)
This commit is contained in:
parent
3e6fc364a8
commit
4c82b0125e
@ -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)
|
||||
|
24
vlib/v/tests/enums/enum_field_name_same_as_keyword_test.v
Normal file
24
vlib/v/tests/enums/enum_field_name_same_as_keyword_test.v
Normal file
@ -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'
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user