From 12a083af25863e9deaf704f3bb6aee5129237fcb Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Thu, 2 Feb 2023 21:10:35 +0100 Subject: [PATCH] [FIR2IR] Consider isExpect flag for generated synthetic functions It's actual for value classes ^KT-51969 Fixed --- .../generators/DataClassMembersGenerator.kt | 7 ++++++- .../FirBlackBoxCodegenTestGenerated.java | 6 ++++++ .../multiplatform/multiModule/valueClasses.kt | 19 +++++++++++++++++++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/box/multiplatform/multiModule/valueClasses.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt index bb42166af26..744733e4781 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunction import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl +import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.modality import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope @@ -218,6 +219,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon val equalsFunction = createSyntheticIrFunction( EQUALS, components.irBuiltIns.booleanType, + isExpect = klass.isExpect, otherParameterNeeded = true ) irDataClassMembersGenerator.generateEqualsMethod(equalsFunction, properties) @@ -230,6 +232,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon val hashCodeFunction = createSyntheticIrFunction( HASHCODE_NAME, components.irBuiltIns.intType, + isExpect = klass.isExpect ) irDataClassMembersGenerator.generateHashCodeMethod(hashCodeFunction, properties) irClass.declarations.add(hashCodeFunction) @@ -241,6 +244,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon val toStringFunction = createSyntheticIrFunction( TO_STRING, components.irBuiltIns.stringType, + isExpect = klass.isExpect ) irDataClassMembersGenerator.generateToStringMethod(toStringFunction, properties) irClass.declarations.add(toStringFunction) @@ -262,6 +266,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon private fun createSyntheticIrFunction( name: Name, returnType: IrType, + isExpect: Boolean, otherParameterNeeded: Boolean = false ): IrFunction { val functionSymbol = FirNamedFunctionSymbol(CallableId(lookupTag.classId, name)) @@ -269,7 +274,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon origin = FirDeclarationOrigin.Synthetic this.name = name this.symbol = functionSymbol - this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL) + this.status = FirDeclarationStatusImpl(Visibilities.Public, Modality.FINAL).also { it.isExpect = isExpect } moduleData = components.session.moduleData this.returnTypeRef = when (returnType) { components.irBuiltIns.booleanType -> FirImplicitBooleanTypeRef(null) 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 c4592fff7d5..2cb97e057a2 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 @@ -33129,6 +33129,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT public void testKt_56329() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/multiModule/kt-56329.kt"); } + + @Test + @TestMetadata("valueClasses.kt") + public void testValueClasses() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/multiModule/valueClasses.kt"); + } } } diff --git a/compiler/testData/codegen/box/multiplatform/multiModule/valueClasses.kt b/compiler/testData/codegen/box/multiplatform/multiModule/valueClasses.kt new file mode 100644 index 00000000000..80af27398df --- /dev/null +++ b/compiler/testData/codegen/box/multiplatform/multiModule/valueClasses.kt @@ -0,0 +1,19 @@ +// ISSUE: KT-51969 +// !LANGUAGE: +MultiPlatformProjects +// TARGET_BACKEND: JVM_IR +// WITH_STDLIB + +// MODULE: common +// TARGET_PLATFORM: Common +// FILE: expect.kt + +expect value class ExpectValue(val x: String) + +// MODULE: main()()(common) +// TARGET_PLATFORM: JVM +// FILE: actual.kt + +@JvmInline +actual value class ExpectValue actual constructor(actual val x: String) + +fun box() = ExpectValue("OK").x \ No newline at end of file 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 a009bcbb795..62be27e5b50 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 @@ -33129,6 +33129,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes public void testKt_56329() throws Exception { runTest("compiler/testData/codegen/box/multiplatform/multiModule/kt-56329.kt"); } + + @Test + @TestMetadata("valueClasses.kt") + public void testValueClasses() throws Exception { + runTest("compiler/testData/codegen/box/multiplatform/multiModule/valueClasses.kt"); + } } }