parent
51513ae19a
commit
a014844050
|
@ -446,6 +446,18 @@ pub fn (t &Table) find_method_with_embeds(sym &TypeSymbol, method_name string) ?
|
|||
}
|
||||
}
|
||||
|
||||
pub fn (t &Table) get_embed_methods(sym &TypeSymbol) []Fn {
|
||||
mut methods := []Fn{}
|
||||
if sym.info is Struct {
|
||||
for embed in sym.info.embeds {
|
||||
embed_sym := t.sym(embed)
|
||||
methods << embed_sym.methods
|
||||
methods << t.get_embed_methods(embed_sym)
|
||||
}
|
||||
}
|
||||
return methods
|
||||
}
|
||||
|
||||
fn (t &Table) register_aggregate_field(mut sym TypeSymbol, name string) ?StructField {
|
||||
if sym.kind != .aggregate {
|
||||
t.panic('Unexpected type symbol: $sym.kind')
|
||||
|
|
|
@ -6797,16 +6797,13 @@ static inline __shared__$interface_name ${shared_fn_name}(__shared__$cctype* x)
|
|||
}
|
||||
else {}
|
||||
}
|
||||
if st_sym.info is ast.Struct {
|
||||
for embed in st_sym.info.embeds {
|
||||
embed_sym := g.table.sym(embed)
|
||||
for embed_method in embed_sym.methods {
|
||||
if embed_method.name !in method_names {
|
||||
methods << embed_method
|
||||
}
|
||||
}
|
||||
t_methods := g.table.get_embed_methods(st_sym)
|
||||
for t_method in t_methods {
|
||||
if t_method.name !in method_names {
|
||||
methods << t_method
|
||||
}
|
||||
}
|
||||
|
||||
for method in methods {
|
||||
mut name := method.name
|
||||
if inter_info.parent_type.has_flag(.generic) {
|
||||
|
|
|
@ -0,0 +1,91 @@
|
|||
fn test_interface_struct_with_multi_nested_embed() {
|
||||
mut win := &Window{}
|
||||
mut ll := &LinearLayout{}
|
||||
mut lbl := &Label{
|
||||
x: 10
|
||||
y: 20
|
||||
}
|
||||
|
||||
ll.add(mut lbl)
|
||||
win.add(mut ll)
|
||||
|
||||
win.init()
|
||||
}
|
||||
|
||||
[heap]
|
||||
pub struct Window {
|
||||
mut:
|
||||
initables []&Initable
|
||||
}
|
||||
|
||||
interface Initable {
|
||||
mut:
|
||||
init(&Window)
|
||||
}
|
||||
|
||||
pub fn (mut w Window) add(mut initable Initable) {
|
||||
w.initables << initable
|
||||
}
|
||||
|
||||
interface Container {
|
||||
mut:
|
||||
layout()
|
||||
}
|
||||
|
||||
fn (mut w Window) init() {
|
||||
for wd in w.initables {
|
||||
if mut wd is Container {
|
||||
mut c := wd as Container
|
||||
c.layout()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Rect {
|
||||
mut:
|
||||
x int
|
||||
y int
|
||||
}
|
||||
|
||||
pub fn (r Rect) get_pos() (int, int) {
|
||||
return r.x, r.y
|
||||
}
|
||||
|
||||
pub struct LayoutBase {
|
||||
Rect
|
||||
}
|
||||
|
||||
pub struct Base {
|
||||
LayoutBase
|
||||
}
|
||||
|
||||
pub fn (mut b Base) init(window &Window) {}
|
||||
|
||||
[heap]
|
||||
pub struct Label {
|
||||
Base
|
||||
}
|
||||
|
||||
pub interface Layoutable {
|
||||
get_pos() (int, int)
|
||||
}
|
||||
|
||||
[heap]
|
||||
pub struct LinearLayout {
|
||||
Base
|
||||
mut:
|
||||
layoutables []Layoutable
|
||||
}
|
||||
|
||||
pub fn (mut ll LinearLayout) add(mut l Layoutable) {
|
||||
ll.layoutables << l
|
||||
}
|
||||
|
||||
pub fn (mut ll LinearLayout) layout() {
|
||||
for mut wl in ll.layoutables {
|
||||
x, y := wl.get_pos()
|
||||
println('$x, $y')
|
||||
assert x == 10
|
||||
assert y == 20
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue