From 8c30adc301183a0b18e6590ac3b3c5de2850f90f Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Fri, 22 Jan 2021 19:34:07 +0300 Subject: [PATCH] FIR2IR: Unwrap intersection overrides for intersection types --- .../kotlin/fir/backend/ConversionUtils.kt | 14 ++++++- ...mpileKotlinAgainstKotlinTestGenerated.java | 5 +++ .../fakeOverridesForIntersectionTypes.kt | 40 +++++++++++++++++++ ...mpileKotlinAgainstKotlinTestGenerated.java | 5 +++ ...mpileKotlinAgainstKotlinTestGenerated.java | 5 +++ .../ir/JvmIrAgainstOldBoxTestGenerated.java | 5 +++ .../ir/JvmOldAgainstIrBoxTestGenerated.java | 5 +++ 7 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt index ed271c778d4..e7ee5d59922 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/ConversionUtils.kt @@ -232,7 +232,19 @@ internal tailrec fun FirCallableSymbol<*>.unwrapCallRepresentative(root: FirCall val originalForTypeAlias = fir.originalConstructorIfTypeAlias if (originalForTypeAlias != null) return originalForTypeAlias.symbol.unwrapCallRepresentative(this) } - if (fir.isIntersectionOverride) return this + + if (fir.isIntersectionOverride) { + // We've got IR declarations (fake overrides) for intersection overrides in classes, but not for intersection types + // interface A { fun foo() } + // interface B { fun foo() } + // interface C : A, B // for C.foo we've got an IR fake override + // for {A & B} we don't have such an IR declaration, so we're unwrapping it + if (fir is FirCallableMemberDeclaration && fir.dispatchReceiverType is ConeIntersectionType) { + return fir.baseForIntersectionOverride!!.symbol.unwrapCallRepresentative(this) + } + + return this + } val overriddenSymbol = fir.originalForSubstitutionOverride?.takeIf { it.containingClass() == root.containingClass() diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java index 4a3ba048705..96f03a929c6 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/codegen/FirCompileKotlinAgainstKotlinTestGenerated.java @@ -150,6 +150,11 @@ public class FirCompileKotlinAgainstKotlinTestGenerated extends AbstractFirCompi runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("fakeOverridesForIntersectionTypes.kt") + public void testFakeOverridesForIntersectionTypes() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); + } + @TestMetadata("importCompanion.kt") public void testImportCompanion() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); diff --git a/compiler/testData/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt b/compiler/testData/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt new file mode 100644 index 00000000000..c134e2541d6 --- /dev/null +++ b/compiler/testData/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt @@ -0,0 +1,40 @@ +// TARGET_BACKEND: JVM +// FILE: A.kt +package a + +interface T { + var x: String +} + +interface A : T { + override var x: String +} + +interface B : T { + override var x: String +} + +class C : A, B { + override var x: String = "" +} + +class D : A, B { + override var x: String = "" +} + +// FILE: B.kt +import a.* + +fun foo(condition: Boolean): String { + val aAndB = if (condition) C() else D() + aAndB.x = "OK" + + return aAndB.x +} + +fun box(): String { + if (foo(true) != "OK") return "fail 1" + if (foo(false) != "OK") return "fail 2" + + return "OK" +} diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java index f32544bc465..e940b1e4e08 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/CompileKotlinAgainstKotlinTestGenerated.java @@ -149,6 +149,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("fakeOverridesForIntersectionTypes.kt") + public void testFakeOverridesForIntersectionTypes() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); + } + @TestMetadata("importCompanion.kt") public void testImportCompanion() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java index d06467ecb17..b5eb98e6ded 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/IrCompileKotlinAgainstKotlinTestGenerated.java @@ -150,6 +150,11 @@ public class IrCompileKotlinAgainstKotlinTestGenerated extends AbstractIrCompile runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("fakeOverridesForIntersectionTypes.kt") + public void testFakeOverridesForIntersectionTypes() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); + } + @TestMetadata("importCompanion.kt") public void testImportCompanion() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java index adf66b2a2c9..8c271d82a35 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmIrAgainstOldBoxTestGenerated.java @@ -150,6 +150,11 @@ public class JvmIrAgainstOldBoxTestGenerated extends AbstractJvmIrAgainstOldBoxT runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("fakeOverridesForIntersectionTypes.kt") + public void testFakeOverridesForIntersectionTypes() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); + } + @TestMetadata("importCompanion.kt") public void testImportCompanion() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java index 3ab0fcfc80a..372a0b84881 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/ir/JvmOldAgainstIrBoxTestGenerated.java @@ -150,6 +150,11 @@ public class JvmOldAgainstIrBoxTestGenerated extends AbstractJvmOldAgainstIrBoxT runTest("compiler/testData/compileKotlinAgainstKotlin/expectClassActualTypeAlias.kt"); } + @TestMetadata("fakeOverridesForIntersectionTypes.kt") + public void testFakeOverridesForIntersectionTypes() throws Exception { + runTest("compiler/testData/compileKotlinAgainstKotlin/fakeOverridesForIntersectionTypes.kt"); + } + @TestMetadata("importCompanion.kt") public void testImportCompanion() throws Exception { runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");