checker: fix map of function as argument and direct call of function in map (#8494)

pull/8504/head
Ruofan XU 2021-02-02 10:58:32 +08:00 committed by GitHub
parent 969f19daf4
commit a0a33f7ff1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 4 deletions

View File

@ -85,8 +85,8 @@ pub fn (mut c Checker) check_basic(got table.Type, expected table.Type) bool {
// fn == 0
return true
}
// array fn
if got_type_sym.kind == .array && exp_type_sym.kind == .array {
// array/map fn
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('&') {
return true
}

View File

@ -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 {
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 {
info := sym.info as table.ArrayFixed
elem_typ := c.table.get_type_symbol(info.elem_type)

View File

@ -72,8 +72,7 @@ fn test_map_and_array_with_fns_typeof_and_direct_call() {
assert a[0]('hello') == 15
b := {'one': foo3}
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 {
@ -91,3 +90,19 @@ fn test_array_of_fns_as_argument() {
a2 := [foo3]
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
}