table: fix interface embedding with interface parameter (#10567)
parent
e648578f79
commit
e9de30373f
|
@ -116,6 +116,11 @@ pub mut:
|
||||||
pub fn (f Fn) new_method_with_receiver_type(new_type Type) Fn {
|
pub fn (f Fn) new_method_with_receiver_type(new_type Type) Fn {
|
||||||
mut new_method := f
|
mut new_method := f
|
||||||
new_method.params = f.params.clone()
|
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
|
new_method.params[0].typ = new_type
|
||||||
return new_method
|
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 {
|
pub fn (f FnDecl) new_method_with_receiver_type(new_type Type) FnDecl {
|
||||||
mut new_method := f
|
mut new_method := f
|
||||||
new_method.params = f.params.clone()
|
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
|
new_method.params[0].typ = new_type
|
||||||
return new_method
|
return new_method
|
||||||
}
|
}
|
||||||
|
|
|
@ -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})
|
||||||
|
}
|
Loading…
Reference in New Issue