Generate bridges for fake overrides when needed

#KT-3985 Fixed
 #KT-4145 Fixed
This commit is contained in:
Alexander Udalov
2014-03-27 19:33:42 +04:00
parent 2c2c918447
commit 04c237cc22
17 changed files with 300 additions and 97 deletions
@@ -0,0 +1,20 @@
abstract class A<T> {
abstract fun foo(t: T): String
}
abstract class B : A<String>()
class Z : B() {
override fun foo(t: String) = "Z"
}
fun box(): String {
val z = Z()
return when {
z.foo("") != "Z" -> "Fail #1"
(z : B).foo("") != "Z" -> "Fail #2"
(z : A<String>).foo("") != "Z" -> "Fail #3"
else -> "OK"
}
}
@@ -0,0 +1,19 @@
open class A<T : U, U> {
open fun foo(t: T, u: U) = "A"
}
open class B : A<Int, Number>()
class Z : B() {
override fun foo(t: Int, u: Number) = "Z"
}
fun box(): String {
val z = Z()
return when {
z.foo(0, 0) != "Z" -> "Fail #1"
(z : B).foo(0, 0) != "Z" -> "Fail #2"
(z : A<Int, Number>).foo(0, 0) != "Z" -> "Fail #3"
else -> "OK"
}
}
@@ -0,0 +1,17 @@
trait A<T> {
fun id(t: T): T
}
open class B : A<String> {
override fun id(t: String) = t
}
class C : B()
class D : A<String> by C()
fun box(): String {
val d = D()
if (d.id("") != "") return "Fail"
return (d : A<String>).id("OK")
}
@@ -0,0 +1,24 @@
trait A<T> {
open fun foo(t: T) = "A"
}
trait B : A<String>
enum class Z(val name: String) : B {
Z1 : Z("Z1")
Z2 : Z("Z2")
override fun foo(t: String) = name
}
fun box(): String {
return when {
Z.Z1.foo("") != "Z1" -> "Fail #1"
Z.Z2.foo("") != "Z2" -> "Fail #2"
(Z.Z1 : B).foo("") != "Z1" -> "Fail #3"
(Z.Z2 : B).foo("") != "Z2" -> "Fail #4"
(Z.Z1 : A<String>).foo("") != "Z1" -> "Fail #5"
(Z.Z2 : A<String>).foo("") != "Z2" -> "Fail #6"
else -> "OK"
}
}
@@ -0,0 +1,20 @@
open class A<T> {
open fun <U> foo(t: T, u: U) = "A"
}
open class B : A<String>()
class Z : B() {
override fun <U> foo(t: String, u: U) = "Z"
}
fun box(): String {
val z = Z()
return when {
z.foo("", 0) != "Z" -> "Fail #1"
(z : B).foo("", 0) != "Z" -> "Fail #2"
(z : A<String>).foo("", 0) != "Z" -> "Fail #3"
else -> "OK"
}
}
@@ -0,0 +1,25 @@
open class A<T> {
open fun foo(t: T) = "A"
}
open class B : A<String>()
object Z : B() {
override fun foo(t: String) = "Z"
}
fun box(): String {
val o = object : B() {
override fun foo(t: String) = "o"
}
return when {
Z.foo("") != "Z" -> "Fail #1"
o.foo("") != "o" -> "Fail #2"
(Z : B).foo("") != "Z" -> "Fail #3"
(o : B).foo("") != "o" -> "Fail #4"
(Z : A<String>).foo("") != "Z" -> "Fail #5"
(o : A<String>).foo("") != "o" -> "Fail #6"
else -> "OK"
}
}
@@ -0,0 +1,12 @@
open class A<T>(val t: T) {
open val foo: T = t
}
open class B : A<String>("Fail")
class Z : B() {
override val foo = "OK"
}
fun box() = (Z() : A<String>).foo
@@ -0,0 +1,20 @@
open class A<T> {
open fun foo(t: T) = "A"
}
open class B : A<String>()
class Z : B() {
override fun foo(t: String) = "Z"
}
fun box(): String {
val z = Z()
return when {
z.foo("") != "Z" -> "Fail #1"
(z : B).foo("") != "Z" -> "Fail #2"
(z : A<String>).foo("") != "Z" -> "Fail #3"
else -> "OK"
}
}
@@ -0,0 +1,20 @@
open class A<T : Number> {
open fun foo(t: T) = "A"
}
open class B : A<Int>()
class Z : B() {
override fun foo(t: Int) = "Z"
}
fun box(): String {
val z = Z()
return when {
z.foo(0) != "Z" -> "Fail #1"
(z : B).foo(0) != "Z" -> "Fail #2"
(z : A<Int>).foo(0) != "Z" -> "Fail #3"
else -> "OK"
}
}