From c89770c450d2a86f7a620dca46392742ef733fa1 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Fri, 27 Jan 2023 16:54:05 +0100 Subject: [PATCH] [IR] Consider extension receivers during expect functions actualization ^KT-56199 Fixed --- .../FirBlackBoxCodegenTestGenerated.java | 6 +++++ .../common/actualizer/IrActualizerUtils.kt | 24 +++++++++++++++++-- ...lDifferentExtensionReceiversOnOverloads.kt | 22 +++++++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 6 +++++ .../IrBlackBoxCodegenTestGenerated.java | 6 +++++ .../LightAnalysisModeTestGenerated.java | 5 ++++ 6 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/multiplatform/multiModule/expectActualDifferentExtensionReceiversOnOverloads.kt diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 4236c4ce3ee..49a62b57034 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -33028,6 +33028,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/multiplatform/multiModule/expectActualCallableReference.kt"); } + @Test + @TestMetadata("expectActualDifferentExtensionReceiversOnOverloads.kt") + public void testExpectActualDifferentExtensionReceiversOnOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/multiModule/expectActualDifferentExtensionReceiversOnOverloads.kt"); + } + @Test @TestMetadata("expectActualDifferentPackages.kt") public void testExpectActualDifferentPackages() throws Exception { diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt index 8f4547c62e4..ec0a99c75c5 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrActualizerUtils.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.classifierOrFail import org.jetbrains.kotlin.ir.util.render @@ -18,14 +19,33 @@ fun checkParameters( actualFunction: IrFunction, expectActualTypesMap: Map ): Boolean { - if (expectFunction.valueParameters.size != actualFunction.valueParameters.size) return false - for ((expectParameter, actualParameter) in expectFunction.valueParameters.zip(actualFunction.valueParameters)) { + fun checkParameter(expectParameter: IrValueParameter?, actualParameter: IrValueParameter?): Boolean { + if (expectParameter == null) { + return actualParameter == null + } + if (actualParameter == null) { + return false + } + val expectParameterTypeSymbol = expectParameter.type.classifierOrFail val actualizedParameterTypeSymbol = expectActualTypesMap[expectParameterTypeSymbol] ?: expectParameterTypeSymbol if (actualizedParameterTypeSymbol != actualParameter.type.classifierOrFail) { return false } + return true } + + if (expectFunction.valueParameters.size != actualFunction.valueParameters.size || + !checkParameter(expectFunction.extensionReceiverParameter, actualFunction.extensionReceiverParameter) + ) { + return false + } + for ((expectParameter, actualParameter) in expectFunction.valueParameters.zip(actualFunction.valueParameters)) { + if (!checkParameter(expectParameter, actualParameter)) { + return false + } + } + return true } diff --git a/compiler/testData/codegen/box/multiplatform/multiModule/expectActualDifferentExtensionReceiversOnOverloads.kt b/compiler/testData/codegen/box/multiplatform/multiModule/expectActualDifferentExtensionReceiversOnOverloads.kt new file mode 100644 index 00000000000..b7290428d11 --- /dev/null +++ b/compiler/testData/codegen/box/multiplatform/multiModule/expectActualDifferentExtensionReceiversOnOverloads.kt @@ -0,0 +1,22 @@ +// TARGET_BACKEND: JVM +// !LANGUAGE: +MultiPlatformProjects + +// MODULE: common +// TARGET_PLATFORM: Common +// FILE: common.kt + +expect fun Array.getChecked(index: Int): T + +expect fun BooleanArray.getChecked(index: Int): Boolean + +fun ok() = if (!BooleanArray(1).getChecked(0)) "OK" else "FAIL" + +// MODULE: jvm()()(common) +// TARGET_PLATFORM: JVM +// FILE: main.kt + +actual fun Array.getChecked(index: Int) = get(index) + +actual fun BooleanArray.getChecked(index: Int) = get(index) + +fun box() = ok() \ No newline at end of file diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 545a5dd5526..2e7e67ed3a3 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -31762,6 +31762,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/multiplatform/multiModule/enumEntryNameCall.kt"); } + @Test + @TestMetadata("expectActualDifferentExtensionReceiversOnOverloads.kt") + public void testExpectActualDifferentExtensionReceiversOnOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/multiModule/expectActualDifferentExtensionReceiversOnOverloads.kt"); + } + @Test @TestMetadata("expectActualMultiCommon.kt") public void testExpectActualMultiCommon() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index ef37d0be68f..f8e9a83367f 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -33028,6 +33028,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/multiplatform/multiModule/expectActualCallableReference.kt"); } + @Test + @TestMetadata("expectActualDifferentExtensionReceiversOnOverloads.kt") + public void testExpectActualDifferentExtensionReceiversOnOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/multiModule/expectActualDifferentExtensionReceiversOnOverloads.kt"); + } + @Test @TestMetadata("expectActualDifferentPackages.kt") public void testExpectActualDifferentPackages() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index c8db1d0281d..8d4855c5cd0 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -27039,6 +27039,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/multiplatform/multiModule/enumEntryNameCall.kt"); } + @TestMetadata("expectActualDifferentExtensionReceiversOnOverloads.kt") + public void testExpectActualDifferentExtensionReceiversOnOverloads() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/multiModule/expectActualDifferentExtensionReceiversOnOverloads.kt"); + } + @TestMetadata("expectActualMultiCommon.kt") public void testExpectActualMultiCommon() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/multiModule/expectActualMultiCommon.kt");