mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
v.parser: support imported enums as map keys (#10234)
This commit is contained in:
parent
e09f0234ea
commit
6b683d31ac
@ -35,6 +35,7 @@ const (
|
|||||||
'vlib/v/tests/interop_test.v', /* bad comment formatting */
|
'vlib/v/tests/interop_test.v', /* bad comment formatting */
|
||||||
'vlib/v/tests/string_interpolation_test.v' /* TODO byteptr: &byte.str() behaves differently than byteptr.str() */,
|
'vlib/v/tests/string_interpolation_test.v' /* TODO byteptr: &byte.str() behaves differently than byteptr.str() */,
|
||||||
'vlib/v/gen/js/tests/js.v', /* local `hello` fn, gets replaced with module `hello` aliased as `hl` */
|
'vlib/v/gen/js/tests/js.v', /* local `hello` fn, gets replaced with module `hello` aliased as `hl` */
|
||||||
|
'vlib/v/tests/map_enum_keys_test.v' /* temporary here, till PR#10235 is merged */,
|
||||||
'examples/c_interop_wkhtmltopdf.v' /* &charptr --> &&char */,
|
'examples/c_interop_wkhtmltopdf.v' /* &charptr --> &&char */,
|
||||||
]
|
]
|
||||||
vfmt_verify_list = [
|
vfmt_verify_list = [
|
||||||
|
@ -92,8 +92,8 @@ pub fn (mut p Parser) parse_map_type() ast.Type {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
key_type_supported := key_type in [ast.string_type_idx, ast.voidptr_type_idx]
|
key_type_supported := key_type in [ast.string_type_idx, ast.voidptr_type_idx]
|
||||||
|| key_sym.kind == .enum_ || ((key_type.is_int() || key_type.is_float()
|
|| key_sym.kind == .enum_ || key_sym.kind == .placeholder
|
||||||
|| is_alias) && !key_type.is_ptr())
|
|| ((key_type.is_int() || key_type.is_float() || is_alias) && !key_type.is_ptr())
|
||||||
if !key_type_supported {
|
if !key_type_supported {
|
||||||
if is_alias {
|
if is_alias {
|
||||||
p.error('cannot use the alias type as the parent type is unsupported')
|
p.error('cannot use the alias type as the parent type is unsupported')
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
|
// This tests that V can import and use enums from other modules,
|
||||||
|
// and that vfmt can handle all edge cases.
|
||||||
|
import geometry { Shape }
|
||||||
|
|
||||||
enum Token {
|
enum Token {
|
||||||
aa = 2
|
aa = 2
|
||||||
bb
|
bb
|
||||||
@ -10,8 +14,25 @@ fn test_map_with_enum_keys() {
|
|||||||
m[Token.bb] = 'def'
|
m[Token.bb] = 'def'
|
||||||
assert m[Token.aa] == 'abc'
|
assert m[Token.aa] == 'abc'
|
||||||
assert m[.bb] == 'def'
|
assert m[.bb] == 'def'
|
||||||
//
|
|
||||||
s := '$m'
|
s := '$m'
|
||||||
assert s == "{aa: 'abc', bb: 'def'}"
|
assert s == "{aa: 'abc', bb: 'def'}"
|
||||||
println(m)
|
println(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn test_map_with_imported_enum_keys() {
|
||||||
|
mut fm := map[geometry.Form3D]string{}
|
||||||
|
fm[.cube] = 'a cube'
|
||||||
|
fm[geometry.Form3D.sphere] = 'a sphere'
|
||||||
|
assert fm[.invalid] == ''
|
||||||
|
assert geometry.Form3D.cube in fm
|
||||||
|
assert fm[.sphere] == 'a sphere'
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_map_with_selective_imported_enum_keys() {
|
||||||
|
mut shapes := map[Shape]string{}
|
||||||
|
shapes[.circle] = 'a circle'
|
||||||
|
shapes[Shape.rectangle] = 'a rectangle'
|
||||||
|
assert shapes[.circle] == 'a circle'
|
||||||
|
shapes.delete(Shape.circle)
|
||||||
|
assert Shape.circle !in shapes
|
||||||
|
}
|
||||||
|
@ -10,6 +10,15 @@ pub enum Shape {
|
|||||||
triangle
|
triangle
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// used by vlib/v/tests/map_enum_keys_test.v
|
||||||
|
pub enum Form3D {
|
||||||
|
sphere
|
||||||
|
cylinder
|
||||||
|
cone
|
||||||
|
cube
|
||||||
|
invalid
|
||||||
|
}
|
||||||
|
|
||||||
pub struct Point {
|
pub struct Point {
|
||||||
pub mut:
|
pub mut:
|
||||||
x int
|
x int
|
||||||
|
Loading…
Reference in New Issue
Block a user