[FIR2IR] Consider isExpect flag for generated synthetic functions

It's actual for value classes

^KT-51969 Fixed
This commit is contained in:
Ivan Kochurkin
2023-02-02 21:10:35 +01:00
committed by Space Team
parent 4374ca390a
commit 12a083af25
4 changed files with 37 additions and 1 deletions
@@ -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.buildSimpleFunction
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl 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.declarations.utils.modality
import org.jetbrains.kotlin.fir.moduleData import org.jetbrains.kotlin.fir.moduleData
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
@@ -218,6 +219,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon
val equalsFunction = createSyntheticIrFunction( val equalsFunction = createSyntheticIrFunction(
EQUALS, EQUALS,
components.irBuiltIns.booleanType, components.irBuiltIns.booleanType,
isExpect = klass.isExpect,
otherParameterNeeded = true otherParameterNeeded = true
) )
irDataClassMembersGenerator.generateEqualsMethod(equalsFunction, properties) irDataClassMembersGenerator.generateEqualsMethod(equalsFunction, properties)
@@ -230,6 +232,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon
val hashCodeFunction = createSyntheticIrFunction( val hashCodeFunction = createSyntheticIrFunction(
HASHCODE_NAME, HASHCODE_NAME,
components.irBuiltIns.intType, components.irBuiltIns.intType,
isExpect = klass.isExpect
) )
irDataClassMembersGenerator.generateHashCodeMethod(hashCodeFunction, properties) irDataClassMembersGenerator.generateHashCodeMethod(hashCodeFunction, properties)
irClass.declarations.add(hashCodeFunction) irClass.declarations.add(hashCodeFunction)
@@ -241,6 +244,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon
val toStringFunction = createSyntheticIrFunction( val toStringFunction = createSyntheticIrFunction(
TO_STRING, TO_STRING,
components.irBuiltIns.stringType, components.irBuiltIns.stringType,
isExpect = klass.isExpect
) )
irDataClassMembersGenerator.generateToStringMethod(toStringFunction, properties) irDataClassMembersGenerator.generateToStringMethod(toStringFunction, properties)
irClass.declarations.add(toStringFunction) irClass.declarations.add(toStringFunction)
@@ -262,6 +266,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon
private fun createSyntheticIrFunction( private fun createSyntheticIrFunction(
name: Name, name: Name,
returnType: IrType, returnType: IrType,
isExpect: Boolean,
otherParameterNeeded: Boolean = false otherParameterNeeded: Boolean = false
): IrFunction { ): IrFunction {
val functionSymbol = FirNamedFunctionSymbol(CallableId(lookupTag.classId, name)) val functionSymbol = FirNamedFunctionSymbol(CallableId(lookupTag.classId, name))
@@ -269,7 +274,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon
origin = FirDeclarationOrigin.Synthetic origin = FirDeclarationOrigin.Synthetic
this.name = name this.name = name
this.symbol = functionSymbol 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 moduleData = components.session.moduleData
this.returnTypeRef = when (returnType) { this.returnTypeRef = when (returnType) {
components.irBuiltIns.booleanType -> FirImplicitBooleanTypeRef(null) components.irBuiltIns.booleanType -> FirImplicitBooleanTypeRef(null)
@@ -33129,6 +33129,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
public void testKt_56329() throws Exception { public void testKt_56329() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/multiModule/kt-56329.kt"); 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");
}
} }
} }
@@ -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
@@ -33129,6 +33129,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
public void testKt_56329() throws Exception { public void testKt_56329() throws Exception {
runTest("compiler/testData/codegen/box/multiplatform/multiModule/kt-56329.kt"); 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");
}
} }
} }