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