parent
2bcc733ff6
commit
04221475d1
|
@ -5935,12 +5935,29 @@ fn (mut g Gen) go_expr(node ast.GoExpr) {
|
||||||
} else {
|
} else {
|
||||||
g.gowrappers.write_string('\t')
|
g.gowrappers.write_string('\t')
|
||||||
}
|
}
|
||||||
g.gowrappers.write_string('${name}(')
|
|
||||||
if expr.is_method {
|
if expr.is_method {
|
||||||
|
unwrapped_rec_type := g.unwrap_generic(expr.receiver_type)
|
||||||
|
typ_sym := g.table.get_type_symbol(unwrapped_rec_type)
|
||||||
|
if typ_sym.kind == .interface_
|
||||||
|
&& (typ_sym.info as ast.Interface).defines_method(expr.name) {
|
||||||
|
rec_cc_type := g.cc_type(unwrapped_rec_type, false)
|
||||||
|
receiver_type_name := util.no_dots(rec_cc_type)
|
||||||
|
g.gowrappers.write_string('${c_name(receiver_type_name)}_name_table[')
|
||||||
g.gowrappers.write_string('arg->arg0')
|
g.gowrappers.write_string('arg->arg0')
|
||||||
|
dot := if expr.left_type.is_ptr() { '->' } else { '.' }
|
||||||
|
mname := c_name(expr.name)
|
||||||
|
g.gowrappers.write_string('${dot}_typ]._method_${mname}(')
|
||||||
|
g.gowrappers.write_string('arg->arg0')
|
||||||
|
g.gowrappers.write_string('${dot}_object')
|
||||||
|
} else {
|
||||||
|
g.gowrappers.write_string('${name}(')
|
||||||
|
g.gowrappers.write_string('arg->arg0')
|
||||||
|
}
|
||||||
if expr.args.len > 0 {
|
if expr.args.len > 0 {
|
||||||
g.gowrappers.write_string(', ')
|
g.gowrappers.write_string(', ')
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
g.gowrappers.write_string('${name}(')
|
||||||
}
|
}
|
||||||
if expr.args.len > 0 {
|
if expr.args.len > 0 {
|
||||||
mut has_cast := false
|
mut has_cast := false
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
interface CanPerformTask {
|
||||||
|
task()
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Task1 {}
|
||||||
|
|
||||||
|
fn (task1 Task1) task() {
|
||||||
|
println('task1')
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Task2 {}
|
||||||
|
|
||||||
|
fn (task2 Task2) task() {
|
||||||
|
println('task2')
|
||||||
|
}
|
||||||
|
|
||||||
|
fn test_go_call_interface_method() {
|
||||||
|
mut tasks := []CanPerformTask{}
|
||||||
|
|
||||||
|
tasks << Task1{}
|
||||||
|
tasks << Task2{}
|
||||||
|
|
||||||
|
for task in tasks {
|
||||||
|
go task.task()
|
||||||
|
}
|
||||||
|
|
||||||
|
assert true
|
||||||
|
}
|
Loading…
Reference in New Issue