New J2K: Split conversions into sequential and batch
This commit is contained in:
committed by
Ilya Kirillov
parent
d793769e92
commit
815070013f
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user