From 3aeffe25eea199cfc46760c7068433284b8e8709 Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 8 May 2018 18:12:44 +0300 Subject: [PATCH] New J2K: Try another approach to tree structure --- .../JavaFieldToKotlinPropertyConversion.kt | 4 +- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 138 +++++++++--------- .../org/jetbrains/kotlin/j2k/tree/jk.kt | 8 +- .../org/jetbrains/kotlin/j2k/tree/markers.kt | 8 +- 4 files changed, 86 insertions(+), 72 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt index 1b0f9da5570..d9a6f71555c 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaFieldToKotlinPropertyConversion.kt @@ -32,7 +32,7 @@ class JavaFieldToKotlinPropertyConversion : TransformerBasedConversion() { override fun visitUniverseClass(universeClass: JKUniverseClass) { somethingChanged = true - universeClass.declarations = universeClass.declarations.map { + universeClass.declarationList.declarations = universeClass.declarationList.declarations.map { if (it is JKJavaField) JKKtPropertyImpl( it.modifierList, it.type, @@ -52,7 +52,7 @@ class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() { override fun visitUniverseClass(universeClass: JKUniverseClass) { somethingChanged = true - universeClass.declarations = universeClass.declarations.map { + universeClass.declarationList.declarations = universeClass.declarationList.declarations.map { if (it is JKJavaMethod) JKKtFunctionImpl( JKJavaPrimitiveTypeImpl.BOOLEAN, it.name, 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 385e2679aaa..1bad6498133 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -23,27 +23,28 @@ import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitor import kotlin.properties.ReadWriteProperty import kotlin.reflect.KProperty -class JKChild(var value: T) : ReadWriteProperty { - override operator fun getValue(thisRef: JKTreeElement, property: KProperty<*>): T { - return value +private class JKChild(val value: Int) : ReadWriteProperty { + override operator fun getValue(thisRef: JKMutableBranchElement, property: KProperty<*>): T { + return thisRef.children[value] as T } - override operator fun setValue(thisRef: JKTreeElement, property: KProperty<*>, value: T) { - this.value.parent = null + override operator fun setValue(thisRef: JKMutableBranchElement, property: KProperty<*>, value: T) { + thisRef.children[this.value].parent = null value.parent = thisRef - this.value = value + thisRef.children[this.value] = value } } -class JKListChild(var value: List) : ReadWriteProperty> { - override operator fun getValue(thisRef: JKTreeElement, property: KProperty<*>): List { - return value +class JKListChild() : ReadWriteProperty> { + override operator fun getValue(thisRef: JKMutableBranchElement, property: KProperty<*>): List { + return thisRef.children.toList() as List } - override operator fun setValue(thisRef: JKTreeElement, property: KProperty<*>, value: List) { - this.value.forEach { it.parent = null } + override operator fun setValue(thisRef: JKMutableBranchElement, property: KProperty<*>, value: List) { + thisRef.children.forEach { it.parent = null } value.forEach { it.parent = thisRef } - this.value = value + thisRef.children.clear() + thisRef.children.addAll(value as List) } } @@ -60,85 +61,93 @@ abstract class JKElementBase : JKElement { override fun acceptChildren(visitor: JKVisitor, data: D) {} } +interface JKMutableBranchElement : JKBranchElement { + override val children: MutableList +} -class JKClassImpl(modifierList: JKModifierList, override val name: JKNameIdentifier, override var classKind: JKClass.ClassKind) : +abstract class JKBranchElementBase : JKElementBase(), JKMutableBranchElement { + override fun acceptChildren(visitor: JKVisitor, data: D) { + children.forEach { it.accept(visitor, data) } + } + + protected var childNum = 0 + protected fun child(v: U): ReadWriteProperty { + 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 children(v: List): JKListChild { + children.addAll(v) + return JKListChild() + } +} + +class JKDeclarationListImpl : JKElementListBase(), JKDeclarationList { + override var declarations: List by children() +} + + +class JKClassImpl(modifierList: JKModifierList, name: JKNameIdentifier, override var classKind: JKClass.ClassKind) : JKUniverseClass, - JKElementBase() { - override var modifierList by JKChild(modifierList) + JKBranchElementBase() { + + override val name by child(name) + override var modifierList by child(modifierList) override val valid: Boolean = true - override var declarations by JKListChild(emptyList()) + override val declarationList by child(JKDeclarationListImpl()) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitUniverseClass(this, data) - - override fun acceptChildren(visitor: JKVisitor, data: D) { - modifierList.accept(visitor, data) - name.accept(visitor, data) - declarations.forEach { it.accept(visitor, data) } - } } -class JKNameIdentifierImpl(override val name: String) : JKNameIdentifier, JKElementBase() { - override fun accept(visitor: JKVisitor, data: D): R = visitor.visitNameIdentifier(this, data) -} - -class JKModifierListImpl(modifiers: List = emptyList()) : JKModifierList, JKElementBase() { - override var modifiers by JKListChild(modifiers) +class JKNameIdentifierImpl(override val name: String) : JKNameIdentifier, JKElementBase() {} +class JKModifierListImpl(modifiers: List = emptyList()) : JKModifierList, JKElementListBase() { + override var modifiers: List by children(modifiers) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitModifierList(this, data) - override fun acceptChildren(visitor: JKVisitor, data: D) { - modifiers.forEach { it.accept(visitor, data) } - } } -class JKValueArgumentImpl(type: JKType, override val name: String) : JKValueArgument, JKElementBase() { - override var type by JKChild(type) +class JKValueArgumentImpl(type: JKType, override val name: String) : JKValueArgument, JKBranchElementBase() { + override var type by child(type) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitValueArgument(this, data) } -class JKBlockImpl(statements: List = emptyList()) : JKBlock, JKElementBase() { - override var statements by JKListChild(statements) +class JKBlockImpl(statements: List = emptyList()) : JKBlock, JKElementListBase() { + override var statements by children(statements) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitBlock(this, data) - override fun acceptChildren(visitor: JKVisitor, data: D) { - statements.forEach { it.accept(visitor, data) } - } } class JKBinaryExpressionImpl(left: JKExpression, right: JKExpression, override var operator: JKOperator) : JKBinaryExpression, - JKElementBase() { - override var right by JKChild(right) - override var left by JKChild(left) + JKBranchElementBase() { + override var right by child(right) + override var left by child(left) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitBinaryExpression(this, data) - override fun acceptChildren(visitor: JKVisitor, data: D) { - left.accept(visitor, data) - right.accept(visitor, data) - } } -class JKPrefixExpressionImpl(expression: JKExpression, override var operator: JKOperator) : JKPrefixExpression, JKElementBase() { - override var expression by JKChild(expression) +class JKPrefixExpressionImpl(expression: JKExpression, operator: JKOperator) : JKPrefixExpression, JKBranchElementBase() { + override var operator by child(operator) + override var expression by child(expression) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitPrefixExpression(this, data) - override fun acceptChildren(visitor: JKVisitor, data: D) { - expression.accept(visitor, data) - } } -class JKPostfixExpressionImpl(expression: JKExpression, override var operator: JKOperator) : JKPostfixExpression, JKElementBase() { - override var expression by JKChild(expression) +class JKPostfixExpressionImpl(expression: JKExpression, override var operator: JKOperator) : JKPostfixExpression, JKBranchElementBase() { + override var expression by child(expression) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitPostfixExpression(this, data) - override fun acceptChildren(visitor: JKVisitor, data: D) { - expression.accept(visitor, data) - } } -class JKExpressionListImpl(expressions: List = emptyList()) : JKExpressionList, JKElementBase() { - override var expressions by JKListChild(expressions) +class JKExpressionListImpl(expressions: MutableList = mutableListOf()) : JKExpressionList, JKElementListBase() { + override var expressions by children(expressions) override fun accept(visitor: JKVisitor, data: D): R = visitor.visitExpressionList(this, data) - - override fun acceptChildren(visitor: JKVisitor, data: D) { - expressions.forEach { it.accept(visitor, data) } - } } class JKQualifiedExpressionImpl( @@ -168,15 +177,12 @@ class JKArrayAccessExpressionImpl(override var expression: JKExpression, overrid } } -class JKParenthesizedExpressionImpl(override var expression: JKExpression) : JKParenthesizedExpression, JKElementBase() { +class JKParenthesizedExpressionImpl(override var expression: JKExpression) : JKParenthesizedExpression, JKBranchElementBase() { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitParenthesizedExpression(this, data) - override fun acceptChildren(visitor: JKVisitor, data: D) { - expression.accept(visitor, data) - } } -class JKTypeCastExpressionImpl(override var expression: JKExpression, override var type: JKType) : JKTypeCastExpression, JKElementBase() { +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 e69dfceac59..b743a47b7f1 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -27,13 +27,17 @@ interface JKElement : JKTreeElement { interface JKUniverseDeclaration : JKElement, JKDeclaration +interface JKDeclarationList : JKTreeElement { + var declarations: List +} + interface JKUniverseClass : JKUniverseDeclaration, JKClass { - override var declarations: List + override val declarationList: JKDeclarationList } interface JKModifier : JKElement -interface JKModifierList : JKElement { +interface JKModifierList : JKBranchElement, JKElement { var modifiers: List } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt index 193d31ded1b..2298811e36f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.j2k.tree -interface JKOperator +interface JKOperator: JKElement interface JKQualifier @@ -24,6 +24,10 @@ interface JKTreeElement { var parent: JKTreeElement? } +interface JKBranchElement : JKTreeElement { + val children: List +} + interface JKModifierListOwner { var modifierList: JKModifierList } @@ -36,7 +40,7 @@ interface JKDeclaration : JKTreeElement, JKReferenceTarget interface JKClass : JKDeclaration, JKModifierListOwner { val name: JKNameIdentifier - val declarations: List + val declarationList: JKDeclarationList var classKind: ClassKind enum class ClassKind {