From 2e0f8ee9e2c244f1e120e14c9d25ba8cd433d7b2 Mon Sep 17 00:00:00 2001 From: yuyi Date: Mon, 14 Feb 2022 08:33:47 +0800 Subject: [PATCH] ast: fix error for struct embedding with interface (#13457) --- vlib/v/ast/table.v | 7 --- .../struct_embedding_with_interface_test.v | 60 +++++++++++++++++++ 2 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 vlib/v/tests/struct_embedding_with_interface_test.v diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index 71ff4d5029..aca8bf58d6 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -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 } diff --git a/vlib/v/tests/struct_embedding_with_interface_test.v b/vlib/v/tests/struct_embedding_with_interface_test.v new file mode 100644 index 0000000000..9425cb72b6 --- /dev/null +++ b/vlib/v/tests/struct_embedding_with_interface_test.v @@ -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 '' +}