diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt index 7474b8c707f..e4679f59cf0 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumClassLowering.kt @@ -287,7 +287,7 @@ internal class EnumClassLowering(val context: Context) : ClassLoweringPass { putValueArgument(0, irInt(it.index)) } val initializer = it.value.initializerExpression!! - initializer.patchDeclarationParents(constructor) + initializer.setDeclarationsParent(constructor) when { initializer is IrConstructorCall -> +initInstanceCall(instance, initializer) diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumConstructorsLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumConstructorsLowering.kt index fdf3a3b19f2..679cc0afabf 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumConstructorsLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/EnumConstructorsLowering.kt @@ -24,10 +24,7 @@ import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrConstructorSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.types.IrType -import org.jetbrains.kotlin.ir.util.dump -import org.jetbrains.kotlin.ir.util.parentAsClass -import org.jetbrains.kotlin.ir.util.patchDeclarationParents -import org.jetbrains.kotlin.ir.util.transformFlat +import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name @@ -103,7 +100,7 @@ internal class EnumConstructorsLowering(val context: Context) : ClassLoweringPas val defaultValue = parameter.defaultValue ?: continue defaultValue.transformChildrenVoid(ParameterMapper(enumConstructor, loweredEnumConstructor, true)) loweredEnumConstructor.valueParameters[parameter.loweredIndex].defaultValue = defaultValue - defaultValue.patchDeclarationParents(loweredEnumConstructor) + defaultValue.setDeclarationsParent(loweredEnumConstructor) } return loweredEnumConstructor @@ -129,7 +126,9 @@ internal class EnumConstructorsLowering(val context: Context) : ClassLoweringPas ).apply { it.bind(this) parent = constructor.parent - body = constructor.body!! // Will be transformed later. + val body = constructor.body!! + this.body = body // Will be transformed later. + body.setDeclarationsParent(this) } } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt index 2e8b68a410a..6add1e754e1 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/ExpectDeclarationsRemoving.kt @@ -14,10 +14,12 @@ import org.jetbrains.kotlin.descriptors.MemberDescriptor import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.util.DeepCopyIrTreeWithSymbols import org.jetbrains.kotlin.ir.util.DeepCopySymbolRemapper import org.jetbrains.kotlin.ir.util.DeepCopyTypeRemapper +import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -77,9 +79,12 @@ internal class ExpectToActualDefaultValueCopier(private val irModule: IrModuleFr return } - function.findActualForExpected().valueParameters[index].defaultValue = defaultValue.also { - it.expression = it.expression.remapExpectValueSymbols() - } + val actualForExpected = function.findActualForExpected() + actualForExpected.valueParameters[index].defaultValue = + IrExpressionBodyImpl( + defaultValue.startOffset, defaultValue.endOffset, + defaultValue.expression.remapExpectValueSymbols().patchDeclarationParents(actualForExpected) + ) } }) } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt index 11a91c8f716..762e32ebc40 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/FunctionInlining.kt @@ -5,12 +5,9 @@ package org.jetbrains.kotlin.backend.konan.lower -import org.jetbrains.kotlin.backend.common.IrElementTransformerVoidWithContext -import org.jetbrains.kotlin.backend.common.ScopeWithIr +import org.jetbrains.kotlin.backend.common.* import org.jetbrains.kotlin.backend.common.ir.createTemporaryVariableWithWrappedDescriptor import org.jetbrains.kotlin.backend.common.ir.Symbols -import org.jetbrains.kotlin.backend.common.isBuiltInIntercepted -import org.jetbrains.kotlin.backend.common.isBuiltInSuspendCoroutineUninterceptedOrReturn import org.jetbrains.kotlin.backend.common.lower.CoroutineIntrinsicLambdaOrigin import org.jetbrains.kotlin.backend.common.lower.createIrBuilder import org.jetbrains.kotlin.backend.konan.Context @@ -56,9 +53,8 @@ internal class FunctionInlining(val context: Context) : IrElementTransformerVoid val actualCallee = getFunctionDeclaration(callee.symbol) - actualCallee.transformChildrenVoid(this) // Process recursive inline. - val parent = allScopes.map { it.irElement }.filterIsInstance().lastOrNull() + val inliner = Inliner(expression, actualCallee, currentScope!!, parent, context) return inliner.inline() } @@ -107,7 +103,7 @@ internal class FunctionInlining(val context: Context) : IrElementTransformerVoid val substituteMap = mutableMapOf() - fun inline() = inlineFunction(callSite, callee) + fun inline() = inlineFunction(callSite, callee, true) /** * TODO: JVM inliner crashed on attempt inline this function from transform.kt with: @@ -120,8 +116,12 @@ internal class FunctionInlining(val context: Context) : IrElementTransformerVoid } } - private fun inlineFunction(callSite: IrFunctionAccessExpression, callee: IrFunction): IrReturnableBlock { - val copiedCallee = copyIrElement.copy(callee) as IrFunction + private fun inlineFunction(callSite: IrFunctionAccessExpression, + callee: IrFunction, + performRecursiveInline: Boolean): IrReturnableBlock { + val copiedCallee = if (performRecursiveInline) + visitElement(copyIrElement.copy(callee)) as IrFunction + else copyIrElement.copy(callee) as IrFunction val evaluationStatements = evaluateArguments(callSite, copiedCallee) val statements = (copiedCallee.body as IrBlockBody).statements @@ -194,6 +194,7 @@ internal class FunctionInlining(val context: Context) : IrElementTransformerVoid return expression } }) + patchDeclarationParents(parent) // TODO: Why it is not enough to just run SetDeclarationsParentVisitor? } } @@ -263,7 +264,7 @@ internal class FunctionInlining(val context: Context) : IrElementTransformerVoid return super.visitCall(expression) val functionDeclaration = functionArgument.statements[0] as IrFunction - val newExpression = inlineFunction(expression, functionDeclaration) // Inline the lambda. Lambda parameters will be substituted with lambda arguments. + val newExpression = inlineFunction(expression, functionDeclaration, false) // Inline the lambda. Lambda parameters will be substituted with lambda arguments. return newExpression.transform(this, null) // Substitute lambda arguments with target function arguments. } diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InitializersLowering.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InitializersLowering.kt index e3c00165fbc..cfc5f0671ae 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InitializersLowering.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/InitializersLowering.kt @@ -132,7 +132,7 @@ internal class InitializersLowering(val context: CommonBackendContext) : ClassLo return expression } }) - initializer.patchDeclarationParents(initializeFun) + initializer.setDeclarationsParent(initializeFun) } return initializeFun.symbol @@ -166,7 +166,7 @@ internal class InitializersLowering(val context: CommonBackendContext) : ClassLo if (initializeMethodSymbol == null) { assert(declaration.isPrimary) for (initializer in initializers) - initializer.patchDeclarationParents(declaration) + initializer.setDeclarationsParent(declaration) initializers } else { val startOffset = it.startOffset diff --git a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt index d5b9dae5aa9..e35d06c0549 100644 --- a/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt +++ b/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/ir/util/IrUtils2.kt @@ -75,6 +75,8 @@ internal fun IrFile.addTopLevelInitializer(expression: IrExpression, context: Ko ).apply { descriptor.bind(this) + expression.setDeclarationsParent(this) + if (threadLocal) annotations += buildSimpleAnnotation(context.irBuiltIns, startOffset, endOffset, context.ir.symbols.threadLocal.owner) @@ -315,6 +317,7 @@ fun IrBuilderWithScope.irCatch(type: IrType) = false ).apply { descriptor.bind(this) + parent = this@irCatch.parent } } )