diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index 0dc76f90fb4..5cd3ad60211 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -286,7 +286,6 @@ private val jvmFilePhases = additionalClassAnnotationPhase then typeOperatorLowering then replaceKFunctionInvokeWithFunctionInvokePhase then - resolveInlineCallsPhase then checkLocalNamesWithOldBackendPhase then @@ -302,6 +301,7 @@ val jvmPhases = namedIrModulePhase( fileClassPhase then performByIrFile(lower = jvmFilePhases) then generateMultifileFacadesPhase then + resolveInlineCallsPhase then // should be last transformation removeDeclarationsThatWouldBeInlined then validateIrAfterLowering diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt index 3edaebecefb..b60a6ca6a46 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/ExpressionCodegen.kt @@ -948,14 +948,6 @@ class ExpressionCodegen( } } - private fun IrFunction.resolveMultiFileFacades(): IrFunction { - //TODO: move to ResolveInlineCalls lower (now it's goes before generateMultifileFacadesPhase) - return if (origin == JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE) { - context.multifileFacadeMemberToPartMember[this]?.let { return it } - error("Function from a multi-file facade without the link to the function in the part: ${this.render()}") - } else this - } - private fun getOrCreateCallGenerator( element: IrFunctionAccessExpression, data: BlockInfo, signature: JvmMethodSignature ): IrCallGenerator { @@ -965,7 +957,7 @@ class ExpressionCodegen( return IrCallGenerator.DefaultCallGenerator } - val callee = element.symbol.owner.resolveMultiFileFacades() + val callee = element.symbol.owner val typeArgumentContainer = if (callee is IrConstructor) callee.parentAsClass else callee val typeArguments = if (element.typeArgumentsCount == 0) { diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt index 425d1bb5155..c720bc5d4be 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.backend.jvm.codegen import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import org.jetbrains.kotlin.backend.common.ir.ir2string -import org.jetbrains.kotlin.backend.jvm.lower.MultifileFacadeFileEntry import org.jetbrains.kotlin.codegen.BaseExpressionCodegen import org.jetbrains.kotlin.codegen.ClassBuilder import org.jetbrains.kotlin.codegen.OwnerKind @@ -23,9 +22,6 @@ import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression -import org.jetbrains.kotlin.ir.util.isSuspend -import org.jetbrains.kotlin.ir.util.parentAsClass -import org.jetbrains.kotlin.ir.util.render import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodGenericSignature @@ -95,28 +91,7 @@ class IrSourceCompilerForInline( asmMethod: Method ): SMAPAndMethodNode { assert(callableDescriptor == callee.symbol.descriptor.original) { "Expected $callableDescriptor got ${callee.descriptor.original}" } - val irFunction = getFunctionToInline() - return makeInlineNode(irFunction, FakeClassCodegen(irFunction, codegen.classCodegen), false) - } - - private fun getFunctionToInline(): IrFunction { - val parent = callee.parentAsClass - - if (parent.fileParent.fileEntry is MultifileFacadeFileEntry) { - codegen.context.multifileFacadeMemberToPartMember[callee]?.let { return it } - - if (callee.isSuspend) { - codegen.context.suspendFunctionViewToOriginal[callee]?.let { facadeMemberOriginal -> - codegen.context.multifileFacadeMemberToPartMember[facadeMemberOriginal]?.let { partMemberOriginal -> - return partMemberOriginal.getOrCreateSuspendFunctionViewIfNeeded(codegen.context) - } - } - } - - error("Function from a multi-file facade without the link to the function in the part: ${callee.render()}") - } - - return callee + return makeInlineNode(callee, FakeClassCodegen(callee, codegen.classCodegen), false) } override fun hasFinallyBlocks() = data.hasFinallyBlocks() diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt index 63da35f9445..24dec750212 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/ResolveInlineCalls.kt @@ -6,10 +6,12 @@ package org.jetbrains.kotlin.backend.jvm.lower import org.jetbrains.kotlin.backend.common.FileLoweringPass -import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase +import org.jetbrains.kotlin.backend.common.phaser.makeIrModulePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext +import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.codegen.isInlineFunctionCall 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 @@ -19,7 +21,7 @@ import org.jetbrains.kotlin.ir.util.resolveFakeOverride import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid @Suppress("RemoveExplicitTypeArguments") -internal val resolveInlineCallsPhase = makeIrFilePhase( +internal val resolveInlineCallsPhase = makeIrModulePhase( ::ResolveInlineCalls, name = "ResolveInlineCalls", description = "Statically resolve calls to inline methods to particular implementations" @@ -31,9 +33,10 @@ class ResolveInlineCalls(val context: JvmBackendContext) : IrElementTransformerV override fun visitCall(expression: IrCall): IrExpression { if (!expression.symbol.owner.isInlineFunctionCall(context)) return super.visitCall(expression) - val maybeFakeOverride = expression.symbol.owner as? IrSimpleFunction + val maybeFakeOverrideOfMultiFileBridge = expression.symbol.owner as? IrSimpleFunction ?: return super.visitCall(expression) - val resolved = maybeFakeOverride.resolveFakeOverride() + val resolved = + maybeFakeOverrideOfMultiFileBridge?.resolveMultiFileFacades() ?: maybeFakeOverrideOfMultiFileBridge.resolveFakeOverride() ?: return super.visitCall(expression) return super.visitCall(with(expression) { IrCallImpl(startOffset, endOffset, type, resolved.symbol, expression.typeArgumentsCount, null, superQualifierSymbol).apply { @@ -41,4 +44,10 @@ class ResolveInlineCalls(val context: JvmBackendContext) : IrElementTransformerV } }) } + + private fun IrFunction.resolveMultiFileFacades(): IrFunction? { + return if (origin == JvmLoweredDeclarationOrigin.MULTIFILE_BRIDGE) { + context.multifileFacadeMemberToPartMember[this] + } else null + } }