File tree Expand file tree Collapse file tree 2 files changed +47
-2
lines changed Expand file tree Collapse file tree 2 files changed +47
-2
lines changed Original file line number Diff line number Diff line change @@ -5935,12 +5935,29 @@ fn (mut g Gen) go_expr(node ast.GoExpr) {
5935
5935
} else {
5936
5936
g.gowrappers.write_string ('\t ' )
5937
5937
}
5938
- g.gowrappers.write_string ('${name} (' )
5939
5938
if expr.is_method {
5940
- g.gowrappers.write_string ('arg->arg0' )
5939
+ unwrapped_rec_type := g.unwrap_generic (expr.receiver_type)
5940
+ typ_sym := g.table.get_type_symbol (unwrapped_rec_type)
5941
+ if typ_sym.kind == .interface_
5942
+ && (typ_sym.info as ast.Interface ).defines_method (expr.name) {
5943
+ rec_cc_type := g.cc_type (unwrapped_rec_type, false )
5944
+ receiver_type_name := util.no_dots (rec_cc_type)
5945
+ g.gowrappers.write_string ('${c_name(receiver_type_name)} _name_table[' )
5946
+ g.gowrappers.write_string ('arg->arg0' )
5947
+ dot := if expr.left_type.is_ptr () { '->' } else { '.' }
5948
+ mname := c_name (expr.name)
5949
+ g.gowrappers.write_string ('${dot} _typ]._method_${mname} (' )
5950
+ g.gowrappers.write_string ('arg->arg0' )
5951
+ g.gowrappers.write_string ('${dot} _object' )
5952
+ } else {
5953
+ g.gowrappers.write_string ('${name} (' )
5954
+ g.gowrappers.write_string ('arg->arg0' )
5955
+ }
5941
5956
if expr.args.len > 0 {
5942
5957
g.gowrappers.write_string (', ' )
5943
5958
}
5959
+ } else {
5960
+ g.gowrappers.write_string ('${name} (' )
5944
5961
}
5945
5962
if expr.args.len > 0 {
5946
5963
mut has_cast := false
Original file line number Diff line number Diff line change
1
+ interface CanPerformTask {
2
+ task ()
3
+ }
4
+
5
+ struct Task1 {}
6
+
7
+ fn (task1 Task1) task () {
8
+ println ('task1' )
9
+ }
10
+
11
+ struct Task2 {}
12
+
13
+ fn (task2 Task2) task () {
14
+ println ('task2' )
15
+ }
16
+
17
+ fn test_go_call_interface_method () {
18
+ mut tasks := []CanPerformTask{}
19
+
20
+ tasks << Task1 {}
21
+ tasks << Task2 {}
22
+
23
+ for task in tasks {
24
+ go task.task ()
25
+ }
26
+
27
+ assert true
28
+ }
You can’t perform that action at this time.
0 commit comments