IR: handle conflicts in resolveFakeOverride()
This commit is contained in:
@@ -296,7 +296,12 @@ fun IrSimpleFunction.collectRealOverrides(toSkip: (IrSimpleFunction) -> Boolean
|
|||||||
// This implementation is from kotlin-native
|
// This implementation is from kotlin-native
|
||||||
// TODO: use this implementation instead of any other
|
// TODO: use this implementation instead of any other
|
||||||
fun IrSimpleFunction.resolveFakeOverride(toSkip: (IrSimpleFunction) -> Boolean = { false }): IrSimpleFunction? {
|
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 {
|
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()
|
||||||
+5
@@ -28157,6 +28157,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/traits/multiple.kt");
|
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")
|
@TestMetadata("noPrivateDelegation.kt")
|
||||||
public void testNoPrivateDelegation() throws Exception {
|
public void testNoPrivateDelegation() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
|
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
|
||||||
|
|||||||
+5
@@ -26974,6 +26974,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/traits/multiple.kt");
|
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")
|
@TestMetadata("noPrivateDelegation.kt")
|
||||||
public void testNoPrivateDelegation() throws Exception {
|
public void testNoPrivateDelegation() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
|
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
|
||||||
|
|||||||
+5
@@ -26661,6 +26661,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/traits/multiple.kt");
|
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")
|
@TestMetadata("noPrivateDelegation.kt")
|
||||||
public void testNoPrivateDelegation() throws Exception {
|
public void testNoPrivateDelegation() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
|
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
|
||||||
|
|||||||
+5
@@ -26661,6 +26661,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/traits/multiple.kt");
|
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")
|
@TestMetadata("noPrivateDelegation.kt")
|
||||||
public void testNoPrivateDelegation() throws Exception {
|
public void testNoPrivateDelegation() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
|
runTest("compiler/testData/codegen/box/traits/noPrivateDelegation.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user