checker: revert embedded methods fix (#7780)

pull/7783/head
Daniel Däschle 2021-01-01 14:36:07 +01:00 committed by GitHub
parent 2e8f187819
commit 5ae3637d27
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 25 deletions

View File

@ -41,9 +41,9 @@ pub fn (mut app App) index() {
} }
fn (mut app App) text() vweb.Result { fn (mut app App) text() vweb.Result {
return app.text('Hello, world from vweb!') return app.Context.text('Hello, world from vweb!')
} }
fn (mut app App) time() vweb.Result { fn (mut app App) time() vweb.Result {
return app.text(time.now().format()) return app.Context.text(time.now().format())
} }

View File

@ -1289,34 +1289,31 @@ pub fn (mut c Checker) call_method(mut call_expr ast.CallExpr) table.Type {
method = m method = m
has_method = true has_method = true
} else { } else {
// can this logic be moved to table.type_find_method() so it can be used from anywhere
if left_type_sym.info is table.Struct {
mut found_methods := []table.Fn{}
mut embed_of_found_methods := []table.Type{}
for embed in left_type_sym.info.embeds {
embed_sym := c.table.get_type_symbol(embed)
if m := c.table.type_find_method(embed_sym, method_name) {
found_methods << m
embed_of_found_methods << embed
}
}
if found_methods.len == 1 {
method = found_methods[0]
has_method = true
is_method_from_embed = true
call_expr.from_embed_type = embed_of_found_methods[0]
} else if found_methods.len > 1 {
c.error('ambiguous method `$method_name`', call_expr.pos)
}
}
if left_type_sym.kind == .aggregate { if left_type_sym.kind == .aggregate {
// the error message contains the problematic type // the error message contains the problematic type
unknown_method_msg = err 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{}
for embed in left_type_sym.info.embeds {
embed_sym := c.table.get_type_symbol(embed)
if m := c.table.type_find_method(embed_sym, method_name) {
found_methods << m
embed_of_found_methods << embed
}
}
if found_methods.len == 1 {
method = found_methods[0]
has_method = true
is_method_from_embed = true
call_expr.from_embed_type = embed_of_found_methods[0]
} else if found_methods.len > 1 {
c.error('ambiguous method `$method_name`', call_expr.pos)
}
}
if has_method { if has_method {
if !method.is_pub && !c.is_builtin_mod && !c.pref.is_test && left_type_sym.mod != c.mod && 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 { left_type_sym.mod != '' { // method.mod != c.mod {