ast: fix error for struct embedding with interface (#13457)
parent
bf11df40e2
commit
2e0f8ee9e2
|
@ -1293,14 +1293,7 @@ pub fn (mut t Table) complete_interface_check() {
|
|||
if tsym.kind != .struct_ {
|
||||
continue
|
||||
}
|
||||
info := tsym.info as Struct
|
||||
for _, mut idecl in t.interfaces {
|
||||
if idecl.methods.len > tsym.methods.len {
|
||||
continue
|
||||
}
|
||||
if idecl.fields.len > info.fields.len {
|
||||
continue
|
||||
}
|
||||
if idecl.typ == 0 {
|
||||
continue
|
||||
}
|
||||
|
|
|
@ -0,0 +1,60 @@
|
|||
fn test_struct_embedding_with_interface() {
|
||||
mut ll := LinearLayout{}
|
||||
mut lv := ListView{}
|
||||
ll.add(lv)
|
||||
ret := ll.layout()
|
||||
|
||||
println(ret)
|
||||
assert ret.count('ListView') == 2
|
||||
}
|
||||
|
||||
interface Container {
|
||||
mut:
|
||||
layout() string
|
||||
}
|
||||
|
||||
interface Layoutable {
|
||||
get_pos() (int, int)
|
||||
mut:
|
||||
set_pos(int, int)
|
||||
}
|
||||
|
||||
pub struct LayouterBase {
|
||||
mut:
|
||||
layoutables []Layoutable
|
||||
}
|
||||
|
||||
pub fn (mut lb LayouterBase) add(layoutable Layoutable) {
|
||||
lb.layoutables << layoutable
|
||||
}
|
||||
|
||||
pub fn (lb LayouterBase) get_pos() (int, int) {
|
||||
return 0, 0
|
||||
}
|
||||
|
||||
pub fn (mut lb LayouterBase) set_pos(x int, y int) {}
|
||||
|
||||
pub struct LinearLayout {
|
||||
LayouterBase
|
||||
}
|
||||
|
||||
pub fn (mut ll LinearLayout) layout() string {
|
||||
mut output := ''
|
||||
for mut l in ll.layoutables {
|
||||
dump(l.type_name())
|
||||
output += '$l.type_name()\n'
|
||||
if l is Container {
|
||||
dump(l.type_name())
|
||||
output += '$l.type_name()\n'
|
||||
}
|
||||
}
|
||||
return output
|
||||
}
|
||||
|
||||
pub struct ListView {
|
||||
LayouterBase
|
||||
}
|
||||
|
||||
pub fn (mut lv ListView) layout() string {
|
||||
return ''
|
||||
}
|
Loading…
Reference in New Issue