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,7 +4161,9 @@ fn (mut p Parser) enum_decl() ast.EnumDecl {
|
||||||
isb.write_string(' val := unsafe{ ${enum_name}(input) }\n')
|
isb.write_string(' val := unsafe{ ${enum_name}(input) }\n')
|
||||||
if is_flag {
|
if is_flag {
|
||||||
isb.write_string(' if input == 0 { return val }\n')
|
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')
|
isb.write_string(' match val {\n')
|
||||||
for f in fields {
|
for f in fields {
|
||||||
isb.write_string(' .${f.source_name} { return ${enum_name}.${f.source_name} }\n')
|
isb.write_string(' .${f.source_name} { return ${enum_name}.${f.source_name} }\n')
|
||||||
|
@ -4170,6 +4172,7 @@ fn (mut p Parser) enum_decl() ast.EnumDecl {
|
||||||
isb.write_string(' else{}\n')
|
isb.write_string(' else{}\n')
|
||||||
}
|
}
|
||||||
isb.write_string(' }\n')
|
isb.write_string(' }\n')
|
||||||
|
}
|
||||||
isb.write_string(' }\n')
|
isb.write_string(' }\n')
|
||||||
isb.write_string(' \$if input is \$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`
|
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