[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
This commit is contained in:
committed by
Space Team
parent
993acad3f3
commit
fa6fc0e334
+5
-2
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user