cgen: fix interface embedding method call (#13553)
							parent
							
								
									b842e89acc
								
							
						
					
					
						commit
						07e9ed1a1d
					
				|  | @ -755,7 +755,9 @@ fn (mut g Gen) method_call(node ast.CallExpr) { | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		left_is_shared := node.left_type.has_flag(.shared_f) | 		left_is_shared := node.left_type.has_flag(.shared_f) | ||||||
| 		g.write('${c_name(receiver_type_name)}_name_table[') | 		left_cc_type := g.cc_type(node.left_type, false) | ||||||
|  | 		left_type_name := util.no_dots(left_cc_type) | ||||||
|  | 		g.write('${c_name(left_type_name)}_name_table[') | ||||||
| 		g.expr(node.left) | 		g.expr(node.left) | ||||||
| 		dot := if left_is_shared { | 		dot := if left_is_shared { | ||||||
| 			'->val.' | 			'->val.' | ||||||
|  |  | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | fn test_interface_embedding_method_call() { | ||||||
|  | 	mut window := &Window{} | ||||||
|  | 	btn := &Button{} | ||||||
|  | 	window.initables << btn | ||||||
|  | 	window.run() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | [heap] | ||||||
|  | pub struct Window { | ||||||
|  | mut: | ||||||
|  | 	initables []Initable | ||||||
|  | 	popview   PopView = DummyPopup{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | interface Initable { | ||||||
|  | mut: | ||||||
|  | 	init(&Window) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | interface Drawable { | ||||||
|  | 	draw() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn (mut window Window) run() { | ||||||
|  | 	for mut i in window.initables { | ||||||
|  | 		i.init(window) | ||||||
|  | 	} | ||||||
|  | 	for wd in window.initables { | ||||||
|  | 		if wd is Drawable { | ||||||
|  | 			d := wd as Drawable | ||||||
|  | 			d.draw() | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	window.popview.draw() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | struct DummyPopup {} | ||||||
|  | 
 | ||||||
|  | fn (d DummyPopup) draw() {} | ||||||
|  | 
 | ||||||
|  | interface PopView { | ||||||
|  | 	Drawable | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | [heap] | ||||||
|  | pub struct Button { | ||||||
|  | mut: | ||||||
|  | 	window &Window = voidptr(0) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn (mut b Button) init(window &Window) { | ||||||
|  | 	b.window = window | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn (b Button) draw() { | ||||||
|  | 	g := b.window.initables | ||||||
|  | 	println(g.len) | ||||||
|  | 	assert g.len == 1 | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue