New J2K: Split conversions into sequential and batch

This commit is contained in:
Simon Ogorodnik
2018-08-29 21:49:50 +03:00
committed by Ilya Kirillov
parent d793769e92
commit 815070013f
5 changed files with 100 additions and 35 deletions
@@ -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<JKTreeElement>, context: ConversionContext) {
val conversions = createConversions(context)
trees.forEach { tree ->
conversions.forEach { it.runConversion(tree, context) }
}
val conversion = createRootConversion(context)
conversion.runConversion(trees, context)
}
}
@@ -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<JKTreeElement>, context: ConversionContext): Boolean
}
interface SequentialBaseConversion : BatchBaseConversion {
fun runConversion(treeRoot: JKTreeElement, context: ConversionContext): Boolean
override fun runConversion(treeRoots: List<JKTreeElement>, context: ConversionContext): Boolean {
return treeRoots.asSequence().map { runConversion(it, context) }.max() ?: false
}
}
@@ -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>) : BatchBaseConversion {
override fun runConversion(treeRoots: List<JKTreeElement>, context: ConversionContext): Boolean {
return conversions.asSequence().map { it.runConversion(treeRoots, context) }.max() ?: false
}
}
class SequentialPipelineConversion(val conversions: List<SequentialBaseConversion>) : 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<JKTreeElement>, 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<T : BatchBaseConversion> {
val conversions = mutableListOf<T>()
operator fun T.unaryPlus() {
conversions += this
}
}
internal inline fun sequentialPipe(crossinline configure: PipelineConversionBuilder<SequentialBaseConversion>.() -> Unit): SequentialPipelineConversion {
return SequentialPipelineConversion(
PipelineConversionBuilder<SequentialBaseConversion>().apply(configure).conversions
)
}
internal inline fun batchPipe(crossinline configure: PipelineConversionBuilder<BatchBaseConversion>.() -> 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)
}
@@ -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 <T> applyRecursive(element: JKTreeElement, data: T, func: (JKTreeElement, T) -> JKTreeElement): JKTreeElement {
fun <R : JKTreeElement, T> 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 <R : JKTreeElement> applyRecursive(element: R, crossinline func: (JKTreeElement) -> JKTreeElement): R {
return applyRecursive(element, null) { it, _ -> func(it) }
}
@@ -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 {