checker: fix map of function as argument and direct call of function in map (#8494)
parent
969f19daf4
commit
a0a33f7ff1
|
@ -85,8 +85,8 @@ pub fn (mut c Checker) check_basic(got table.Type, expected table.Type) bool {
|
||||||
// fn == 0
|
// fn == 0
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
// array fn
|
// array/map fn
|
||||||
if got_type_sym.kind == .array && exp_type_sym.kind == .array {
|
if got_type_sym.kind in [.array, .map] && exp_type_sym.kind == got_type_sym.kind {
|
||||||
if c.table.type_to_str(got) == c.table.type_to_str(expected).trim('&') {
|
if c.table.type_to_str(got) == c.table.type_to_str(expected).trim('&') {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
|
@ -1707,6 +1707,12 @@ pub fn (mut c Checker) call_fn(mut call_expr ast.CallExpr) table.Type {
|
||||||
if elem_typ.info is table.FnType {
|
if elem_typ.info is table.FnType {
|
||||||
return elem_typ.info.func.return_type
|
return elem_typ.info.func.return_type
|
||||||
}
|
}
|
||||||
|
} else if sym.kind == .map {
|
||||||
|
info := sym.info as table.Map
|
||||||
|
value_typ := c.table.get_type_symbol(info.value_type)
|
||||||
|
if value_typ.info is table.FnType {
|
||||||
|
return value_typ.info.func.return_type
|
||||||
|
}
|
||||||
} else if sym.kind == .array_fixed {
|
} else if sym.kind == .array_fixed {
|
||||||
info := sym.info as table.ArrayFixed
|
info := sym.info as table.ArrayFixed
|
||||||
elem_typ := c.table.get_type_symbol(info.elem_type)
|
elem_typ := c.table.get_type_symbol(info.elem_type)
|
||||||
|
|
|
@ -72,8 +72,7 @@ fn test_map_and_array_with_fns_typeof_and_direct_call() {
|
||||||
assert a[0]('hello') == 15
|
assert a[0]('hello') == 15
|
||||||
b := {'one': foo3}
|
b := {'one': foo3}
|
||||||
assert typeof(b).name == 'map[string]fn (string) int'
|
assert typeof(b).name == 'map[string]fn (string) int'
|
||||||
// TODO: enable this
|
assert b['one']('hi') == 12
|
||||||
// assert b['one']('hi') == 12
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn bar1(mut a []fn (string) int) int {
|
fn bar1(mut a []fn (string) int) int {
|
||||||
|
@ -91,3 +90,19 @@ fn test_array_of_fns_as_argument() {
|
||||||
a2 := [foo3]
|
a2 := [foo3]
|
||||||
assert bar2(a2) == 15
|
assert bar2(a2) == 15
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn bar3(m map[string]fn (string) int) int {
|
||||||
|
return m['fn']('hi')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn bar4(mut m map[string]fn (string) int) int {
|
||||||
|
m['fn'] = foo4
|
||||||
|
return m['fn']('hi')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_map_of_fns_as_argument() {
|
||||||
|
m1 := {'fn': foo3}
|
||||||
|
assert bar3(m1) == 12
|
||||||
|
mut m2 := {'fn': foo3}
|
||||||
|
assert bar4(mut m2) == 22
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue