Don't generate implicit overrides delegating to Java defaults

#KT-40920 Fixed
This commit is contained in:
Mikhael Bogdanov
2020-08-10 12:24:54 +02:00
parent 07aee8831e
commit 607f99ed3c
11 changed files with 339 additions and 2 deletions
@@ -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;
}
@@ -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");
+28
View File
@@ -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
}
@@ -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");
@@ -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");
@@ -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");