Skip to content

Commit

Permalink
parser: allow multiple flag values in enum.from() for flag enums (fix #…
Browse files Browse the repository at this point in the history
  • Loading branch information
felipensp authored Jun 1, 2024
1 parent ab45d80 commit d750528
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 8 deletions.
19 changes: 11 additions & 8 deletions vlib/v/parser/parser.v
Original file line number Diff line number Diff line change
Expand Up @@ -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`
Expand Down
21 changes: 21 additions & 0 deletions vlib/v/tests/enum_flag_from_test.v
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit d750528

Please sign in to comment.