checker: check method args
parent
36bf99ed5a
commit
b2157388d9
|
@ -28,6 +28,6 @@ fn test_eventbus(){
|
|||
assert !eb.subscriber.is_subscribed("on_test")
|
||||
}
|
||||
|
||||
fn on_test(sender voidptr, ev &EventData) {
|
||||
fn on_test(sender voidptr, ev &EventData, x voidptr) {
|
||||
assert ev.data == "hello"
|
||||
}
|
||||
|
|
|
@ -658,17 +658,28 @@ pub fn (mut c Checker) call_method(call_expr mut ast.CallExpr) table.Type {
|
|||
// call_expr.args << method.args[0].typ
|
||||
// call_expr.exp_arg_types << method.args[0].typ
|
||||
for i, arg in call_expr.args {
|
||||
c.expected_type = if method.is_variadic && i >= method.args.len - 1 {
|
||||
exp_arg_typ := if method.is_variadic && i >= method.args.len - 1 {
|
||||
method.args[method.args.len - 1].typ
|
||||
} else {
|
||||
method.args[i + 1].typ
|
||||
}
|
||||
arg_typ := c.expr(arg.expr)
|
||||
call_expr.args[i].typ = arg_typ
|
||||
if method.is_variadic && arg_typ.flag_is(.variadic) && call_expr.args.len - 1 >
|
||||
c.expected_type = exp_arg_typ
|
||||
got_arg_typ := c.expr(arg.expr)
|
||||
call_expr.args[i].typ = got_arg_typ
|
||||
if method.is_variadic && got_arg_typ.flag_is(.variadic) && call_expr.args.len - 1 >
|
||||
i {
|
||||
c.error('when forwarding a varg variable, it must be the final argument', call_expr.pos)
|
||||
}
|
||||
if !c.table.check(got_arg_typ, exp_arg_typ) {
|
||||
got_arg_sym := c.table.get_type_symbol(got_arg_typ)
|
||||
exp_arg_sym := c.table.get_type_symbol(exp_arg_typ)
|
||||
// str method, allow type with str method if fn arg is string
|
||||
if exp_arg_sym.kind == .string && got_arg_sym.has_method('str') {
|
||||
continue
|
||||
}
|
||||
c.error('cannot use type `$got_arg_sym.str()` as type `$exp_arg_sym.str()` in argument ${i+1} to `${left_type_sym.name}.$method_name`',
|
||||
call_expr.pos)
|
||||
}
|
||||
}
|
||||
// TODO: typ optimize.. this node can get processed more than once
|
||||
if call_expr.expected_arg_types.len == 0 {
|
||||
|
|
|
@ -529,10 +529,17 @@ pub fn (t &Table) check(got, expected Type) bool {
|
|||
if got_type_sym.kind == .function && exp_type_sym.kind == .function {
|
||||
got_info := got_type_sym.info as FnType
|
||||
exp_info := exp_type_sym.info as FnType
|
||||
if got_info.func.signature() == exp_info.func.signature() {
|
||||
if got_info.func.args.len == exp_info.func.args.len {
|
||||
mut matching := false
|
||||
for i, arg in got_info.func.args {
|
||||
exp_arg := exp_info.func.args[i]
|
||||
matching = arg.typ.idx() == exp_arg.typ.idx() || exp_arg.typ == table.voidptr_type
|
||||
}
|
||||
if matching {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
if got_idx != exp_idx {
|
||||
// && got.typ.name != expected.typ.name*/
|
||||
return false
|
||||
|
|
Loading…
Reference in New Issue