From e9de30373fe1e25481f6a3bbad82033379ecf1bd Mon Sep 17 00:00:00 2001 From: yuyi Date: Fri, 25 Jun 2021 17:52:25 +0800 Subject: [PATCH] table: fix interface embedding with interface parameter (#10567) --- vlib/v/ast/table.v | 10 +++++ ...rface_embedding_with_interface_para_test.v | 38 +++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 vlib/v/tests/interface_embedding_with_interface_para_test.v diff --git a/vlib/v/ast/table.v b/vlib/v/ast/table.v index f0f8fc5351..ff4376f537 100644 --- a/vlib/v/ast/table.v +++ b/vlib/v/ast/table.v @@ -116,6 +116,11 @@ pub mut: pub fn (f Fn) new_method_with_receiver_type(new_type Type) Fn { mut new_method := f new_method.params = f.params.clone() + for i in 1 .. new_method.params.len { + if new_method.params[i].typ == new_method.params[0].typ { + new_method.params[i].typ = new_type + } + } new_method.params[0].typ = new_type return new_method } @@ -123,6 +128,11 @@ pub fn (f Fn) new_method_with_receiver_type(new_type Type) Fn { pub fn (f FnDecl) new_method_with_receiver_type(new_type Type) FnDecl { mut new_method := f new_method.params = f.params.clone() + for i in 1 .. new_method.params.len { + if new_method.params[i].typ == new_method.params[0].typ { + new_method.params[i].typ = new_type + } + } new_method.params[0].typ = new_type return new_method } diff --git a/vlib/v/tests/interface_embedding_with_interface_para_test.v b/vlib/v/tests/interface_embedding_with_interface_para_test.v new file mode 100644 index 0000000000..c63a50efb1 --- /dev/null +++ b/vlib/v/tests/interface_embedding_with_interface_para_test.v @@ -0,0 +1,38 @@ +interface Eq { + eq(other Eq) bool +} + +interface Ord { + Eq + lt(other Ord) bool +} + +// implement Ord for Int +struct Int { + value int +} + +fn (i Int) eq(other Ord) bool { + if other is Int { + return i.value == other.value + } + return false +} + +fn (i Int) lt(other Ord) bool { + if other is Int { + return i.value < other.value + } + return false +} + +fn compare(x Ord, y Ord) { + println(x.eq(y)) + assert !x.eq(y) + println(x.lt(y)) + assert x.lt(y) +} + +fn test_interface_embedding_with_interface_para() { + compare(Int{1}, Int{2}) +}