diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt index 86769ee05bb..92e1cb9b711 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/ConversionsRunner.kt @@ -21,34 +21,33 @@ import org.jetbrains.kotlin.j2k.tree.JKTreeElement object ConversionsRunner { - private fun createConversions(context: ConversionContext) = listOf( - ModalityConversion(context), - ImplicitInitializerConversion(), - DefaultArgumentsConversion(context), - TypeMappingConversion(context), - FieldToPropertyConversion(), - PrintlnConversion(context), - BlockToRunConversion(context), - AssignmentAsExpressionToAlsoConversion(context), - AssignmentStatementValCreationConversion(context), - AssignmentStatementOperatorConversion(), - ConstructorConversion(context), - PrimaryConstructorDetectConversion(context), - JavaMethodToKotlinFunctionConversion(), - LiteralConversion(), - InnerClassConversion(), - ModifiersConversion(context), - StaticsToCompanionExtractConversion(), - ClassToObjectPromotionConversion(), - PolyadicExpressionConversion(), - BinaryExpressionConversion() - ) + private fun createRootConversion(context: ConversionContext) = + batchPipe { + +ModalityConversion(context) + +ImplicitInitializerConversion() + +DefaultArgumentsConversion(context) + +TypeMappingConversion(context) + +FieldToPropertyConversion() + +PrintlnConversion(context) + +BlockToRunConversion(context) + +AssignmentAsExpressionToAlsoConversion(context) + +AssignmentStatementValCreationConversion(context) + +AssignmentStatementOperatorConversion() + +ConstructorConversion(context) + +PrimaryConstructorDetectConversion(context) + +JavaMethodToKotlinFunctionConversion() + +LiteralConversion() + +InnerClassConversion() + +ModifiersConversion(context) + +StaticsToCompanionExtractConversion() + +ClassToObjectPromotionConversion() + +PolyadicExpressionConversion() + +BinaryExpressionConversion() + } fun doApply(trees: List, context: ConversionContext) { - val conversions = createConversions(context) - trees.forEach { tree -> - conversions.forEach { it.runConversion(tree, context) } - } + val conversion = createRootConversion(context) + conversion.runConversion(trees, context) } } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BaseConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BaseConversion.kt index e7697887878..a4bae1b9cf6 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BaseConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/BaseConversion.kt @@ -19,10 +19,14 @@ package org.jetbrains.kotlin.j2k.conversions import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.tree.JKTreeElement -abstract class BaseConversion { - /** - * @return true if something changed - */ - abstract fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean +interface BatchBaseConversion { + fun runConversion(treeRoots: List, context: ConversionContext): Boolean +} +interface SequentialBaseConversion : BatchBaseConversion { + fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean + + override fun runConversion(treeRoots: List, context: ConversionContext): Boolean { + return treeRoots.asSequence().map { runConversion(it, context) }.max() ?: false + } } \ No newline at end of file diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/CompositeConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/CompositeConversion.kt new file mode 100644 index 00000000000..30db324e473 --- /dev/null +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/CompositeConversion.kt @@ -0,0 +1,62 @@ +/* + * 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.conversions + +import org.jetbrains.kotlin.j2k.ConversionContext +import org.jetbrains.kotlin.j2k.tree.JKTreeElement + +class BatchPipelineConversion(val conversions: List) : BatchBaseConversion { + override fun runConversion(treeRoots: List, context: ConversionContext): Boolean { + return conversions.asSequence().map { it.runConversion(treeRoots, context) }.max() ?: false + } +} + +class SequentialPipelineConversion(val conversions: List) : SequentialBaseConversion { + override fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean { + return conversions.asSequence().map { it.runConversion(treeRoot, context) }.max() ?: false + } +} + +class BatchRepeatConversion(val conversion: BatchBaseConversion) : BatchBaseConversion { + + override fun runConversion(treeRoots: List, context: ConversionContext): Boolean { + return true in generateSequence { conversion.runConversion(treeRoots, context) }.takeWhile { it } + } + +} + +class SequentialRepeatConversion(val conversion: SequentialBaseConversion) : SequentialBaseConversion { + override fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean { + return true in generateSequence { conversion.runConversion(treeRoot, context) }.takeWhile { it } + } + +} + + +class PipelineConversionBuilder { + val conversions = mutableListOf() + operator fun T.unaryPlus() { + conversions += this + } +} + +internal inline fun sequentialPipe(crossinline configure: PipelineConversionBuilder.() -> Unit): SequentialPipelineConversion { + return SequentialPipelineConversion( + PipelineConversionBuilder().apply(configure).conversions + ) +} + +internal inline fun batchPipe(crossinline configure: PipelineConversionBuilder.() -> Unit): BatchPipelineConversion { + return BatchPipelineConversion( + PipelineConversionBuilder().apply(configure).conversions + ) +} +internal inline fun batchRepeat(batchBaseConversion: BatchBaseConversion): BatchRepeatConversion { + return BatchRepeatConversion(batchBaseConversion) +} +internal inline fun sequentialRepeat(sequentialBaseConversion: SequentialBaseConversion): SequentialRepeatConversion { + return SequentialRepeatConversion(sequentialBaseConversion) +} diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/MatchBasedConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/MatchBasedConversion.kt index 6bd340f4bfc..666f671c7f2 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/MatchBasedConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/MatchBasedConversion.kt @@ -8,9 +8,9 @@ package org.jetbrains.kotlin.j2k.conversions import org.jetbrains.kotlin.j2k.tree.JKTreeElement import org.jetbrains.kotlin.j2k.tree.impl.JKBranchElementBase -abstract class MatchBasedConversion : BaseConversion() { +abstract class MatchBasedConversion : SequentialBaseConversion { - fun applyRecursive(element: JKTreeElement, data: T, func: (JKTreeElement, T) -> JKTreeElement): JKTreeElement { + fun applyRecursive(element: R, data: T, func: (JKTreeElement, T) -> JKTreeElement): R { if (element is JKBranchElementBase) { val iter = element.children.listIterator() while (iter.hasNext()) { @@ -34,7 +34,7 @@ abstract class MatchBasedConversion : BaseConversion() { return element } - inline fun applyRecursive(element: JKTreeElement, crossinline func: (JKTreeElement) -> JKTreeElement): JKTreeElement { + inline fun applyRecursive(element: R, crossinline func: (JKTreeElement) -> JKTreeElement): R { return applyRecursive(element, null) { it, _ -> func(it) } } diff --git a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TransformerBasedConversion.kt b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TransformerBasedConversion.kt index 08e6bcaaf36..b75d07b8f74 100644 --- a/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TransformerBasedConversion.kt +++ b/j2k/newSrc/org/jetbrains/kotlin/j2k/conversions/TransformerBasedConversion.kt @@ -20,7 +20,7 @@ import org.jetbrains.kotlin.j2k.ConversionContext import org.jetbrains.kotlin.j2k.tree.JKTreeElement import org.jetbrains.kotlin.j2k.tree.visitors.JKVisitorVoid -abstract class TransformerBasedConversion : BaseConversion(), JKVisitorVoid { +abstract class TransformerBasedConversion : SequentialBaseConversion, JKVisitorVoid { protected var somethingChanged = false override fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean {