From 7c278bfbabd186e1b696222d904052a2b52688e3 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Mon, 28 May 2018 17:40:28 +0300 Subject: [PATCH] New J2K: Extract base from concrete implementations --- .../jetbrains/kotlin/j2k/tree/impl/base.kt | 98 +++++++++++++++++++ .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 86 ---------------- 2 files changed, 98 insertions(+), 86 deletions(-) create mode 100644 j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt new file mode 100644 index 00000000000..24a6a0c23c8 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt @@ -0,0 +1,98 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.j2k.tree.impl + +import org.jetbrains.kotlin.j2k.tree.JKBranchElement +import org.jetbrains.kotlin.j2k.tree.JKElement +import org.jetbrains.kotlin.j2k.tree.JKTreeElement +import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + + +private 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: JKBranchElementBase, property: KProperty<*>, value: T) { + (thisRef.children[this.value] as T).detach(thisRef) + thisRef.children[this.value] = value + value.attach(thisRef) + } +} + +private class JKListChild(val value: Int) : ReadWriteProperty> { + override operator fun getValue(thisRef: JKBranchElementBase, property: KProperty<*>): List { + return thisRef.children[value] as List + } + + override operator fun setValue(thisRef: JKBranchElementBase, property: KProperty<*>, value: List) { + (thisRef.children[this.value] as List).forEach { it.detach(thisRef) } + thisRef.children[this.value] = value + value.forEach { it.attach(thisRef) } + } +} + +abstract class JKElementBase : JKTreeElement { + override var parent: JKElement? = null + + final override fun detach(from: JKElement) { + 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.visitTreeElement(this, data) + + override fun acceptChildren(visitor: JKVisitor, data: D) {} +} + +abstract class JKBranchElementBase : JKElementBase(), JKBranchElement { + private var childNum = 0 + protected fun child(v: U): ReadWriteProperty { + children.add(childNum, v) + v.attach(this) + return JKChild(childNum++) + } + + + protected inline fun children(): ReadWriteProperty> { + return children(emptyList()) + } + + protected fun children(v: List): ReadWriteProperty> { + children.add(childNum, v) + v.forEach { it.attach(this) } + return JKListChild(childNum++) + } + + override fun acceptChildren(visitor: JKVisitor, data: D) { + children.forEach { + if (it is JKTreeElement) + it.accept(visitor, data) + else + (it as? List)?.forEach { it.accept(visitor, data) } + } + } + + override val children: MutableList = mutableListOf() +} 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 cf6e3dab4ef..b7f92e191a2 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -19,92 +19,6 @@ package org.jetbrains.kotlin.j2k.tree.impl import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.tree.* import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -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: JKBranchElementBase, property: KProperty<*>, value: T) { - (thisRef.children[this.value] as T).detach(thisRef) - thisRef.children[this.value] = value - value.attach(thisRef) - } -} - -class JKListChild(val value: Int) : ReadWriteProperty> { - override operator fun getValue(thisRef: JKBranchElementBase, property: KProperty<*>): List { - return thisRef.children[value] as List - } - - override operator fun setValue(thisRef: JKBranchElementBase, property: KProperty<*>, value: List) { - (thisRef.children[this.value] as List).forEach { it.detach(thisRef) } - thisRef.children[this.value] = value - value.forEach { it.attach(thisRef) } - } -} - -abstract class JKElementBase : JKTreeElement { - override var parent: JKElement? = null - - final override fun detach(from: JKElement) { - 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.visitTreeElement(this, data) - - override fun acceptChildren(visitor: JKVisitor, data: D) {} -} - -abstract class JKBranchElementBase : JKElementBase(), JKBranchElement { - protected var childNum = 0 - protected fun child(v: U): ReadWriteProperty { - children.add(childNum, v) - v.attach(this) - return JKChild(childNum++) - } - - protected inline fun children(): ReadWriteProperty> { - children.add(childNum, listOf()) - return JKListChild(childNum++) - } - - protected inline fun children(v: List): ReadWriteProperty> { - children.add(childNum, v) - v.forEach { it.attach(this) } - return JKListChild(childNum++) - } - - override fun acceptChildren(visitor: JKVisitor, data: D) { - children.forEach { - if (it is JKTreeElement) - it.accept(visitor, data) - else - (it as? List)?.forEach { it.accept(visitor, data) } - } - } - - override val children: MutableList = mutableListOf() -} class JKClassImpl(modifierList: JKModifierList, name: JKNameIdentifier, override var classKind: JKClass.ClassKind) : JKClass,