[FIR2IR] Use FIR symbol instead of IR during conversion of receivers for calls

This commit is contained in:
Dmitriy Novozhilov
2023-06-22 13:58:43 +03:00
committed by Space Team
parent e66fac3d5f
commit 8083a50017
@@ -1117,13 +1117,11 @@ class CallAndReferenceGenerator(
): IrExpression { ): IrExpression {
when (this) { when (this) {
is IrMemberAccessExpression<*> -> { is IrMemberAccessExpression<*> -> {
val ownerFunction = val resolvedFirSymbol = qualifiedAccess.toResolvedCallableSymbol()
symbol.owner as? IrFunction if (resolvedFirSymbol?.dispatchReceiverType != null) {
?: (symbol.owner as? IrProperty)?.getter
if (ownerFunction?.dispatchReceiverParameter != null) {
val baseDispatchReceiver = qualifiedAccess.findIrDispatchReceiver(explicitReceiverExpression) val baseDispatchReceiver = qualifiedAccess.findIrDispatchReceiver(explicitReceiverExpression)
dispatchReceiver = dispatchReceiver =
if (!ownerFunction.isMethodOfAny() || baseDispatchReceiver?.type?.classOrNull?.owner?.isInterface != true) { if (!resolvedFirSymbol.isMethodOfAny() || baseDispatchReceiver?.type?.classOrNull?.owner?.isInterface != true) {
baseDispatchReceiver baseDispatchReceiver
} else { } else {
// NB: for FE 1.0, this type cast is added by InterfaceObjectCallsLowering // 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 { extensionReceiver = qualifiedAccess.findIrExtensionReceiver(explicitReceiverExpression)?.let {
val symbol = qualifiedAccess.calleeReference.toResolvedCallableSymbol() val symbol = qualifiedAccess.calleeReference.toResolvedCallableSymbol()
?: error("Symbol for call ${qualifiedAccess.render()} not found") ?: error("Symbol for call ${qualifiedAccess.render()} not found")
@@ -1166,6 +1165,16 @@ class CallAndReferenceGenerator(
return this 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( private fun generateErrorCallExpression(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,