mirror of
https://github.com/vlang/v.git
synced 2025-09-13 22:42:26 +03:00
This commit is contained in:
parent
ab45d80fa5
commit
d750528f06
2 changed files with 32 additions and 8 deletions
|
@ -4161,15 +4161,18 @@ fn (mut p Parser) enum_decl() ast.EnumDecl {
|
|||
isb.write_string(' val := unsafe{ ${enum_name}(input) }\n')
|
||||
if is_flag {
|
||||
isb.write_string(' if input == 0 { return val }\n')
|
||||
all_bits_set_value := '0b' + '1'.repeat(fields.len)
|
||||
isb.write_string(' if input & ~${all_bits_set_value} == 0 { return val }\n')
|
||||
} else {
|
||||
isb.write_string(' match val {\n')
|
||||
for f in fields {
|
||||
isb.write_string(' .${f.source_name} { return ${enum_name}.${f.source_name} }\n')
|
||||
}
|
||||
if is_flag {
|
||||
isb.write_string(' else{}\n')
|
||||
}
|
||||
isb.write_string(' }\n')
|
||||
}
|
||||
isb.write_string(' match val {\n')
|
||||
for f in fields {
|
||||
isb.write_string(' .${f.source_name} { return ${enum_name}.${f.source_name} }\n')
|
||||
}
|
||||
if is_flag {
|
||||
isb.write_string(' else{}\n')
|
||||
}
|
||||
isb.write_string(' }\n')
|
||||
isb.write_string(' }\n')
|
||||
isb.write_string(' \$if input is \$string {\n')
|
||||
isb.write_string(' val := input.str()\n') // TODO: this should not be needed, the `$if input is $string` above should have already smartcasted `input`
|
||||
|
|
21
vlib/v/tests/enum_flag_from_test.v
Normal file
21
vlib/v/tests/enum_flag_from_test.v
Normal file
|
@ -0,0 +1,21 @@
|
|||
@[flag]
|
||||
pub enum Flag as u8 {
|
||||
flag0
|
||||
flag1
|
||||
flag2
|
||||
flag3
|
||||
flag4
|
||||
flag5
|
||||
flag6
|
||||
flag7
|
||||
}
|
||||
|
||||
fn test_ok() {
|
||||
a := Flag.from(0b10101110) or { panic(err) }
|
||||
assert a == Flag.flag1 | .flag2 | .flag3 | .flag5 | .flag7
|
||||
}
|
||||
|
||||
fn test_fail() {
|
||||
a := Flag.from(0b110101110) or { Flag(Flag.flag0) }
|
||||
assert a == Flag.flag0
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue