diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/TreeCopy.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/TreeCopy.kt index ff359a3a86c..a307a2911f1 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/TreeCopy.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/TreeCopy.kt @@ -5,16 +5,12 @@ package org.jetbrains.kotlin.j2k -import org.jetbrains.kotlin.j2k.tree.JKArrayAccessExpression import org.jetbrains.kotlin.j2k.tree.JKElement -import org.jetbrains.kotlin.j2k.tree.JKFieldAccessExpression -import org.jetbrains.kotlin.j2k.tree.impl.JKArrayAccessExpressionImpl -import org.jetbrains.kotlin.j2k.tree.impl.JKFieldAccessExpressionImpl +import org.jetbrains.kotlin.j2k.tree.impl.JKElementBase -fun T.copyTree(): T { - return when (this) { - is JKFieldAccessExpression -> JKFieldAccessExpressionImpl(identifier) - is JKArrayAccessExpression -> JKArrayAccessExpressionImpl(expression.copyTree(), indexExpression.copyTree()) - else -> TODO("Not supported ${this::class}") - } as T -} \ No newline at end of file +fun T.copyTree(): T = + when (this) { + is JKElementBase -> + this.copy() as T + else -> TODO("Not supported+$this.toString()") + } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt index 68ae1d5f7c3..fdc16f38993 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt @@ -37,7 +37,7 @@ private class JKListChild(val value: Int) : ReadWriteProperty accept(visitor: JKVisitor, data: D): R = visitor.visitTreeElement(this, data) override fun acceptChildren(visitor: JKVisitor, data: D) {} + + override fun copy(): JKTreeElement = + clone() as JKTreeElement } abstract class JKBranchElementBase : JKElementBase(), JKBranchElement { @@ -110,5 +113,35 @@ abstract class JKBranchElementBase : JKElementBase(), JKBranchElement { check(valid) } - override val children: MutableList = mutableListOf() + final override var children: MutableList = mutableListOf() + private set + + override fun copy(): JKTreeElement { + val cloned = super.copy() as JKBranchElementBase + val deepClonedChildren = + cloned.children.map { + when (it) { + is JKElementBase -> it.copy() + is List<*> -> (it as List).map { it.copy() } + else -> error("Tree is corrupted") + } + } + + deepClonedChildren.forEach { child -> + when (child) { + is JKElementBase -> { + child.detach(this) + child.attach(cloned) + } + is List<*> -> (child as List).forEach { + it.detach(this) + it.attach(cloned) + } + } + } + cloned.children = deepClonedChildren.toMutableList() + return cloned + } + + } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt index e4c1a47cd22..0127e9e23ab 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -228,6 +228,8 @@ class JKStubExpressionImpl : JKStubExpression, JKElementBase() { } object JKBodyStub : JKBlock, JKTreeElement { + override fun copy(): JKTreeElement = this + override var statements: List get() = emptyList() set(value) {} diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 5af837e4955..3d58499f603 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -30,6 +30,8 @@ interface JKTreeElement : JKElement { fun acceptChildren(visitor: JKVisitor, data: D) fun acceptChildren(visitor: JKVisitor) = acceptChildren(visitor, null) + + fun copy(): JKTreeElement } interface JKDeclaration : JKTreeElement