From 8083a50017116e8dfb3d33258aadac9380c2f84d Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 22 Jun 2023 13:58:43 +0300 Subject: [PATCH] [FIR2IR] Use FIR symbol instead of IR during conversion of receivers for calls --- .../generators/CallAndReferenceGenerator.kt | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt index 056da5b261a..2e79427cbcf 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/CallAndReferenceGenerator.kt @@ -1117,13 +1117,11 @@ class CallAndReferenceGenerator( ): IrExpression { when (this) { is IrMemberAccessExpression<*> -> { - val ownerFunction = - symbol.owner as? IrFunction - ?: (symbol.owner as? IrProperty)?.getter - if (ownerFunction?.dispatchReceiverParameter != null) { + val resolvedFirSymbol = qualifiedAccess.toResolvedCallableSymbol() + if (resolvedFirSymbol?.dispatchReceiverType != null) { val baseDispatchReceiver = qualifiedAccess.findIrDispatchReceiver(explicitReceiverExpression) dispatchReceiver = - if (!ownerFunction.isMethodOfAny() || baseDispatchReceiver?.type?.classOrNull?.owner?.isInterface != true) { + if (!resolvedFirSymbol.isMethodOfAny() || baseDispatchReceiver?.type?.classOrNull?.owner?.isInterface != true) { baseDispatchReceiver } else { // NB: for FE 1.0, this type cast is added by InterfaceObjectCallsLowering @@ -1139,7 +1137,8 @@ class CallAndReferenceGenerator( ) } } - if (ownerFunction?.extensionReceiverParameter != null) { + // constructors don't have extension receiver but may have receiver parameter in case of inner classes + if (resolvedFirSymbol?.receiverParameter != null && resolvedFirSymbol !is FirConstructorSymbol) { extensionReceiver = qualifiedAccess.findIrExtensionReceiver(explicitReceiverExpression)?.let { val symbol = qualifiedAccess.calleeReference.toResolvedCallableSymbol() ?: error("Symbol for call ${qualifiedAccess.render()} not found") @@ -1166,6 +1165,16 @@ class CallAndReferenceGenerator( return this } + private fun FirCallableSymbol<*>.isMethodOfAny(): Boolean { + if (this !is FirNamedFunctionSymbol) return false + if (receiverParameter != null) return false + return when (name) { + OperatorNameConventions.HASH_CODE, OperatorNameConventions.TO_STRING -> valueParameterSymbols.isEmpty() + OperatorNameConventions.EQUALS -> valueParameterSymbols.singleOrNull()?.resolvedReturnType?.isNullableAny == true + else -> false + } + } + private fun generateErrorCallExpression( startOffset: Int, endOffset: Int,