diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java index 2d8e898354d..8395cc30d0d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/FunctionCodegen.java @@ -1460,7 +1460,8 @@ public class FunctionCodegen { iv.invokespecial(parentInternalName, delegateTo.getName(), delegateTo.getDescriptor(), false); } else { - if (JvmAnnotationUtilKt.isCompiledToJvmDefaultIfNoAbstract(descriptor, state.getJvmDefaultMode())) { + if (isInterface(descriptor.getContainingDeclaration()) && + JvmAnnotationUtilKt.isCompiledToJvmDefaultIfNoAbstract(descriptor, state.getJvmDefaultMode())) { iv.invokeinterface(v.getThisName(), delegateTo.getName(), delegateTo.getDescriptor()); } else { diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 37a254f0f48..26d1f37ac3d 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -14938,6 +14938,36 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridge3.kt"); } + @TestMetadata("bridgeInClass.kt") + public void testBridgeInClass() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInClass.kt"); + } + + @TestMetadata("bridgeInInterface.kt") + public void testBridgeInInterface() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface.kt"); + } + + @TestMetadata("bridgeInInterface2.kt") + public void testBridgeInInterface2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface2.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties.kt") + public void testBridgeInInterfaceWithProperties() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties2.kt") + public void testBridgeInInterfaceWithProperties2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties2.kt"); + } + + @TestMetadata("bridgeWithJava.kt") + public void testBridgeWithJava() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt"); + } + @TestMetadata("bridgeWithProperties.kt") public void testBridgeWithProperties() throws Exception { runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithProperties.kt"); @@ -15137,6 +15167,36 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridge3.kt"); } + @TestMetadata("bridgeInClass.kt") + public void testBridgeInClass() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInClass.kt"); + } + + @TestMetadata("bridgeInInterface.kt") + public void testBridgeInInterface() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface.kt"); + } + + @TestMetadata("bridgeInInterface2.kt") + public void testBridgeInInterface2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface2.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties.kt") + public void testBridgeInInterfaceWithProperties() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties2.kt") + public void testBridgeInInterfaceWithProperties2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties2.kt"); + } + + @TestMetadata("bridgeWithJava.kt") + public void testBridgeWithJava() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt"); + } + @TestMetadata("bridgeWithProperties.kt") public void testBridgeWithProperties() throws Exception { runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithProperties.kt"); diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInClass.kt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInClass.kt new file mode 100644 index 00000000000..1c579ed2838 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInClass.kt @@ -0,0 +1,25 @@ +// !JVM_DEFAULT_MODE: all-compatibility +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME + +interface Test { + fun test(p: T): T { + return p + } +} + +class TestClass : Test { + override fun test(p: String): String { + return p + "K" + } +} + +fun execute(t: Test, p: T): T { + return t.test(p) +} + +fun box(): String { + return execute(TestClass(), "O") +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface.kt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface.kt new file mode 100644 index 00000000000..6ecdc321ad9 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface.kt @@ -0,0 +1,28 @@ +// !JVM_DEFAULT_MODE: all-compatibility +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME + +interface Test { + fun test(p: T): T { + return p + } +} + +interface Test2: Test { + override fun test(p: String): String { + return p + "K" + } +} + +class TestClass : Test2 { +} + +fun execute(t: Test, p: T): T { + return t.test(p) +} + +fun box(): String { + return execute(TestClass(), "O") +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface2.kt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface2.kt new file mode 100644 index 00000000000..06d1afc812b --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface2.kt @@ -0,0 +1,56 @@ +// !JVM_DEFAULT_MODE: all-compatibility +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME +// FULL_JDK + +interface Test { + fun test(p: T): T { + return null!! + } +} + +interface Test2: Test { + override fun test(p: String): String { + return p + } +} + +class TestClass : Test2 + +fun box(): String { + checkMethodExists(Test2::class.java, "test", Any::class.java) + checkMethodExists(Test2::class.java, "test", String::class.java) + + checkNoMethod(TestClass::class.java, "test", String::class.java) + checkNoMethod(TestClass::class.java, "test", Any::class.java) + + + val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls") + checkMethodExists(test2DefaultImpls, "test", Test2::class.java, String::class.java) + checkNoMethod(test2DefaultImpls, "test", Test2::class.java, Any::class.java) + + return "OK" +} + +fun checkNoMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + } + catch (e: NoSuchMethodException) { + return + } + throw AssertionError("fail: method $name was found in " + clazz) +} + +fun checkMethodExists(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + return + } + catch (e: NoSuchMethodException) { + throw AssertionError("fail: method $name was not found in " + clazz, e) + } + +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties.kt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties.kt new file mode 100644 index 00000000000..41990539c8d --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties.kt @@ -0,0 +1,33 @@ +// !JVM_DEFAULT_MODE: all-compatibility +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME + +interface Test { + var test: T + get() = null!! + set(value) { + null!! + } +} +var result = "fail" + +interface Test2 : Test { + override var test: String + get() = result + set(value) { + result = value + } +} + +class TestClass : Test2 + +fun execute(t: Test, p: T): T { + t.test = p + return t.test +} + +fun box(): String { + return execute(TestClass(), "OK") +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties2.kt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties2.kt new file mode 100644 index 00000000000..b1b77bd609c --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties2.kt @@ -0,0 +1,63 @@ +// !JVM_DEFAULT_MODE: all-compatibility +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME +// FULL_JDK + +interface Test { + var T.test: T + get() = null!! + set(value) { + null!! + } +} + +interface Test2 : Test { + override var String.test: String + get() = "" + set(value) {} +} + +class TestClass : Test2 + +fun box(): String { + checkMethodExists(Test2::class.java, "getTest", String::class.java) + checkMethodExists(Test2::class.java, "getTest", Any::class.java) + checkMethodExists(Test2::class.java, "setTest", Any::class.java, Any::class.java) + checkMethodExists(Test2::class.java, "setTest", String::class.java, String::class.java) + + checkNoMethod(TestClass::class.java, "getTest", String::class.java) + checkNoMethod(TestClass::class.java, "getTest", Any::class.java) + checkNoMethod(TestClass::class.java, "setTest", Any::class.java, Any::class.java) + checkNoMethod(TestClass::class.java, "setTest", String::class.java, String::class.java) + + val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls") + checkMethodExists(test2DefaultImpls, "getTest", Test2::class.java, String::class.java) + checkNoMethod(test2DefaultImpls, "getTest", Test2::class.java, Any::class.java) + checkNoMethod(test2DefaultImpls, "setTest", Test2::class.java, Any::class.java, Any::class.java) + checkMethodExists(test2DefaultImpls, "setTest", Test2::class.java, String::class.java, String::class.java) + + return "OK" +} + +fun checkNoMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + } + catch (e: NoSuchMethodException) { + return + } + throw AssertionError("fail: method $name was found in " + clazz) +} + +fun checkMethodExists(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + return + } + catch (e: NoSuchMethodException) { + throw AssertionError("fail: method $name was not found in " + clazz, e) + } + +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt new file mode 100644 index 00000000000..a14f3faf7db --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt @@ -0,0 +1,61 @@ +// !JVM_DEFAULT_MODE: all-compatibility +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME +// FULL_JDK + +// FILE: Test.java + +public interface Test { + default T test(T p) { + return null; + } +} + +// FILE: kotlin.kt + +interface Test2: Test { + override fun test(p: String): String { + return p + } + + fun forDefaultImpls() {} +} + +class TestClass : Test2 + +fun box(): String { + checkMethodExists(Test2::class.java, "test", String::class.java) + checkMethodExists(Test2::class.java, "test", Any::class.java) + + checkNoMethod(TestClass::class.java, "test", String::class.java) + checkNoMethod(TestClass::class.java, "test", Any::class.java) + + val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls") + checkNoMethod(test2DefaultImpls, "test", Any::class.java) + checkNoMethod(test2DefaultImpls, "test", String::class.java) + + return "OK" +} + +fun checkNoMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + } + catch (e: NoSuchMethodException) { + return + } + throw AssertionError("fail: method $name was found in " + clazz) +} + +fun checkMethodExists(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + return + } + catch (e: NoSuchMethodException) { + throw AssertionError("fail: method $name was not found in " + clazz, e) + } + +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/bridgeInInterfaceWithProperties2.kt b/compiler/testData/codegen/box/jvm8/defaults/bridgeInInterfaceWithProperties2.kt index ae812f363ec..b471b5682fa 100644 --- a/compiler/testData/codegen/box/jvm8/defaults/bridgeInInterfaceWithProperties2.kt +++ b/compiler/testData/codegen/box/jvm8/defaults/bridgeInInterfaceWithProperties2.kt @@ -52,10 +52,10 @@ fun box(): String { checkMethodExists(TestClass::class.java, "setFoo", String::class.java, String::class.java) val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls") - checkNoMethod(test2DefaultImpls, "getTest", String::class.java) - checkNoMethod(test2DefaultImpls, "getTest", Any::class.java) - checkNoMethod(test2DefaultImpls, "setTest", Any::class.java, Any::class.java) - checkNoMethod(test2DefaultImpls, "setTest", String::class.java, String::class.java) + checkNoMethod(test2DefaultImpls, "getTest", Test2::class.java, String::class.java) + checkNoMethod(test2DefaultImpls, "getTest", Test2::class.java, Any::class.java) + checkNoMethod(test2DefaultImpls, "setTest", Test2::class.java, Any::class.java, Any::class.java) + checkNoMethod(test2DefaultImpls, "setTest", Test2::class.java, String::class.java, String::class.java) return "OK" } diff --git a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInClass.kt b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInClass.kt new file mode 100644 index 00000000000..7465f9ce8f1 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInClass.kt @@ -0,0 +1,25 @@ +// !JVM_DEFAULT_MODE: all +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME + +interface Test { + fun test(p: T): T { + return p + } +} + +class TestClass : Test { + override fun test(p: String): String { + return p + "K" + } +} + +fun execute(t: Test, p: T): T { + return t.test(p) +} + +fun box(): String { + return execute(TestClass(), "O") +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface.kt b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface.kt new file mode 100644 index 00000000000..220db5d24c6 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface.kt @@ -0,0 +1,28 @@ +// !JVM_DEFAULT_MODE: all +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME + +interface Test { + fun test(p: T): T { + return p + } +} + +interface Test2: Test { + override fun test(p: String): String { + return p + "K" + } +} + +class TestClass : Test2 { +} + +fun execute(t: Test, p: T): T { + return t.test(p) +} + +fun box(): String { + return execute(TestClass(), "O") +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface2.kt b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface2.kt new file mode 100644 index 00000000000..6f11cb93485 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface2.kt @@ -0,0 +1,60 @@ +// !JVM_DEFAULT_MODE: all +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME +// FULL_JDK + +interface Test { + fun test(p: T): T { + return null!! + } +} + +interface Test2: Test { + override fun test(p: String): String { + return p + } +} + +class TestClass : Test2 + +fun box(): String { + checkMethodExists(Test2::class.java, "test", Any::class.java) + checkMethodExists(Test2::class.java, "test", String::class.java) + + checkNoMethod(TestClass::class.java, "test", String::class.java) + checkNoMethod(TestClass::class.java, "test", Any::class.java) + + try { + val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls") + checkNoMethod(test2DefaultImpls, "test", String::class.java) + checkNoMethod(test2DefaultImpls, "test", Any::class.java) + checkNoMethod(test2DefaultImpls, "test", Test2::class.java, Any::class.java) + checkNoMethod(test2DefaultImpls, "test", Test2::class.java, Any::class.java) + } catch (e: ClassNotFoundException) { + //or no class + } + return "OK" +} + +fun checkNoMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + } + catch (e: NoSuchMethodException) { + return + } + throw AssertionError("fail: method $name was found in " + clazz) +} + +fun checkMethodExists(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + return + } + catch (e: NoSuchMethodException) { + throw AssertionError("fail: method $name was not found in " + clazz, e) + } + +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties.kt b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties.kt new file mode 100644 index 00000000000..0b83bd01686 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties.kt @@ -0,0 +1,33 @@ +// !JVM_DEFAULT_MODE: all +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME + +interface Test { + var test: T + get() = null!! + set(value) { + null!! + } +} +var result = "fail" + +interface Test2 : Test { + override var test: String + get() = result + set(value) { + result = value + } +} + +class TestClass : Test2 + +fun execute(t: Test, p: T): T { + t.test = p + return t.test +} + +fun box(): String { + return execute(TestClass(), "OK") +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties2.kt b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties2.kt new file mode 100644 index 00000000000..a894eda2981 --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties2.kt @@ -0,0 +1,67 @@ +// !JVM_DEFAULT_MODE: all +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME +// FULL_JDK + +interface Test { + var T.test: T + get() = null!! + set(value) { + null!! + } +} + +interface Test2 : Test { + override var String.test: String + get() = "" + set(value) {} +} + +class TestClass : Test2 + +fun box(): String { + checkMethodExists(Test2::class.java, "getTest", String::class.java) + checkMethodExists(Test2::class.java, "getTest", Any::class.java) + checkMethodExists(Test2::class.java, "setTest", Any::class.java, Any::class.java) + checkMethodExists(Test2::class.java, "setTest", String::class.java, String::class.java) + + checkNoMethod(TestClass::class.java, "getTest", String::class.java) + checkNoMethod(TestClass::class.java, "getTest", Any::class.java) + checkNoMethod(TestClass::class.java, "setTest", Any::class.java, Any::class.java) + checkNoMethod(TestClass::class.java, "setTest", String::class.java, String::class.java) + + try { + val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls") + checkNoMethod(test2DefaultImpls, "getTest", Test2::class.java, String::class.java) + checkNoMethod(test2DefaultImpls, "getTest", Test2::class.java, Any::class.java) + checkNoMethod(test2DefaultImpls, "setTest", Test2::class.java, Any::class.java, Any::class.java) + checkNoMethod(test2DefaultImpls, "setTest", Test2::class.java, String::class.java, String::class.java) + } catch (e: ClassNotFoundException) { + //or no class + } + + return "OK" +} + +fun checkNoMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + } + catch (e: NoSuchMethodException) { + return + } + throw AssertionError("fail: method $name was found in " + clazz) +} + +fun checkMethodExists(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + return + } + catch (e: NoSuchMethodException) { + throw AssertionError("fail: method $name was not found in " + clazz, e) + } + +} diff --git a/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt new file mode 100644 index 00000000000..d18b10df4ca --- /dev/null +++ b/compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt @@ -0,0 +1,65 @@ +// !JVM_DEFAULT_MODE: all +// IGNORE_BACKEND_FIR: JVM_IR +// TARGET_BACKEND: JVM +// JVM_TARGET: 1.8 +// WITH_RUNTIME +// FULL_JDK + +// FILE: Test.java + +public interface Test { + default T test(T p) { + return null; + } +} + +// FILE: kotlin.kt + +interface Test2: Test { + override fun test(p: String): String { + return p + } + + fun forDefaultImpls() {} +} + +class TestClass : Test2 + +fun box(): String { + checkMethodExists(Test2::class.java, "test", String::class.java) + checkMethodExists(Test2::class.java, "test", Any::class.java) + + checkNoMethod(TestClass::class.java, "test", String::class.java) + checkNoMethod(TestClass::class.java, "test", Any::class.java) + + try { + val test2DefaultImpls = java.lang.Class.forName("Test2\$DefaultImpls") + checkNoMethod(test2DefaultImpls, "test", Any::class.java) + checkNoMethod(test2DefaultImpls, "test", String::class.java) + } catch (e: ClassNotFoundException) { + //or no class at all + } + + return "OK" +} + +fun checkNoMethod(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + } + catch (e: NoSuchMethodException) { + return + } + throw AssertionError("fail: method $name was found in " + clazz) +} + +fun checkMethodExists(clazz: Class<*>, name: String, vararg parameterTypes: Class<*>) { + try { + clazz.getDeclaredMethod(name, *parameterTypes) + return + } + catch (e: NoSuchMethodException) { + throw AssertionError("fail: method $name was not found in " + clazz, e) + } + +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index 6908e83af87..94bdb0d7e53 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -16153,6 +16153,36 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridge3.kt"); } + @TestMetadata("bridgeInClass.kt") + public void testBridgeInClass() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInClass.kt"); + } + + @TestMetadata("bridgeInInterface.kt") + public void testBridgeInInterface() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface.kt"); + } + + @TestMetadata("bridgeInInterface2.kt") + public void testBridgeInInterface2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface2.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties.kt") + public void testBridgeInInterfaceWithProperties() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties2.kt") + public void testBridgeInInterfaceWithProperties2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties2.kt"); + } + + @TestMetadata("bridgeWithJava.kt") + public void testBridgeWithJava() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt"); + } + @TestMetadata("bridgeWithProperties.kt") public void testBridgeWithProperties() throws Exception { runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithProperties.kt"); @@ -16352,6 +16382,36 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridge3.kt"); } + @TestMetadata("bridgeInClass.kt") + public void testBridgeInClass() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInClass.kt"); + } + + @TestMetadata("bridgeInInterface.kt") + public void testBridgeInInterface() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface.kt"); + } + + @TestMetadata("bridgeInInterface2.kt") + public void testBridgeInInterface2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface2.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties.kt") + public void testBridgeInInterfaceWithProperties() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties2.kt") + public void testBridgeInInterfaceWithProperties2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties2.kt"); + } + + @TestMetadata("bridgeWithJava.kt") + public void testBridgeWithJava() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt"); + } + @TestMetadata("bridgeWithProperties.kt") public void testBridgeWithProperties() throws Exception { runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithProperties.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index b1e3b637079..259adb90d18 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -16153,6 +16153,36 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridge3.kt"); } + @TestMetadata("bridgeInClass.kt") + public void testBridgeInClass() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInClass.kt"); + } + + @TestMetadata("bridgeInInterface.kt") + public void testBridgeInInterface() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface.kt"); + } + + @TestMetadata("bridgeInInterface2.kt") + public void testBridgeInInterface2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface2.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties.kt") + public void testBridgeInInterfaceWithProperties() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties2.kt") + public void testBridgeInInterfaceWithProperties2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties2.kt"); + } + + @TestMetadata("bridgeWithJava.kt") + public void testBridgeWithJava() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt"); + } + @TestMetadata("bridgeWithProperties.kt") public void testBridgeWithProperties() throws Exception { runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithProperties.kt"); @@ -16352,6 +16382,36 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridge3.kt"); } + @TestMetadata("bridgeInClass.kt") + public void testBridgeInClass() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInClass.kt"); + } + + @TestMetadata("bridgeInInterface.kt") + public void testBridgeInInterface() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface.kt"); + } + + @TestMetadata("bridgeInInterface2.kt") + public void testBridgeInInterface2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface2.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties.kt") + public void testBridgeInInterfaceWithProperties() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties2.kt") + public void testBridgeInInterfaceWithProperties2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties2.kt"); + } + + @TestMetadata("bridgeWithJava.kt") + public void testBridgeWithJava() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt"); + } + @TestMetadata("bridgeWithProperties.kt") public void testBridgeWithProperties() throws Exception { runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithProperties.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index bf61f122229..18ad2948079 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -14938,6 +14938,36 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridge3.kt"); } + @TestMetadata("bridgeInClass.kt") + public void testBridgeInClass() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInClass.kt"); + } + + @TestMetadata("bridgeInInterface.kt") + public void testBridgeInInterface() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface.kt"); + } + + @TestMetadata("bridgeInInterface2.kt") + public void testBridgeInInterface2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterface2.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties.kt") + public void testBridgeInInterfaceWithProperties() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties2.kt") + public void testBridgeInInterfaceWithProperties2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeInInterfaceWithProperties2.kt"); + } + + @TestMetadata("bridgeWithJava.kt") + public void testBridgeWithJava() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithJava.kt"); + } + @TestMetadata("bridgeWithProperties.kt") public void testBridgeWithProperties() throws Exception { runTest("compiler/testData/codegen/box/jvm8/defaults/allCompatibility/bridgeWithProperties.kt"); @@ -15137,6 +15167,36 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridge3.kt"); } + @TestMetadata("bridgeInClass.kt") + public void testBridgeInClass() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInClass.kt"); + } + + @TestMetadata("bridgeInInterface.kt") + public void testBridgeInInterface() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface.kt"); + } + + @TestMetadata("bridgeInInterface2.kt") + public void testBridgeInInterface2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterface2.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties.kt") + public void testBridgeInInterfaceWithProperties() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties.kt"); + } + + @TestMetadata("bridgeInInterfaceWithProperties2.kt") + public void testBridgeInInterfaceWithProperties2() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeInInterfaceWithProperties2.kt"); + } + + @TestMetadata("bridgeWithJava.kt") + public void testBridgeWithJava() throws Exception { + runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithJava.kt"); + } + @TestMetadata("bridgeWithProperties.kt") public void testBridgeWithProperties() throws Exception { runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/bridgeWithProperties.kt");