JVM IR: Fix dispatch receiver type in ResolveInlineCalls

This commit is contained in:
Steven Schäfer
2020-02-03 12:44:04 +01:00
committed by Georgy Bronnikov
parent f46ad10266
commit a4414829bc
@@ -15,8 +15,12 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.expressions.IrCall import org.jetbrains.kotlin.ir.expressions.IrCall
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrTypeOperator
import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCallImpl
import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl
import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom import org.jetbrains.kotlin.ir.util.copyTypeAndValueArgumentsFrom
import org.jetbrains.kotlin.ir.util.defaultType
import org.jetbrains.kotlin.ir.util.parentAsClass
import org.jetbrains.kotlin.ir.util.resolveFakeOverride import org.jetbrains.kotlin.ir.util.resolveFakeOverride
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
@@ -36,18 +40,28 @@ class ResolveInlineCalls(val context: JvmBackendContext) : IrElementTransformerV
val maybeFakeOverrideOfMultiFileBridge = expression.symbol.owner as? IrSimpleFunction val maybeFakeOverrideOfMultiFileBridge = expression.symbol.owner as? IrSimpleFunction
?: return super.visitCall(expression) ?: return super.visitCall(expression)
val resolved = val resolved =
maybeFakeOverrideOfMultiFileBridge?.resolveMultiFileFacades() ?: maybeFakeOverrideOfMultiFileBridge.resolveFakeOverride() maybeFakeOverrideOfMultiFileBridge.resolveMultiFileFacades() ?: maybeFakeOverrideOfMultiFileBridge.resolveFakeOverride()
?: return super.visitCall(expression) ?: return super.visitCall(expression)
return super.visitCall(with(expression) { return super.visitCall(with(expression) {
IrCallImpl(startOffset, endOffset, type, resolved.symbol, expression.typeArgumentsCount, null, superQualifierSymbol).apply { IrCallImpl(startOffset, endOffset, type, resolved.symbol, expression.typeArgumentsCount, null, superQualifierSymbol).apply {
copyTypeAndValueArgumentsFrom(expression) copyTypeAndValueArgumentsFrom(expression)
dispatchReceiver?.let { receiver ->
val receiverType = resolved.parentAsClass.defaultType
dispatchReceiver = IrTypeOperatorCallImpl(
receiver.startOffset,
receiver.endOffset,
receiverType,
IrTypeOperator.IMPLICIT_CAST,
receiverType,
receiver
)
}
} }
}) })
} }
private fun IrFunction.resolveMultiFileFacades(): IrFunction? { private fun IrFunction.resolveMultiFileFacades(): IrFunction? =
return if (origin == JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE) { if (origin == JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE) {
context.multifileFacadeMemberToPartMember[this] context.multifileFacadeMemberToPartMember[this]
} else null } else null
}
} }