diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt index 36429327752..376351fcf47 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt @@ -10,19 +10,17 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.ir.isInlineFunctionCall import org.jetbrains.kotlin.backend.jvm.isMultifileBridge +import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction import org.jetbrains.kotlin.ir.expressions.IrCall -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.IrTypeOperatorCallImpl -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.visitors.IrElementTransformerVoid +import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid internal val resolveInlineCallsPhase = makeIrModulePhase( ::ResolveInlineCalls, @@ -30,42 +28,34 @@ internal val resolveInlineCallsPhase = makeIrModulePhase( description = "Statically resolve calls to inline methods to particular implementations" ) -class ResolveInlineCalls(val context: JvmBackendContext) : IrElementTransformerVoid(), FileLoweringPass { - override fun lower(irFile: IrFile) = irFile.transformChildrenVoid() +class ResolveInlineCalls(val context: JvmBackendContext) : IrElementVisitorVoid, FileLoweringPass { + override fun lower(irFile: IrFile) = irFile.acceptChildren(this, null) - override fun visitCall(expression: IrCall): IrExpression { - if (!expression.symbol.owner.isInlineFunctionCall(context)) - return super.visitCall(expression) - val maybeFakeOverrideOfMultiFileBridge = expression.symbol.owner as? IrSimpleFunction - ?: return super.visitCall(expression) + override fun visitElement(element: IrElement) { + element.acceptChildren(this, null) + } + + override fun visitCall(expression: IrCall) { + expression.acceptChildren(this, null) + + if (!expression.symbol.owner.isInlineFunctionCall(context)) return + val maybeFakeOverrideOfMultiFileBridge = expression.symbol.owner as? IrSimpleFunction ?: return val resolved = maybeFakeOverrideOfMultiFileBridge.resolveMultiFileFacadeMember() ?: maybeFakeOverrideOfMultiFileBridge.resolveFakeOverride() - ?: return super.visitCall(expression) - return super.visitCall(with(expression) { - IrCallImpl( - startOffset, - endOffset, - type, - resolved.symbol, - expression.typeArgumentsCount, - expression.valueArgumentsCount, - expression.origin, - superQualifierSymbol - ).apply { - copyTypeAndValueArgumentsFrom(expression) - dispatchReceiver?.let { receiver -> - val receiverType = resolved.parentAsClass.defaultType - dispatchReceiver = IrTypeOperatorCallImpl( - receiver.startOffset, - receiver.endOffset, - receiverType, - IrTypeOperator.IMPLICIT_CAST, - receiverType, - receiver - ) - } - } - }) + ?: return + + expression.symbol = resolved.symbol + expression.dispatchReceiver?.let { receiver -> + val receiverType = resolved.parentAsClass.defaultType + expression.dispatchReceiver = IrTypeOperatorCallImpl( + receiver.startOffset, + receiver.endOffset, + receiverType, + IrTypeOperator.IMPLICIT_CAST, + receiverType, + receiver + ) + } } private fun IrFunction.resolveMultiFileFacadeMember(): IrSimpleFunction? =