Support mixed compilation of new default with non-default or @JvmDefault

This commit is contained in:
Mikhael Bogdanov
2020-02-06 09:43:47 +01:00
committed by Mikhail Bogdanov
parent a3f930d2e4
commit e45a892499
8 changed files with 142 additions and 6 deletions
@@ -0,0 +1,36 @@
// FULL_JDK
// FILE: 1.kt
interface KInterface {
fun call(): List<String> {
return Thread.currentThread().getStackTrace().map { it.className + "." + it.methodName }
}
fun superCall() = Thread.currentThread().getStackTrace().map { it.className + "." + it.methodName }
}
// FILE: main.kt
// !JVM_DEFAULT_MODE: all-compatibility
// JVM_TARGET: 1.8
interface KInterface2 : KInterface {
override fun superCall() = super.superCall()
}
class Foo: KInterface2 {
fun superCall2() = super<KInterface2>.superCall()
}
fun box(): String {
var result = Foo().call()
if (result[1] != "KInterface\$DefaultImpls.call") return "fail 1: ${result[1]}"
if (result[2] != "KInterface2\$DefaultImpls.call") return "fail 2: ${result[2]}"
if (result[3] != "Foo.call") return "fail 3: ${result[3]}"
if (result[4] != "MainKt.box") return "fail 4: ${result[4]}"
result = Foo().superCall2()
if (result[1] != "KInterface\$DefaultImpls.superCall") return "fail 1: ${result[1]}"
if (result[2] != "KInterface2.superCall") return "fail 2: ${result[2]}"
if (result[3] != "Foo.superCall2") return "fail 3: ${result[3]}"
if (result[4] != "MainKt.box") return "fail 4: ${result[4]}"
return "OK"
}
@@ -0,0 +1,38 @@
// FULL_JDK
// WITH_RUNTIME
// JVM_TARGET: 1.8
// FILE: 1.kt
// !JVM_DEFAULT_MODE: enable
interface KInterface {
@JvmDefault
fun call(): List<String> {
return Thread.currentThread().getStackTrace().map { it.className + "." + it.methodName }
}
fun superCall() = Thread.currentThread().getStackTrace().map { it.className + "." + it.methodName }
}
// FILE: main.kt
// !JVM_DEFAULT_MODE: all
interface KInterface2 : KInterface {
override fun superCall() = super.superCall()
}
class Foo: KInterface2 {
fun superCall2() = super<KInterface2>.superCall()
}
fun box(): String {
var result = Foo().call()
if (result[1] != "KInterface.call") return "fail 1: ${result[1]}"
if (result[2] != "MainKt.box") return "fail 2: ${result[2]}"
result = Foo().superCall2()
if (result[1] != "KInterface\$DefaultImpls.superCall") return "fail 1: ${result[1]}"
if (result[2] != "KInterface2.superCall") return "fail 2: ${result[2]}"
if (result[3] != "Foo.superCall2") return "fail 3: ${result[3]}"
if (result[4] != "MainKt.box") return "fail 4: ${result[4]}"
return "OK"
}