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