diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt index 431823b3708..2133c0d9579 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt @@ -93,7 +93,7 @@ class InitializersLowering( irClass.transformChildrenVoid(object : IrElementTransformerVoid() { override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall): IrExpression { return IrBlockImpl(irClass.startOffset, irClass.endOffset, context.builtIns.unitType, null, - instanceInitializerStatements.map { it.copy() }) + instanceInitializerStatements.map { it.copy(irClass) }) } }) } @@ -114,7 +114,7 @@ class InitializersLowering( irClass.startOffset, irClass.endOffset, declarationOrigin, staticInitializerDescriptor, IrBlockBodyImpl(irClass.startOffset, irClass.endOffset, - staticInitializerStatements.map { it.copy() }) + staticInitializerStatements.map { it.copy(irClass) }) ) ) } @@ -123,7 +123,7 @@ class InitializersLowering( companion object { val clinitName = Name.special("") - fun IrStatement.copy() = deepCopyWithSymbols() - fun IrExpression.copy() = deepCopyWithSymbols() + fun IrStatement.copy(containingDeclaration: IrClass) = deepCopyWithSymbols(containingDeclaration) + fun IrExpression.copy(containingDeclaration: IrClass) = deepCopyWithSymbols(containingDeclaration) } } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt index a99b4cedb7a..b5c4c522a70 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTreeWithSymbols.kt @@ -31,10 +31,10 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import java.util.* -inline fun T.deepCopyWithSymbols(): T { +inline fun T.deepCopyWithSymbols(initialParent: IrDeclarationParent? = null): T { val remapper = DeepCopySymbolsRemapper() acceptVoid(remapper) - return transform(DeepCopyIrTreeWithSymbols(remapper), null).patchDeclarationParents() as T + return transform(DeepCopyIrTreeWithSymbols(remapper), null).patchDeclarationParents(initialParent) as T } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/PatchDeclarationParents.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/PatchDeclarationParents.kt index 81dcb551769..4c667cf34ee 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/PatchDeclarationParents.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/PatchDeclarationParents.kt @@ -9,18 +9,22 @@ import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrPackageFragment -import org.jetbrains.kotlin.ir.declarations.impl.IrDeclarationBase import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import java.util.* -fun T.patchDeclarationParents() = +fun T.patchDeclarationParents(initialParent: IrDeclarationParent? = null) = apply { - acceptVoid(PatchDeclarationParentsVisitor()) + val visitor = initialParent?.let { PatchDeclarationParentsVisitor(it) } ?: PatchDeclarationParentsVisitor() + acceptVoid(visitor) } -class PatchDeclarationParentsVisitor : IrElementVisitorVoid { +class PatchDeclarationParentsVisitor() : IrElementVisitorVoid { + + constructor(containingDeclaration: IrDeclarationParent) : this() { + declarationParentsStack.push(containingDeclaration) + } private val declarationParentsStack = ArrayDeque()