checker: fix error for array of sumtype init (#13501)
parent
072480352c
commit
14073ac0fe
|
@ -71,11 +71,15 @@ pub fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type {
|
|||
if node.exprs.len > 0 && node.elem_type == ast.void_type {
|
||||
mut expected_value_type := ast.void_type
|
||||
mut expecting_interface_array := false
|
||||
mut expecting_sumtype_array := false
|
||||
if c.expected_type != 0 {
|
||||
expected_value_type = c.table.value_type(c.expected_type)
|
||||
if c.table.sym(expected_value_type).kind == .interface_ {
|
||||
expected_value_sym := c.table.sym(expected_value_type)
|
||||
if expected_value_sym.kind == .interface_ {
|
||||
// Array of interfaces? (`[dog, cat]`) Save the interface type (`Animal`)
|
||||
expecting_interface_array = true
|
||||
} else if expected_value_sym.kind == .sum_type {
|
||||
expecting_sumtype_array = true
|
||||
}
|
||||
}
|
||||
// expecting_interface_array := c.expected_type != 0 &&
|
||||
|
@ -104,6 +108,11 @@ pub fn (mut c Checker) array_init(mut node ast.ArrayInit) ast.Type {
|
|||
}
|
||||
}
|
||||
continue
|
||||
} else if expecting_sumtype_array {
|
||||
if i == 0 {
|
||||
elem_type = expected_value_type
|
||||
}
|
||||
continue
|
||||
}
|
||||
// The first element's type
|
||||
if i == 0 {
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
pub type MenuItem = Action | Group | Separater
|
||||
|
||||
pub struct Group {
|
||||
children []MenuItem
|
||||
}
|
||||
|
||||
pub struct Separater {}
|
||||
|
||||
pub struct Action {}
|
||||
|
||||
fn test_array_of_sumtype_init() {
|
||||
g := Group{
|
||||
children: [
|
||||
Action{},
|
||||
Separater{},
|
||||
Group{
|
||||
children: [
|
||||
Action{},
|
||||
]
|
||||
},
|
||||
]
|
||||
}
|
||||
println(g)
|
||||
assert g.children.len == 3
|
||||
}
|
Loading…
Reference in New Issue