[FIR2IR] Use FIR symbol instead of IR during conversion of receivers for calls
This commit is contained in:
committed by
Space Team
parent
e66fac3d5f
commit
8083a50017
+15
-6
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user