Fix initializer lowering crash during deep copy
This commit is contained in:
@@ -31,10 +31,10 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||
import org.jetbrains.kotlin.ir.visitors.acceptVoid
|
||||
import java.util.*
|
||||
|
||||
inline fun <reified T : IrElement> T.deepCopyWithSymbols(): T {
|
||||
inline fun <reified T : IrElement> 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
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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 : IrElement> T.patchDeclarationParents() =
|
||||
fun <T : IrElement> 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<IrDeclarationParent>()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user