IR: handle conflicts in resolveFakeOverride()

This commit is contained in:
Georgy Bronnikov
2020-02-12 18:37:09 +03:00
parent c71e87068a
commit 79060e7f40
6 changed files with 46 additions and 1 deletions
@@ -296,7 +296,12 @@ fun IrSimpleFunction.collectRealOverrides(toSkip: (IrSimpleFunction) -> Boolean
// This implementation is from kotlin-native
// TODO: use this implementation instead of any other
fun IrSimpleFunction.resolveFakeOverride(toSkip: (IrSimpleFunction) -> Boolean = { false }): IrSimpleFunction? {
return collectRealOverrides(toSkip).singleOrNull { it.modality != Modality.ABSTRACT }
return collectRealOverrides(toSkip)
.filter { it.modality != Modality.ABSTRACT }
.let { realOverrides ->
// Kotlin forbids conflicts between overrides, but they may trickle down from Java.
realOverrides.singleOrNull { it.parent.safeAs<IrClass>()?.isInterface != true } ?: realOverrides.singleOrNull()
}
}
fun IrSimpleFunction.isOrOverridesSynthesized(): Boolean {
@@ -0,0 +1,20 @@
// TARGET_BACKEND: JVM
// SKIP_JDK6
// FILE: I.java
interface I {
default String ifun() { return "fail"; }
}
// FILE: Z.java
public class Z {
public String ifun() { return "OK"; }
}
// FILE: Zz.java
public class Zz extends Z implements I {}
// FILE: multipleImplFromJava.kt
class Cc : Zz()
fun box(): String = Zz().ifun()
@@ -28157,6 +28157,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/traits/multiple.kt");
}
@TestMetadata("multipleImplFromJava.kt")
public void testMultipleImplFromJava() throws Exception {
runTest("compiler/testData/codegen/box/traits/multipleImplFromJava.kt");
}
@TestMetadata("noPrivateDelegation.kt")
public void testNoPrivateDelegation() throws Exception {
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
@@ -26974,6 +26974,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/traits/multiple.kt");
}
@TestMetadata("multipleImplFromJava.kt")
public void testMultipleImplFromJava() throws Exception {
runTest("compiler/testData/codegen/box/traits/multipleImplFromJava.kt");
}
@TestMetadata("noPrivateDelegation.kt")
public void testNoPrivateDelegation() throws Exception {
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
@@ -26661,6 +26661,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/traits/multiple.kt");
}
@TestMetadata("multipleImplFromJava.kt")
public void testMultipleImplFromJava() throws Exception {
runTest("compiler/testData/codegen/box/traits/multipleImplFromJava.kt");
}
@TestMetadata("noPrivateDelegation.kt")
public void testNoPrivateDelegation() throws Exception {
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
@@ -26661,6 +26661,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/traits/multiple.kt");
}
@TestMetadata("multipleImplFromJava.kt")
public void testMultipleImplFromJava() throws Exception {
runTest("compiler/testData/codegen/box/traits/multipleImplFromJava.kt");
}
@TestMetadata("noPrivateDelegation.kt")
public void testNoPrivateDelegation() throws Exception {
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");