From da531bc261a3e1539d4414cfd62e770eb715a26c Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 27 Nov 2023 14:09:49 +0200 Subject: [PATCH] [FIR2IR] Don't access `symbol.owner` in DataClassMembersGenerator --- .../backend/generators/DataClassMembersGenerator.kt | 13 ++++++++----- .../kotlin/ir/util/DataClassMembersGenerator.kt | 9 ++++++++- 2 files changed, 16 insertions(+), 6 deletions(-) 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 3089e78ec92..8bdee57aba5 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 @@ -109,7 +109,10 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon } } ?: error("Property for parameter $irValueParameter") - inner class Fir2IrHashCodeFunctionInfo(override val symbol: IrSimpleFunctionSymbol) : HashCodeFunctionInfo { + inner class Fir2IrHashCodeFunctionInfo( + override val symbol: IrSimpleFunctionSymbol, + override val hasDispatchReceiver: Boolean, + ) : HashCodeFunctionInfo { override fun commitSubstituted(irMemberAccessExpression: IrMemberAccessExpression<*>) { // TODO } @@ -158,8 +161,8 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon .first { (it as FirPropertySymbol).fromPrimaryConstructor } as FirPropertySymbol val type = firProperty.resolvedReturnType.fullyExpandedType(session) - val symbol = when { - type.isArrayOrPrimitiveArray(checkUnsignedArrays = false) -> context.irBuiltIns.dataClassArrayMemberHashCodeSymbol + val (symbol, hasDispatchReceiver) = when { + type.isArrayOrPrimitiveArray(checkUnsignedArrays = false) -> context.irBuiltIns.dataClassArrayMemberHashCodeSymbol to false else -> { val classForType = when (val classifier = type.coerceToAny().toSymbol(session)?.fir) { is FirRegularClass -> classifier @@ -168,10 +171,10 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) : Fir2IrCompon } val firHashCode = getHashCodeFunction(classForType) val lookupTag = classForType.symbol.toLookupTag() - declarationStorage.getIrFunctionSymbol(firHashCode, lookupTag) as IrSimpleFunctionSymbol + declarationStorage.getIrFunctionSymbol(firHashCode, lookupTag) as IrSimpleFunctionSymbol to (firHashCode.dispatchReceiverType != null) } } - return Fir2IrHashCodeFunctionInfo(symbol) + return Fir2IrHashCodeFunctionInfo(symbol, hasDispatchReceiver) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DataClassMembersGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DataClassMembersGenerator.kt index c8d78ec51d0..9a0de42c864 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DataClassMembersGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DataClassMembersGenerator.kt @@ -240,7 +240,7 @@ abstract class DataClassMembersGenerator( protected fun IrBuilderWithScope.getHashCodeOf(hashCodeFunctionInfo: HashCodeFunctionInfo, irValue: IrExpression): IrExpression { val hashCodeFunctionSymbol = hashCodeFunctionInfo.symbol - val hasDispatchReceiver = hashCodeFunctionSymbol.hasDispatchReceiver() + val hasDispatchReceiver = hashCodeFunctionInfo.hasDispatchReceiver ?: hashCodeFunctionSymbol.hasDispatchReceiver() return irCall( hashCodeFunctionSymbol, context.irBuiltIns.intType, @@ -263,6 +263,13 @@ abstract class DataClassMembersGenerator( interface HashCodeFunctionInfo { val symbol: IrSimpleFunctionSymbol + + /** + * Implement it if [symbol] may be unbound + */ + val hasDispatchReceiver: Boolean? + get() = null + fun commitSubstituted(irMemberAccessExpression: IrMemberAccessExpression<*>) }