From fa6fc0e3346bfe3e5475e676ae97dc87d26b61b2 Mon Sep 17 00:00:00 2001 From: "Anastasia.Nekrasova" Date: Mon, 15 May 2023 14:35:17 +0300 Subject: [PATCH] [IR] Fix local function with default param The key 'localDeclarationsData' is a IrFunction whose symbol owner is 'IrDeclarationOrigin.LOCAL_FUNCTION'. To find the 'localsData', it's required to get the original local IrFunction ('IrDeclarationOrigin.LOCAL_FUNCTION') for the IrFunction with default arguments (IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER). Related to KTIJ-25558 --- .../jvm/lower/FragmentLocalFunctionPatchLowering.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FragmentLocalFunctionPatchLowering.kt b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FragmentLocalFunctionPatchLowering.kt index c05ff50e28b..5d2d8af2f78 100644 --- a/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FragmentLocalFunctionPatchLowering.kt +++ b/compiler/ir/backend.jvm/lower/src/org/jetbrains/kotlin/backend/jvm/lower/FragmentLocalFunctionPatchLowering.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.backend.common.phaser.makeIrFilePhase import org.jetbrains.kotlin.backend.jvm.JvmBackendContext import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder import org.jetbrains.kotlin.backend.jvm.localDeclarationsPhase -import org.jetbrains.kotlin.backend.jvm.lower.FragmentSharedVariablesLowering.Companion.GENERATED_FUNCTION_NAME import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter import org.jetbrains.kotlin.ir.builders.irCall @@ -58,7 +57,11 @@ internal class FragmentLocalFunctionPatchLowering( declaration.body?.transformChildrenVoid(object : IrElementTransformerVoidWithContext() { override fun visitCall(expression: IrCall): IrExpression { expression.transformChildrenVoid(this) - val localsData = localDeclarationsData[expression.symbol.owner] ?: return super.visitCall(expression) + val localDeclarationsDataKey = when (expression.symbol.owner.origin) { + is IrDeclarationOrigin.FUNCTION_FOR_DEFAULT_PARAMETER -> context.mapping.defaultArgumentsOriginalFunction[expression.symbol.owner] + else -> expression.symbol.owner + } + val localsData = localDeclarationsData[localDeclarationsDataKey] ?: return super.visitCall(expression) val remappedTarget: LocalDeclarationsLowering.LocalFunctionContext = localsData.localContext val irBuilder = context.createJvmIrBuilder(declaration.symbol)