diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt index 3c976bba8cf..8636945cff2 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt @@ -244,18 +244,22 @@ fun createDelegatingCallWithPlaceholderTypeArguments(existingCall: IrCall, redir valueArgumentsCount = redirectTarget.valueParameters.size, origin = existingCall.origin ).apply { - copyValueArgumentsFrom( - existingCall, - existingCall.symbol.owner, - this.symbol.owner, - receiversAsArguments = true, - argumentsAsReceivers = false - ) - var offset = 0 - existingCall.symbol.owner.parentAsClass.typeParameters.forEach { _ -> - putTypeArgument(offset++, createPlaceholderAnyNType(irBuiltIns)) - } - for (i in 0 until (existingCall.typeArgumentsCount)) { - putTypeArgument(i + offset, existingCall.getTypeArgument(i)) - } - } \ No newline at end of file + copyFromWithPlaceholderTypeArguments(existingCall, irBuiltIns) + } + +fun IrFunctionAccessExpression.copyFromWithPlaceholderTypeArguments(existingCall: IrFunctionAccessExpression, irBuiltIns: IrBuiltIns) { + copyValueArgumentsFrom( + existingCall, + existingCall.symbol.owner, + this.symbol.owner, + receiversAsArguments = true, + argumentsAsReceivers = false, + ) + var offset = 0 + existingCall.symbol.owner.parentAsClass.typeParameters.forEach { _ -> + putTypeArgument(offset++, createPlaceholderAnyNType(irBuiltIns)) + } + for (i in 0 until existingCall.typeArgumentsCount) { + putTypeArgument(i + offset, existingCall.getTypeArgument(i)) + } +} diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt index 7974c219e5a..361b194cec8 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/InterfaceLowering.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.backend.common.ir.moveBodyTo import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.JvmLoweredDeclarationOrigin import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface +import org.jetbrains.kotlin.backend.jvm.ir.copyFromWithPlaceholderTypeArguments import org.jetbrains.kotlin.backend.jvm.ir.createDelegatingCallWithPlaceholderTypeArguments import org.jetbrains.kotlin.backend.jvm.ir.createPlaceholderAnyNType import org.jetbrains.kotlin.backend.jvm.ir.hasJvmDefault @@ -264,15 +265,10 @@ internal class InterfaceLowering(val context: JvmBackendContext) : IrElementTran if (newFunction != null) { with(expression) { IrFunctionReferenceImpl( - startOffset, - endOffset, - type, - newFunction.symbol, - typeArgumentsCount, - expression.reflectionTarget, - origin + startOffset, endOffset, type, newFunction.symbol, newFunction.typeParameters.size, newFunction.valueParameters.size, + expression.reflectionTarget, origin ).apply { - copyTypeAndValueArgumentsFrom(expression, receiversAsArguments = true) + copyFromWithPlaceholderTypeArguments(expression, context.irBuiltIns) copyAttributes(expression) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt index 41706b0ba53..6a25197a70a 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt @@ -20,8 +20,7 @@ import org.jetbrains.kotlin.ir.symbols.* interface IrCallableReference : IrMemberAccessExpression -interface IrFunctionReference : IrCallableReference { - override val symbol: IrFunctionSymbol +interface IrFunctionReference : IrCallableReference, IrFunctionAccessExpression { val reflectionTarget: IrFunctionSymbol? } @@ -43,4 +42,4 @@ interface IrLocalDelegatedPropertyReference : IrCallableReference { val delegate: IrVariableSymbol val getter: IrSimpleFunctionSymbol val setter: IrSimpleFunctionSymbol? -} \ No newline at end of file +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index 67a4758eb3b..0b7f4ff974d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl import org.jetbrains.kotlin.ir.expressions.impl.IrTypeOperatorCallImpl import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.types.* -import org.jetbrains.kotlin.ir.types.impl.originalKotlinType import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.SpecialNames import org.jetbrains.kotlin.psi.psiUtil.endOffset @@ -555,35 +554,9 @@ fun IrFunctionAccessExpression.copyTypeAndValueArgumentsFrom( src: IrFunctionAccessExpression, receiversAsArguments: Boolean = false, argumentsAsReceivers: Boolean = false -) = copyTypeAndValueArgumentsFrom( - src, - src.symbol.owner, - symbol.owner, - receiversAsArguments, - argumentsAsReceivers -) - -fun IrFunctionReference.copyTypeAndValueArgumentsFrom( - src: IrFunctionReference, - receiversAsArguments: Boolean = false, - argumentsAsReceivers: Boolean = false -) = copyTypeAndValueArgumentsFrom( - src, - src.symbol.owner, - symbol.owner, - receiversAsArguments, - argumentsAsReceivers -) - -private fun IrMemberAccessExpression.copyTypeAndValueArgumentsFrom( - src: IrMemberAccessExpression, - srcFunction: IrFunction, - destFunction: IrFunction, - receiversAsArguments: Boolean = false, - argumentsAsReceivers: Boolean = false ) { copyTypeArgumentsFrom(src) - copyValueArgumentsFrom(src, srcFunction, destFunction, receiversAsArguments, argumentsAsReceivers) + copyValueArgumentsFrom(src, src.symbol.owner, symbol.owner, receiversAsArguments, argumentsAsReceivers) } fun IrMemberAccessExpression.copyValueArgumentsFrom(