checker: fix struct embed with overriden method

pull/7768/head
Joe Conigliaro 2021-01-01 09:50:00 +11:00
parent e9f9f27e49
commit 8700080c4a
No known key found for this signature in database
GPG Key ID: C12F7136C08206F1
1 changed files with 23 additions and 19 deletions

View File

@ -1289,6 +1289,15 @@ pub fn (mut c Checker) call_method(mut call_expr ast.CallExpr) table.Type {
method = m
has_method = true
} else {
if left_type_sym.kind == .aggregate {
// the error message contains the problematic type
unknown_method_msg = err
}
}
// check even if method is found, we could be overriding a method (TODO: should this be allowed?)
// can this logic be moved to table.type_find_method() so it can be used from anywhere
// TODO: should overriden methods use embed type name to access it's methods?
// eg go does: `fn (mut app App) text() vweb.Result { return app.Context.text() }`
if left_type_sym.info is table.Struct {
mut found_methods := []table.Fn{}
mut embed_of_found_methods := []table.Type{}
@ -1308,11 +1317,6 @@ pub fn (mut c Checker) call_method(mut call_expr ast.CallExpr) table.Type {
c.error('ambiguous method `$method_name`', call_expr.pos)
}
}
if left_type_sym.kind == .aggregate {
// the error message contains the problematic type
unknown_method_msg = err
}
}
if has_method {
if !method.is_pub && !c.is_builtin_mod && !c.pref.is_test && left_type_sym.mod != c.mod &&
left_type_sym.mod != '' { // method.mod != c.mod {