Don't generate implicit overrides delegating to Java defaults
#KT-40920 Fixed
This commit is contained in:
@@ -38,6 +38,7 @@ import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.enumEntryNeedS
|
||||
import static org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.descriptorToDeclaration;
|
||||
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.OBJECT_TYPE;
|
||||
import static org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOriginKind.CLASS_MEMBER_DELEGATION_TO_DEFAULT_IMPL;
|
||||
import static org.jetbrains.kotlin.util.DeclarationUtilKt.findImplementationFromInterface;
|
||||
import static org.jetbrains.kotlin.util.DeclarationUtilKt.findInterfaceImplementation;
|
||||
|
||||
public abstract class ClassBodyCodegen extends MemberCodegen<KtPureClassOrObject> {
|
||||
@@ -236,9 +237,12 @@ public abstract class ClassBodyCodegen extends MemberCodegen<KtPureClassOrObject
|
||||
@NotNull GenerationState state,
|
||||
boolean isErasedInlineClass
|
||||
) {
|
||||
CallableMemberDescriptor actualImplementation =
|
||||
interfaceFun.getKind().isReal() ? interfaceFun : findImplementationFromInterface(interfaceFun);
|
||||
assert actualImplementation != null : "Can't find actual implementation for " + interfaceFun;
|
||||
// Skip Java 8 default methods
|
||||
if (CodegenUtilKt.isDefinitelyNotDefaultImplsMethod(interfaceFun) ||
|
||||
JvmAnnotationUtilKt.checkIsImplementationCompiledToJvmDefault(interfaceFun, state.getJvmDefaultMode())) {
|
||||
if (CodegenUtilKt.isDefinitelyNotDefaultImplsMethod(actualImplementation) ||
|
||||
JvmAnnotationUtilKt.isCallableMemberCompiledToJvmDefault(actualImplementation, state.getJvmDefaultMode())) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Generated
+30
@@ -15432,6 +15432,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/kt14243_prop.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("oneImplementation.kt")
|
||||
public void testOneImplementation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/oneImplementation.kt");
|
||||
@@ -15861,6 +15866,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/kt14243_2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("privateFunInInterface.kt")
|
||||
public void testPrivateFunInInterface() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/privateFunInInterface.kt");
|
||||
@@ -16040,6 +16050,26 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/invokeDefaultViaSuper.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_java.kt")
|
||||
public void testKt40920_java() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_java.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_java2.kt")
|
||||
public void testKt40920_java2() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_java2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_map.kt")
|
||||
public void testKt40920_map() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_map.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("longChainOfKotlinExtendsFromJavaWithDefault.kt")
|
||||
public void testLongChainOfKotlinExtendsFromJavaWithDefault() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/longChainOfKotlinExtendsFromJavaWithDefault.kt");
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
// !JVM_DEFAULT_MODE: enable
|
||||
// TARGET_BACKEND: JVM
|
||||
// FILE: JBase.java
|
||||
|
||||
public interface JBase extends Base {
|
||||
default String test() {
|
||||
return "OK";
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
// JVM_TARGET: 1.8
|
||||
// WITH_RUNTIME
|
||||
|
||||
interface Base {
|
||||
@JvmDefault
|
||||
fun test(): String = "Base"
|
||||
}
|
||||
|
||||
interface LeftBase : Base
|
||||
interface Right : JBase
|
||||
|
||||
interface Child : LeftBase, Right
|
||||
|
||||
|
||||
fun box(): String {
|
||||
return object : Child {}.test()
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
// !JVM_DEFAULT_MODE: all
|
||||
// TARGET_BACKEND: JVM
|
||||
// FILE: JBase.java
|
||||
|
||||
public interface JBase extends Base {
|
||||
default String test() {
|
||||
return "OK";
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
// JVM_TARGET: 1.8
|
||||
// WITH_RUNTIME
|
||||
|
||||
interface Base {
|
||||
fun test(): String = "Base"
|
||||
}
|
||||
|
||||
interface LeftBase : Base
|
||||
interface Right : JBase
|
||||
|
||||
interface Child : LeftBase, Right
|
||||
|
||||
|
||||
fun box(): String {
|
||||
return object : Child {}.test()
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
// !JVM_DEFAULT_MODE: disable
|
||||
// JVM_TARGET: 1.8
|
||||
// TARGET_BACKEND: JVM
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
// FILE: JBase.java
|
||||
|
||||
public interface JBase extends Base {
|
||||
default String test() {
|
||||
return "OK";
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
// WITH_RUNTIME
|
||||
|
||||
interface Base {
|
||||
fun test(): String = "Base"
|
||||
}
|
||||
|
||||
interface LeftBase : Base
|
||||
interface Right : JBase
|
||||
|
||||
interface Child : LeftBase, Right
|
||||
|
||||
|
||||
fun box(): String {
|
||||
return object : Child {}.test()
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
// !JVM_DEFAULT_MODE: disable
|
||||
// JVM_TARGET: 1.8
|
||||
// TARGET_BACKEND: JVM
|
||||
// FILE: Base.java
|
||||
|
||||
public interface Base {
|
||||
default String test() {
|
||||
return "Base";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// FILE: main.kt
|
||||
// WITH_RUNTIME
|
||||
|
||||
interface LeftBase : Base
|
||||
interface Right : Base {
|
||||
override fun test(): String = "OK"
|
||||
}
|
||||
|
||||
interface Child : LeftBase, Right
|
||||
|
||||
|
||||
fun box(): String {
|
||||
return object : Child {}.test()
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
// !JVM_DEFAULT_MODE: disable
|
||||
// JVM_TARGET: 1.8
|
||||
// TARGET_BACKEND: JVM
|
||||
// FILE: Base.java
|
||||
|
||||
public interface Base {
|
||||
default String test() {
|
||||
return "Base";
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: Left.java
|
||||
|
||||
public interface Left extends Base {
|
||||
}
|
||||
|
||||
// FILE: main.kt
|
||||
// WITH_RUNTIME
|
||||
|
||||
interface Right : Base {
|
||||
override fun test(): String = "OK"
|
||||
}
|
||||
|
||||
interface Child : Left, Right
|
||||
|
||||
fun box(): String {
|
||||
return object : Child {}.test()
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
// !JVM_DEFAULT_MODE: disable
|
||||
// JVM_TARGET: 1.8
|
||||
// TARGET_BACKEND: JVM
|
||||
// FILE: main.kt
|
||||
// WITH_RUNTIME
|
||||
// FULL_JDK
|
||||
// IGNORE_BACKEND_FIR: JVM_IR
|
||||
var result = ""
|
||||
|
||||
interface A<K, V> : MutableMap<K, V>
|
||||
|
||||
interface Left<K, V> : A<K, V>
|
||||
|
||||
interface Right<K, V> : A<K, V> {
|
||||
|
||||
override fun remove(key: K): V? {
|
||||
result += key.toString() + ";"
|
||||
return null
|
||||
}
|
||||
|
||||
override public fun getOrDefault(key: K, defaultValue: V): V {
|
||||
result += key.toString() + ";"
|
||||
return defaultValue
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
internal class MyMap : Left<String, String>, Right<String, String> {
|
||||
override val size: Int
|
||||
get() = null!!
|
||||
|
||||
override fun isEmpty(): Boolean {
|
||||
return true
|
||||
}
|
||||
|
||||
override fun containsKey(key: String): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun containsValue(value: String): Boolean {
|
||||
return false
|
||||
}
|
||||
|
||||
override fun get(key: String): String? {
|
||||
TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override fun put(key: String, value: String): String? {
|
||||
result += "$key=$value;"
|
||||
return null
|
||||
}
|
||||
|
||||
override fun putAll(from: Map<out String, String>) {
|
||||
}
|
||||
|
||||
override fun clear() {}
|
||||
|
||||
override val keys: MutableSet<String>
|
||||
get() = null!!
|
||||
|
||||
override val values: MutableCollection<String>
|
||||
get() = null!!
|
||||
|
||||
override val entries: MutableSet<MutableMap.MutableEntry<String, String>>
|
||||
get() = null!!
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
val map = MyMap()
|
||||
map["O"] = "fail"
|
||||
map.remove("O")
|
||||
|
||||
val value = map.getOrDefault("O", "OK")
|
||||
if (result != "O=fail;O;O;") return "fail 3: $result"
|
||||
return value
|
||||
}
|
||||
+30
@@ -16657,6 +16657,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/kt14243_prop.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("oneImplementation.kt")
|
||||
public void testOneImplementation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/oneImplementation.kt");
|
||||
@@ -17086,6 +17091,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/kt14243_2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("privateFunInInterface.kt")
|
||||
public void testPrivateFunInInterface() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/privateFunInInterface.kt");
|
||||
@@ -17265,6 +17275,26 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/invokeDefaultViaSuper.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_java.kt")
|
||||
public void testKt40920_java() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_java.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_java2.kt")
|
||||
public void testKt40920_java2() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_java2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_map.kt")
|
||||
public void testKt40920_map() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_map.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("longChainOfKotlinExtendsFromJavaWithDefault.kt")
|
||||
public void testLongChainOfKotlinExtendsFromJavaWithDefault() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/longChainOfKotlinExtendsFromJavaWithDefault.kt");
|
||||
|
||||
+30
@@ -16657,6 +16657,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/kt14243_prop.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("oneImplementation.kt")
|
||||
public void testOneImplementation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/oneImplementation.kt");
|
||||
@@ -17086,6 +17091,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/kt14243_2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("privateFunInInterface.kt")
|
||||
public void testPrivateFunInInterface() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/privateFunInInterface.kt");
|
||||
@@ -17265,6 +17275,26 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/invokeDefaultViaSuper.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_java.kt")
|
||||
public void testKt40920_java() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_java.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_java2.kt")
|
||||
public void testKt40920_java2() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_java2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_map.kt")
|
||||
public void testKt40920_map() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_map.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("longChainOfKotlinExtendsFromJavaWithDefault.kt")
|
||||
public void testLongChainOfKotlinExtendsFromJavaWithDefault() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/longChainOfKotlinExtendsFromJavaWithDefault.kt");
|
||||
|
||||
+30
@@ -15432,6 +15432,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/kt14243_prop.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("oneImplementation.kt")
|
||||
public void testOneImplementation() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/oneImplementation.kt");
|
||||
@@ -15861,6 +15866,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/kt14243_2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("privateFunInInterface.kt")
|
||||
public void testPrivateFunInInterface() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/defaults/noDefaultImpls/privateFunInInterface.kt");
|
||||
@@ -16040,6 +16050,26 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/invokeDefaultViaSuper.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920.kt")
|
||||
public void testKt40920() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_java.kt")
|
||||
public void testKt40920_java() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_java.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_java2.kt")
|
||||
public void testKt40920_java2() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_java2.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt40920_map.kt")
|
||||
public void testKt40920_map() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/kt40920_map.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("longChainOfKotlinExtendsFromJavaWithDefault.kt")
|
||||
public void testLongChainOfKotlinExtendsFromJavaWithDefault() throws Exception {
|
||||
runTest("compiler/testData/codegen/box/jvm8/javaDefaults/longChainOfKotlinExtendsFromJavaWithDefault.kt");
|
||||
|
||||
Reference in New Issue
Block a user