From 8a29021aad3db36979584f22e70134d610d986de Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 7 Jul 2020 13:20:23 +0300 Subject: [PATCH] [FIR2IR] Make data class synthetic members public API --- .../fir/backend/Fir2IrDeclarationStorage.kt | 2 +- .../generators/DataClassMembersGenerator.kt | 75 ++++++++++--------- 2 files changed, 39 insertions(+), 38 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 274f1367402..5d73a3717b8 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -349,7 +349,7 @@ class Fir2IrDeclarationStorage( } } - private fun declareIrSimpleFunction( + internal fun declareIrSimpleFunction( signature: IdSignature?, containerSource: DeserializedContainerSource?, factory: (IrSimpleFunctionSymbol) -> IrSimpleFunction 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 f36a882e655..b56669eb786 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 @@ -33,7 +33,6 @@ import org.jetbrains.kotlin.ir.builders.IrGeneratorContextBase import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.declarations.impl.IrValueParameterImpl -import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.ir.descriptors.WrappedValueParameterDescriptor import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression import org.jetbrains.kotlin.ir.types.IrType @@ -167,7 +166,8 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) { val equalsFunction = createSyntheticIrFunction( equalsName, components.irBuiltIns.booleanType, - ) { createSyntheticIrParameter(it, Name.identifier("other"), components.irBuiltIns.anyNType) } + otherParameterNeeded = true + ) irDataClassMembersGenerator.generateEqualsMethod(equalsFunction, properties) irClass.declarations.add(equalsFunction) } @@ -213,11 +213,38 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) { private fun createSyntheticIrFunction( name: Name, returnType: IrType, - valueParameterBuilder: (IrFunction) -> IrValueParameter? = { null } + otherParameterNeeded: Boolean = false ): IrFunction { - val functionDescriptor = WrappedSimpleFunctionDescriptor() val thisReceiverDescriptor = WrappedValueParameterDescriptor() - return components.symbolTable.declareSimpleFunction(functionDescriptor) { symbol -> + val firFunction = buildSimpleFunction { + origin = FirDeclarationOrigin.Synthetic + this.name = name + this.symbol = FirNamedFunctionSymbol(CallableId(classId, name)) + this.status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL) + this.session = components.session + this.returnTypeRef = when (returnType) { + components.irBuiltIns.booleanType -> FirImplicitBooleanTypeRef(null) + components.irBuiltIns.intType -> FirImplicitIntTypeRef(null) + components.irBuiltIns.stringType -> FirImplicitStringTypeRef(null) + else -> error("Unexpected synthetic data class function return type: $returnType") + } + if (otherParameterNeeded) { + this.valueParameters.add( + buildValueParameter { + this.name = Name.identifier("other") + origin = FirDeclarationOrigin.Synthetic + this.session = components.session + this.returnTypeRef = FirImplicitNullableAnyTypeRef(null) + this.symbol = FirVariableSymbol(this.name) + isCrossinline = false + isNoinline = false + isVararg = false + } + ) + } + } + val signature = components.signatureComposer.composeSignature(firFunction) + return components.declarationStorage.declareIrSimpleFunction(signature, null) { symbol -> IrFunctionImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, @@ -235,44 +262,18 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) { isFakeOverride = false, isOperator = false ).apply { - val irValueParameter = valueParameterBuilder(this)?.let { - this.valueParameters = listOf(it) - it + if (otherParameterNeeded) { + val irValueParameter = createSyntheticIrParameter( + this, firFunction.valueParameters.first().name, components.irBuiltIns.anyNType + ) + this.valueParameters = listOf(irValueParameter) } metadata = FirMetadataSource.Function( - buildSimpleFunction { - origin = FirDeclarationOrigin.Synthetic - this.name = name - this.symbol = FirNamedFunctionSymbol(CallableId(classId.packageFqName, classId.relativeClassName, name)) - this.status = FirDeclarationStatusImpl(Visibilities.PUBLIC, Modality.FINAL) - this.session = components.session - this.returnTypeRef = when (returnType) { - components.irBuiltIns.booleanType -> FirImplicitBooleanTypeRef(null) - components.irBuiltIns.intType -> FirImplicitIntTypeRef(null) - components.irBuiltIns.stringType -> FirImplicitStringTypeRef(null) - else -> error("Unexpected synthetic data class function return type: $returnType") - } - if (irValueParameter != null) { - this.valueParameters.add( - buildValueParameter { - this.name = irValueParameter.name - origin = FirDeclarationOrigin.Synthetic - this.session = components.session - this.returnTypeRef = FirImplicitNullableAnyTypeRef(null) - this.symbol = FirVariableSymbol(irValueParameter.name) - isCrossinline = false - isNoinline = false - isVararg = false - } - ) - } - } + firFunction ) - } }.apply { parent = irClass - functionDescriptor.bind(this) dispatchReceiverParameter = generateDispatchReceiverParameter(this, thisReceiverDescriptor) components.irBuiltIns.anyClass.descriptor.unsubstitutedMemberScope .getContributedFunctions(this.name, NoLookupLocation.FROM_BACKEND)