[JS IR] Do not copy interface method if base class inherits it

^KT-58599 Fixed
This commit is contained in:
Alexander Korepanov
2023-05-30 08:22:43 +00:00
committed by Space Team
parent 9ca9fc9c68
commit 8066f1b7d2
54 changed files with 886 additions and 8 deletions
@@ -0,0 +1,109 @@
// TARGET_BACKEND: JS
// Ignore these backangd because they don't support overriding and calling interface methods with default arguments
// IGNORE_BACKEND: JVM, WASM, NATIVE
// MODULE: InterfaceModule
// FILE: MyInterface.kt
interface MyInterface {
fun test() = 1
fun testWithDefault(x: Int = 1) = x
}
interface MyInterface2 : MyInterface
// MODULE: OpenClassModule(InterfaceModule)
// FILE: MyOpenClass.kt
open class MyOpenClass : MyInterface
open class MyOpenClass2 : MyInterface2
open class MyOpenClass3 : MyOpenClass()
// MODULE: OpenClassWithOverrideModule(InterfaceModule)
// FILE: MyOpenClassWithOverrideModule.kt
open class MyOpenClassWithOverride : MyInterface {
override fun test() = super.test() + 1
override fun testWithDefault(x: Int) = super.testWithDefault() + 1
}
open class MyOpenClassWithOverride2 : MyInterface2, MyOpenClassWithOverride()
open class MyOpenClassWithOverride3 : MyOpenClassWithOverride2() {
override fun test() = super.test() + 1
override fun testWithDefault(x: Int) = super.testWithDefault(x) + 1
}
// MODULE: main(InterfaceModule, OpenClassModule, OpenClassWithOverrideModule)
// FILE: classes.kt
class MyFinalClass : MyOpenClass()
class MyFinalClass2 : MyOpenClass2()
class MyFinalClass3 : MyOpenClass3()
class MyFinalClassI : MyInterface, MyOpenClass()
class MyFinalClassWithOverride : MyOpenClassWithOverride()
class MyFinalClassWithOverride2 : MyOpenClassWithOverride2()
class MyFinalClassWithOverride3 : MyOpenClassWithOverride3()
class MyFinalClassWithOverrideI : MyInterface, MyOpenClassWithOverride()
// FILE: main.kt
fun asInterface(i: MyInterface): MyInterface = i
fun asInterface2(i: MyInterface2): MyInterface2 = i
fun box(): String {
if (asInterface(MyFinalClass()).test() != 1) return "Fail MyOpenClass 1"
if (MyFinalClass().test() != 1) return "Fail MyOpenClass 2"
if (asInterface(MyFinalClass()).testWithDefault() != 1) return "Fail MyOpenClass 3"
if (MyFinalClass().testWithDefault() != 1) return "Fail MyOpenClass 4"
if (asInterface(MyFinalClass2()).test() != 1) return "Fail MyFinalClass2 1"
if (asInterface2(MyFinalClass2()).test() != 1) return "Fail MyFinalClass2 2"
if (MyFinalClass2().test() != 1) return "Fail MyFinalClass2 3"
if (asInterface(MyFinalClass2()).testWithDefault() != 1) return "Fail MyFinalClass2 4"
if (asInterface2(MyFinalClass2()).testWithDefault() != 1) return "Fail MyFinalClass2 5"
if (MyFinalClass2().testWithDefault() != 1) return "Fail MyFinalClass2 6"
if (asInterface(MyFinalClass3()).test() != 1) return "Fail MyFinalClass3 1"
if (MyFinalClass3().test() != 1) return "Fail MyFinalClass3 2"
if (asInterface(MyFinalClass3()).testWithDefault() != 1) return "Fail MyFinalClass3 3"
if (MyFinalClass3().testWithDefault() != 1) return "Fail MyFinalClass3 4"
if (asInterface(MyFinalClassI()).test() != 1) return "Fail MyFinalClassI 1"
if (MyFinalClassI().test() != 1) return "Fail MyFinalClassI 2"
if (asInterface(MyFinalClassI()).testWithDefault() != 1) return "Fail MyFinalClassI 3"
if (MyFinalClassI().testWithDefault() != 1) return "Fail MyFinalClassI 4"
if (asInterface(MyFinalClassWithOverride()).test() != 2) return "Fail MyFinalClassWithOverride 1"
if (MyFinalClassWithOverride().test() != 2) return "Fail MyFinalClassWithOverride 2"
if (asInterface(MyFinalClassWithOverride()).testWithDefault() != 2) return "Fail MyFinalClassWithOverride 3"
if (MyFinalClassWithOverride().testWithDefault(1) != 2) return "Fail MyFinalClassWithOverride 4"
if (asInterface(MyFinalClassWithOverride2()).test() != 2) return "Fail MyFinalClassWithOverride2 1"
if (asInterface2(MyFinalClassWithOverride2()).test() != 2) return "Fail MyFinalClassWithOverride2 2"
if (MyFinalClassWithOverride2().test() != 2) return "Fail MyFinalClassWithOverride2 3"
if (asInterface(MyFinalClassWithOverride2()).testWithDefault() != 2) return "Fail MyFinalClassWithOverride2 4"
if (asInterface2(MyFinalClassWithOverride2()).testWithDefault() != 2) return "Fail MyFinalClassWithOverride2 5"
if (MyFinalClassWithOverride2().testWithDefault(1) != 2) return "Fail MyFinalClassWithOverride2 6"
if (asInterface(MyFinalClassWithOverride3()).test() != 3) return "Fail MyFinalClassWithOverride3 1"
if (asInterface2(MyFinalClassWithOverride3()).test() != 3) return "Fail MyFinalClassWithOverride3 2"
if (MyFinalClassWithOverride3().test() != 3) return "Fail MyFinalClassWithOverride3 3"
if (asInterface(MyFinalClassWithOverride3()).testWithDefault() != 3) return "Fail MyFinalClassWithOverride3 4"
if (asInterface2(MyFinalClassWithOverride3()).testWithDefault() != 3) return "Fail MyFinalClassWithOverride3 5"
if (MyFinalClassWithOverride3().testWithDefault(1) != 3) return "Fail MyFinalClassWithOverride3 6"
if (asInterface(MyFinalClassWithOverrideI()).test() != 2) return "Fail MyFinalClassWithOverrideI 1"
if (MyFinalClassWithOverrideI().test() != 2) return "Fail MyFinalClassWithOverrideI 2"
if (asInterface(MyFinalClassWithOverrideI()).testWithDefault() != 2) return "Fail MyFinalClassWithOverrideI 3"
if (MyFinalClassWithOverrideI().testWithDefault(1) != 2) return "Fail MyFinalClassWithOverrideI 4"
return "OK"
}
@@ -0,0 +1,74 @@
// MODULE: InterfaceModule
// FILE: MyInterface.kt
interface MyInterface {
val test: Int get() = 1
}
interface MyInterface2 : MyInterface
// MODULE: OpenClassModule(InterfaceModule)
// FILE: MyOpenClass.kt
open class MyOpenClass : MyInterface
open class MyOpenClass2 : MyInterface2
open class MyOpenClass3 : MyOpenClass()
// MODULE: OpenClassWithOverrideModule(InterfaceModule)
// FILE: MyOpenClassWithOverrideModule.kt
open class MyOpenClassWithOverride : MyInterface {
override val test = super.test + 1
}
open class MyOpenClassWithOverride2 : MyInterface2, MyOpenClassWithOverride()
open class MyOpenClassWithOverride3 : MyOpenClassWithOverride2() {
override val test = super.test + 1
}
// MODULE: main(InterfaceModule, OpenClassModule, OpenClassWithOverrideModule)
// FILE: classes.kt
class MyFinalClass : MyOpenClass()
class MyFinalClass2 : MyOpenClass2()
class MyFinalClass3 : MyOpenClass3()
class MyFinalClassI : MyInterface, MyOpenClass()
class MyFinalClassWithOverride : MyOpenClassWithOverride()
class MyFinalClassWithOverride2 : MyOpenClassWithOverride2()
class MyFinalClassWithOverride3 : MyOpenClassWithOverride3()
class MyFinalClassWithOverrideI : MyInterface, MyOpenClassWithOverride()
// FILE: main.kt
fun asInterface(i: MyInterface): MyInterface = i
fun asInterface2(i: MyInterface2): MyInterface2 = i
fun box(): String {
if (asInterface(MyFinalClass()).test != 1) return "Fail MyOpenClass as Interface property"
if (MyFinalClass().test != 1) return "Fail MyOpenClass property"
if (asInterface(MyFinalClass2()).test != 1) return "Fail MyFinalClass2 as Interface property"
if (asInterface2(MyFinalClass2()).test != 1) return "Fail MyFinalClass2 as Interface2 property"
if (MyFinalClass2().test != 1) return "Fail MyFinalClass2 property"
if (asInterface(MyFinalClass3()).test != 1) return "Fail MyFinalClass3 as Interface property"
if (MyFinalClass3().test != 1) return "Fail MyFinalClass3 property"
if (asInterface(MyFinalClassI()).test != 1) return "Fail MyFinalClassI as Interface property"
if (MyFinalClassI().test != 1) return "Fail MyFinalClassI property"
if (asInterface(MyFinalClassWithOverride()).test != 2) return "Fail MyFinalClassWithOverride as Interface property"
if (MyFinalClassWithOverride().test != 2) return "Fail MyFinalClassWithOverride property"
if (asInterface(MyFinalClassWithOverride2()).test != 2) return "Fail MyFinalClassWithOverride2 as Interface property"
if (asInterface2(MyFinalClassWithOverride2()).test != 2) return "Fail MyFinalClassWithOverride2 as Interface2 property"
if (MyFinalClassWithOverride2().test != 2) return "Fail MyFinalClassWithOverride2 property"
if (asInterface(MyFinalClassWithOverride3()).test != 3) return "Fail MyFinalClassWithOverride3 as Interface property"
if (asInterface2(MyFinalClassWithOverride3()).test != 3) return "Fail MyFinalClassWithOverride3 as Interface2 property"
if (MyFinalClassWithOverride3().test != 3) return "Fail MyFinalClassWithOverride3 property"
if (asInterface(MyFinalClassWithOverrideI()).test != 2) return "Fail MyFinalClassWithOverrideI as Interface property"
if (MyFinalClassWithOverrideI().test != 2) return "Fail MyFinalClassWithOverrideI property"
return "OK"
}
@@ -0,0 +1,104 @@
// MODULE: InterfaceModule
// FILE: MyInterface.kt
interface MyInterface<T> {
fun test(x: T): T = x
fun testWithDefault(x: T? = null): T? = x
}
interface MyInterface2 : MyInterface<Int>
// MODULE: OpenClassModule(InterfaceModule)
// FILE: MyOpenClass.kt
open class MyOpenClass<T> : MyInterface<T>
open class MyOpenClass2 : MyInterface2
open class MyOpenClass3 : MyOpenClass<Int>()
// MODULE: OpenClassWithOverrideModule(InterfaceModule)
// FILE: MyOpenClassWithOverrideModule.kt
open class MyOpenClassWithOverride : MyInterface<Int> {
override fun test(x: Int) = super.test(x) + 1
override fun testWithDefault(x: Int?) = super.testWithDefault(x ?: 1)!! + 1
}
open class MyOpenClassWithOverride2 : MyInterface2, MyOpenClassWithOverride()
open class MyOpenClassWithOverride3 : MyOpenClassWithOverride2() {
override fun test(x: Int) = super.test(x) + 1
override fun testWithDefault(x: Int?) = super.testWithDefault(x)!! + 1
}
// MODULE: main(InterfaceModule, OpenClassModule, OpenClassWithOverrideModule)
// FILE: classes.kt
class MyFinalClass : MyOpenClass<Int>()
class MyFinalClass2 : MyOpenClass2()
class MyFinalClass3 : MyOpenClass3()
class MyFinalClassI : MyInterface<Int>, MyOpenClass<Int>()
class MyFinalClassWithOverride : MyOpenClassWithOverride()
class MyFinalClassWithOverride2 : MyOpenClassWithOverride2()
class MyFinalClassWithOverride3 : MyOpenClassWithOverride3()
class MyFinalClassWithOverrideI : MyInterface<Int>, MyOpenClassWithOverride()
// FILE: main.kt
fun <T> asInterface(i: MyInterface<T>): MyInterface<T> = i
fun asInterface2(i: MyInterface2): MyInterface2 = i
fun box(): String {
if (asInterface(MyFinalClass()).test(1) != 1) return "Fail MyOpenClass 1"
if (MyFinalClass().test(1) != 1) return "Fail MyOpenClass 2"
if (asInterface(MyFinalClass()).testWithDefault() != null) return "Fail MyOpenClass 3"
if (MyFinalClass().testWithDefault() != null) return "Fail MyOpenClass 4"
if (asInterface(MyFinalClass2()).test(1) != 1) return "Fail MyFinalClass2 1"
if (asInterface2(MyFinalClass2()).test(1) != 1) return "Fail MyFinalClass2 2"
if (MyFinalClass2().test(1) != 1) return "Fail MyFinalClass2 3"
if (asInterface(MyFinalClass2()).testWithDefault() != null) return "Fail MyFinalClass2 4"
if (asInterface2(MyFinalClass2()).testWithDefault() != null) return "Fail MyFinalClass2 5"
if (MyFinalClass2().testWithDefault() != null) return "Fail MyFinalClass2 6"
if (asInterface(MyFinalClass3()).test(1) != 1) return "Fail MyFinalClass3 1"
if (MyFinalClass3().test(1) != 1) return "Fail MyFinalClass3 2"
if (asInterface(MyFinalClass3()).testWithDefault() != null) return "Fail MyFinalClass3 3"
if (MyFinalClass3().testWithDefault() != null) return "Fail MyFinalClass3 4"
if (asInterface(MyFinalClassI()).test(1) != 1) return "Fail MyFinalClassI 1"
if (MyFinalClassI().test(1) != 1) return "Fail MyFinalClassI 2"
if (asInterface(MyFinalClassI()).testWithDefault() != null) return "Fail MyFinalClassI 3"
if (MyFinalClassI().testWithDefault() != null) return "Fail MyFinalClassI 4"
if (asInterface(MyFinalClassWithOverride()).test(1) != 2) return "Fail MyFinalClassWithOverride 1"
if (MyFinalClassWithOverride().test(1) != 2) return "Fail MyFinalClassWithOverride 2"
if (asInterface(MyFinalClassWithOverride()).testWithDefault() != 2) return "Fail MyFinalClassWithOverride 3"
if (MyFinalClassWithOverride().testWithDefault(1) != 2) return "Fail MyFinalClassWithOverride 4"
if (asInterface(MyFinalClassWithOverride2()).test(1) != 2) return "Fail MyFinalClassWithOverride2 1"
if (asInterface2(MyFinalClassWithOverride2()).test(1) != 2) return "Fail MyFinalClassWithOverride2 2"
if (MyFinalClassWithOverride2().test(1) != 2) return "Fail MyFinalClassWithOverride2 3"
if (asInterface(MyFinalClassWithOverride2()).testWithDefault() != 2) return "Fail MyFinalClassWithOverride2 4"
if (asInterface2(MyFinalClassWithOverride2()).testWithDefault() != 2) return "Fail MyFinalClassWithOverride2 5"
if (MyFinalClassWithOverride2().testWithDefault(1) != 2) return "Fail MyFinalClassWithOverride2 6"
if (asInterface(MyFinalClassWithOverride3()).test(1) != 3) return "Fail MyFinalClassWithOverride3 1"
if (asInterface2(MyFinalClassWithOverride3()).test(1) != 3) return "Fail MyFinalClassWithOverride3 2"
if (MyFinalClassWithOverride3().test(1) != 3) return "Fail MyFinalClassWithOverride3 3"
if (asInterface(MyFinalClassWithOverride3()).testWithDefault() != 3) return "Fail MyFinalClassWithOverride3 4"
if (asInterface2(MyFinalClassWithOverride3()).testWithDefault() != 3) return "Fail MyFinalClassWithOverride3 5"
if (MyFinalClassWithOverride3().testWithDefault(1) != 3) return "Fail MyFinalClassWithOverride3 6"
if (asInterface(MyFinalClassWithOverrideI()).test(1) != 2) return "Fail MyFinalClassWithOverrideI 1"
if (MyFinalClassWithOverrideI().test(1) != 2) return "Fail MyFinalClassWithOverrideI 2"
if (asInterface(MyFinalClassWithOverrideI()).testWithDefault() != 2) return "Fail MyFinalClassWithOverrideI 3"
if (MyFinalClassWithOverrideI().testWithDefault(1) != 2) return "Fail MyFinalClassWithOverrideI 4"
return "OK"
}