From b7fd8e32cb23e7bbe3888db7d874b4a2da88c74e Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Tue, 29 May 2018 13:19:21 +0300 Subject: [PATCH] New J2K: Introduce invalidate to mark element for removal, freeing it's children --- .../conversions/FieldToPropertyConversion.kt | 1 + .../JavaMethodToKotlinFunctionConversion.kt | 19 +++++++++++------- .../jetbrains/kotlin/j2k/tree/impl/base.kt | 20 +++++++++++++++++-- .../org/jetbrains/kotlin/j2k/tree/impl/j.kt | 4 ---- .../org/jetbrains/kotlin/j2k/tree/impl/jk.kt | 1 - .../org/jetbrains/kotlin/j2k/tree/impl/k.kt | 4 ---- j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt | 4 ++-- .../org/jetbrains/kotlin/j2k/tree/jk.kt | 2 +- .../org/jetbrains/kotlin/j2k/tree/markers.kt | 7 +++---- 9 files changed, 37 insertions(+), 25 deletions(-) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt index 2813be75228..bb3aa0f132f 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/FieldToPropertyConversion.kt @@ -60,6 +60,7 @@ class FieldToPropertyConversion : MatchBasedConversion() { if (field != null) { // TODO: proper accessors + field.invalidate() val property = JKKtPropertyImpl(field.modifierList, field.type, field.name, field.initializer, JKBlockImpl(), JKBlockImpl()) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt index 6104a971f6e..466af28a1b8 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/JavaMethodToKotlinFunctionConversion.kt @@ -31,13 +31,18 @@ class JavaMethodToKotlinFunctionConversion : TransformerBasedConversion() { override fun visitClass(klass: JKClass) { somethingChanged = true klass.declarationList = klass.declarationList.map { - if (it is JKJavaMethod) JKKtFunctionImpl( - JKTypeElementImpl(JKJavaPrimitiveTypeImpl.BOOLEAN), - it.name, - it.valueArguments, - it.block, - it.modifierList - ) else it + if (it is JKJavaMethod) { + it.invalidate() + JKKtFunctionImpl( + JKTypeElementImpl(JKJavaPrimitiveTypeImpl.BOOLEAN), + it.name, + it.valueArguments, + it.block, + it.modifierList + ) + } else { + it + } } } } \ No newline at end of file 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 98a2025f0d3..68ae1d5f7c3 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/base.kt @@ -86,13 +86,29 @@ abstract class JKBranchElementBase : JKElementBase(), JKBranchElement { } final override fun acceptChildren(visitor: JKVisitor, data: D) { + forEachChild { it.accept(visitor, data) } + } + + protected inline fun forEachChild(block: (JKTreeElement) -> Unit) { children.forEach { if (it is JKTreeElement) - it.accept(visitor, data) + block(it) else - (it as? List)?.forEach { it.accept(visitor, data) } + (it as? List)?.forEach { block(it) } } } + + final override var valid: Boolean = true + + final override fun invalidate() { + forEachChild { it.detach(this) } + valid = false + } + + override fun onAttach() { + check(valid) + } + override val children: MutableList = mutableListOf() } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt index 18fc122bc8c..92313001ea6 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/j.kt @@ -26,8 +26,6 @@ class JKJavaFieldImpl( name: JKNameIdentifier, initializer: JKExpression ) : JKJavaField, JKBranchElementBase() { - override val valid: Boolean - get() = true override fun accept(visitor: JKVisitor, data: D): R = visitor.visitJavaField(this, data) @@ -53,8 +51,6 @@ class JKJavaMethodImpl( override var valueArguments: List by children(valueArguments) override var block: JKBlock by child(block) - override val valid: Boolean - get() = true } class JKJavaLiteralExpressionImpl( 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 43f2655afc5..ebbc9e9d0a5 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/jk.kt @@ -31,7 +31,6 @@ class JKClassImpl( override var modifierList by child(modifierList) override var declarationList by children() - override val valid: Boolean = true } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt index 25d55d2110e..53fb958ab6a 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/impl/k.kt @@ -28,8 +28,6 @@ class JKKtPropertyImpl( setter: JKBlock ) : JKBranchElementBase(), JKKtProperty { override fun accept(visitor: JKVisitor, data: D): R = visitor.visitKtProperty(this, data) - override val valid: Boolean - get() = true override var modifierList: JKModifierList by child(modifierList) override var type by child(type) @@ -46,8 +44,6 @@ class JKKtFunctionImpl( block: JKBlock, modifierList: JKModifierList ) : JKBranchElementBase(), JKKtFunction { - override val valid: Boolean - get() = true override var returnType: JKTypeElement by child(returnType) override var name: JKNameIdentifier by child(name) diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt index 8bc1af95663..0edb84676e0 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/j.kt @@ -18,11 +18,11 @@ package org.jetbrains.kotlin.j2k.tree import org.jetbrains.kotlin.j2k.tree.impl.JKMethodSymbol -interface JKJavaField : JKField { +interface JKJavaField : JKField, JKBranchElement { val initializer: JKExpression } -interface JKJavaMethod : JKMethod { +interface JKJavaMethod : JKMethod, JKBranchElement { val block: JKBlock } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt index 01a3fdea156..87c145986ba 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/jk.kt @@ -26,7 +26,7 @@ interface JKTreeElement : JKElement { fun acceptChildren(visitor: JKVisitor, data: D) } -interface JKDeclaration : JKTreeElement, JKReferenceTarget +interface JKDeclaration : JKTreeElement interface JKClass : JKDeclaration, JKModifierListOwner { val name: JKNameIdentifier diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt index acd76fab492..70b1c8987dd 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/tree/markers.kt @@ -34,16 +34,15 @@ interface JKElement { interface JKBranchElement : JKElement { val children: List + + val valid: Boolean + fun invalidate() } interface JKModifierListOwner { var modifierList: JKModifierList } -interface JKReferenceTarget { - val valid: Boolean -} - interface JKType interface JKClassType : JKType {