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 dbb23ff45f0..9f6e664dca2 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -16,44 +16,59 @@ package org.jetbrains.kotlin.j2k.tree.impl +import com.intellij.psi.PsiElement import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor -import com.intellij.psi.PsiElement import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty -private class JKChild(val value: Int) : ReadWriteProperty { - override operator fun getValue(thisRef: JKMutableBranchElement, property: KProperty<*>): T { +class JKChild(val value: Int) : ReadWriteProperty { + override operator fun getValue(thisRef: JKBranchElementBase, property: KProperty<*>): T { return thisRef.children[value] as T } - override operator fun setValue(thisRef: JKMutableBranchElement, property: KProperty<*>, value: T) { - thisRef.children[this.value].parent = null - value.parent = thisRef + override operator fun setValue(thisRef: JKBranchElementBase, property: KProperty<*>, value: T) { + (thisRef.children[this.value] as T).detach() + value.attach(thisRef) thisRef.children[this.value] = value } } -class JKListChild() : ReadWriteProperty> { - override operator fun getValue(thisRef: JKMutableBranchElement, property: KProperty<*>): List { +class JKListChild(val value: Int) : ReadWriteProperty> { + override operator fun getValue(thisRef: JKBranchElementBase, property: KProperty<*>): List { return thisRef.children.toList() as List } - override operator fun setValue(thisRef: JKMutableBranchElement, property: KProperty<*>, value: List) { - thisRef.children.forEach { it.parent = null } - value.forEach { it.parent = thisRef } - thisRef.children.clear() - thisRef.children.addAll(value) + override operator fun setValue(thisRef: JKBranchElementBase, property: KProperty<*>, value: List) { + (thisRef.children[this.value] as List).forEach { it.detach() } + value.forEach { it.attach(thisRef) } + thisRef.children[this.value] = value } } abstract class JKElementBase : JKTreeElement { override var parent: JKElement? = null - fun D.setParent(p: JKTreeElement): D { - parent = p - return this + final override fun detach() { + val prevParent = parent + assert(prevParent != null) + parent = null + onDetach(prevParent!!) + } + + open fun onDetach(from: JKElement) { + + } + + final override fun attach(to: JKElement) { + assert(parent == null) + parent = to + onAttach() + } + + open fun onAttach() { + } override fun accept(visitor: JKVisitor, data: D): R = visitor.visitElement(this, data) @@ -61,46 +76,35 @@ abstract class JKElementBase : JKTreeElement { override fun acceptChildren(visitor: JKVisitor, data: D) {} } -interface JKMutableBranchElement : JKBranchElement { - override val children: MutableList -} - -abstract class JKBranchElementBase : JKElementBase(), JKMutableBranchElement { - override fun acceptChildren(visitor: JKVisitor, data: D) { - children.forEach { it.accept(visitor, data) } - } - +abstract class JKBranchElementBase : JKElementBase(), JKBranchElement { protected var childNum = 0 - protected fun child(v: U): ReadWriteProperty { + protected fun child(v: U): ReadWriteProperty { children.add(childNum, v) return JKChild(childNum++) } - override val children: MutableList = mutableListOf() -} - -abstract class JKElementListBase: JKElementBase(), JKMutableBranchElement { - override val children: MutableList = mutableListOf() - - protected inline fun children(): JKListChild { - return JKListChild() + protected inline fun child(): ReadWriteProperty> { + children[childNum] = listOf() + return JKListChild(childNum++) } - protected inline fun children(v: List): JKListChild { - children.addAll(v) - return JKListChild() + protected inline fun child(v: List): ReadWriteProperty> { + children[childNum] = v + return JKListChild(childNum++) } override fun acceptChildren(visitor: JKVisitor, data: D) { - children.forEach { it.accept(visitor, data) } + children.forEach { + if (it is JKTreeElement) + it.accept(visitor, data) + else + (it as? List)?.forEach { it.accept(visitor, data) } + } } -} -class JKUDeclarationListImpl : JKElementListBase(), JKUDeclarationList { - override var declarations: List by children() + override val children: MutableList = mutableListOf() } - class JKClassImpl(modifierList: JKModifierList, name: JKNameIdentifier, override var classKind: JKClass.ClassKind) : JKUniverseClass, JKBranchElementBase() { @@ -109,7 +113,7 @@ class JKClassImpl(modifierList: JKModifierList, name: JKNameIdentifier, override override var modifierList by child(modifierList) override val valid: Boolean = true - override val declarationList by child(JKUDeclarationListImpl()) + override var declarationList by child() override fun accept(visitor: JKVisitor, data: D): R = visitor.visitUniverseClass(this, data) } @@ -117,8 +121,8 @@ class JKClassImpl(modifierList: JKModifierList, name: JKNameIdentifier, override class JKNameIdentifierImpl(override val value: String) : JKNameIdentifier, JKElementBase() {} -class JKModifierListImpl(modifiers: List = emptyList()) : JKModifierList, JKElementListBase() { - override var modifiers: List by children(modifiers) +class JKModifierListImpl(modifiers: List = emptyList()) : JKModifierList, JKBranchElementBase() { + override var modifiers: List by child(modifiers) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitModifierList(this, data) } @@ -127,8 +131,8 @@ class JKValueArgumentImpl(type: JKType, override val name: String) : JKValueArgu override fun accept(visitor: JKVisitor, data: D): R = visitor.visitValueArgument(this, data) } -class JKBlockImpl(statements: List = emptyList()) : JKBlock, JKElementListBase() { - override var statements by children(statements) +class JKBlockImpl(statements: List = emptyList()) : JKBlock, JKBranchElementBase() { + override var statements by child(statements) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitBlock(this, data) } @@ -150,8 +154,8 @@ class JKPostfixExpressionImpl(expression: JKExpression, override var operator: J override fun accept(visitor: JKVisitor, data: D): R = visitor.visitPostfixExpression(this, data) } -class JKExpressionListImpl(expressions: List = emptyList()) : JKExpressionList, JKElementListBase() { - override var expressions by children(expressions) +class JKExpressionListImpl(expressions: List = emptyList()) : JKExpressionList, JKBranchElementBase() { + override var expressions by child(expressions) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitExpressionList(this, data) } @@ -187,7 +191,8 @@ class JKParenthesizedExpressionImpl(override var expression: JKExpression) : JKP } -class JKTypeCastExpressionImpl(override var expression: JKExpression, override var type: JKType) : JKTypeCastExpression, JKBranchElementBase() { +class JKTypeCastExpressionImpl(override var expression: JKExpression, override var type: JKType) : JKTypeCastExpression, + JKBranchElementBase() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitTypeCastExpression(this, data) override fun acceptChildren(visitor: JKVisitor, data: D) { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 203d9edc3f7..c24fe9c7e2c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -18,6 +18,8 @@ package org.jetbrains.kotlin.j2k.tree import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty interface JKTreeElement : JKElement { fun accept(visitor: JKVisitor, data: D): R @@ -36,7 +38,7 @@ interface JKUDeclarationList : JKDeclarationList { } interface JKUniverseClass : JKUniverseDeclaration, JKClass { - override val declarationList: JKUDeclarationList + override var declarationList: List } interface JKModifier : JKTreeElement diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt index 98b3bc63a33..2a120b04a2e 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt @@ -16,16 +16,20 @@ package org.jetbrains.kotlin.j2k.tree -interface JKOperator: JKTreeElement +interface JKOperator : JKTreeElement interface JKQualifier interface JKElement { - var parent: JKElement? + val parent: JKElement? + + fun detach() + + fun attach(to: JKElement) } interface JKBranchElement : JKElement { - val children: List + val children: List } interface JKModifierListOwner { @@ -40,7 +44,7 @@ interface JKDeclaration : JKElement, JKReferenceTarget interface JKClass : JKDeclaration, JKModifierListOwner { val name: JKNameIdentifier - val declarationList: JKDeclarationList + val declarationList: List var classKind: ClassKind enum class ClassKind { diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/Abstractions.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/Abstractions.kt index 93ff4de2942..5d52c742470 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/Abstractions.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/Abstractions.kt @@ -14,4 +14,8 @@ * limitations under the License. */ -package org.jetbrains.kotlin.j2k.tree.multiverse \ No newline at end of file +package org.jetbrains.kotlin.j2k.tree.multiverse + +import org.jetbrains.kotlin.j2k.tree.JKDeclaration + +interface JKMultiverseDeclaration : JKDeclaration \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/Implementations.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/Implementations.kt index 25a7ac1f4e2..cdf6476faf3 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/Implementations.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/multiverse/Implementations.kt @@ -29,14 +29,14 @@ abstract class JKMultiverseElementBase : JKElement { } } -class JKMultiverseField(override var name: JKNameIdentifier) : JKField, JKMultiverseElementBase() { +class JKMultiverseField(override var name: JKNameIdentifier) : JKField, JKMultiverseDeclaration, JKMultiverseElementBase() { override var modifierList: JKModifierList = JKModifierListImpl() override var type: JKType = JKJavaPrimitiveTypeImpl.BOOLEAN //TODO override val valid: Boolean get() = true } -class JKMultiverseMethod(override var name: JKNameIdentifier) : JKMethod, JKMultiverseElementBase() { +class JKMultiverseMethod(override var name: JKNameIdentifier) : JKMethod, JKMultiverseDeclaration, JKMultiverseElementBase() { override val returnType: JKType get() = TODO("not implemented") override var modifierList: JKModifierList = JKModifierListImpl() @@ -46,11 +46,9 @@ class JKMultiverseMethod(override var name: JKNameIdentifier) : JKMethod, JKMult } class JKMultiverseClass( - override var name: JKNameIdentifier, override val declarationList: JKMDeclarationList, + override var name: JKNameIdentifier, override val declarationList: List, override var classKind: JKClass.ClassKind, override var modifierList: JKModifierList ) : JKClass, JKMultiverseElementBase() { override val valid: Boolean get() = true -} - -class JKMDeclarationList(override val declarations: List) : JKMultiverseElementBase(), JKDeclarationList \ No newline at end of file +} \ No newline at end of file