Reduced amount of ResultTransformation implementations

This commit is contained in:
Valentin Kipyatkov
2016-04-21 20:36:19 +03:00
parent a07bbf4aa8
commit 7c473e7159
2 changed files with 19 additions and 51 deletions
@@ -67,6 +67,19 @@ abstract class AssignToVariableResultTransformation(
return initializationStatement
}
companion object {
fun createDelegated(delegate: ResultTransformation, initialization: VariableInitialization): AssignToVariableResultTransformation {
return object: AssignToVariableResultTransformation(delegate.loop, initialization) {
override val presentation: String
get() = delegate.presentation
override fun generateCode(chainedCallGenerator: ChainedCallGenerator): KtExpression {
return delegate.generateCode(chainedCallGenerator)
}
}
}
}
}
class AssignSequenceTransformationResultTransformation(
@@ -206,7 +206,8 @@ class FilterToTransformation private constructor(
): ResultTransformation {
val initialization = targetCollection.detectInitializationBeforeLoop(loop, checkNoOtherUsagesInLoop = true)
if (initialization != null && initialization.initializer.hasNoSideEffect()) {
return AssignFilterToTransformation(loop, inputVariable, initialization, filter)
val transformation = FilterToTransformation(loop, inputVariable, initialization.initializer, filter)
return AssignToVariableResultTransformation.createDelegated(transformation, initialization)
}
else {
return FilterToTransformation(loop, inputVariable, targetCollection, filter)
@@ -215,22 +216,6 @@ class FilterToTransformation private constructor(
}
}
class AssignFilterToTransformation(
loop: KtForExpression,
private val inputVariable: KtCallableDeclaration,
targetCollectionInitialization: VariableInitialization,
private val filter: KtExpression
) : AssignToVariableResultTransformation(loop, targetCollectionInitialization) {
override val presentation: String
get() = "filterTo(){}"
override fun generateCode(chainedCallGenerator: ChainedCallGenerator): KtExpression {
val lambda = generateLambda(inputVariable, filter)
return chainedCallGenerator.generate("filterTo($0) $1:'{}'", initialization.initializer, lambda)
}
}
class MapToTransformation private constructor(
loop: KtForExpression,
private val inputVariable: KtCallableDeclaration,
@@ -255,7 +240,8 @@ class MapToTransformation private constructor(
): ResultTransformation {
val initialization = targetCollection.detectInitializationBeforeLoop(loop, checkNoOtherUsagesInLoop = true)
if (initialization != null && initialization.initializer.hasNoSideEffect()) {
return AssignMapToTransformation(loop, inputVariable, initialization, mapping)
val transformation = MapToTransformation(loop, inputVariable, initialization.initializer, mapping)
return AssignToVariableResultTransformation.createDelegated(transformation, initialization)
}
else {
return MapToTransformation(loop, inputVariable, targetCollection, mapping)
@@ -264,22 +250,6 @@ class MapToTransformation private constructor(
}
}
class AssignMapToTransformation(
loop: KtForExpression,
private val inputVariable: KtCallableDeclaration,
targetCollectionInitialization: VariableInitialization,
private val mapping: KtExpression
) : AssignToVariableResultTransformation(loop, targetCollectionInitialization) {
override val presentation: String
get() = "mapTo(){}"
override fun generateCode(chainedCallGenerator: ChainedCallGenerator): KtExpression {
val lambda = generateLambda(inputVariable, mapping)
return chainedCallGenerator.generate("mapTo($0) $1:'{}'", initialization.initializer, lambda)
}
}
class FlatMapToTransformation private constructor(
loop: KtForExpression,
private val inputVariable: KtCallableDeclaration,
@@ -304,7 +274,8 @@ class FlatMapToTransformation private constructor(
): ResultTransformation {
val initialization = targetCollection.detectInitializationBeforeLoop(loop, checkNoOtherUsagesInLoop = true)
if (initialization != null && initialization.initializer.hasNoSideEffect()) {
return AssignFlatMapToTransformation(loop, inputVariable, initialization, transform)
val transformation = FlatMapToTransformation(loop, inputVariable, initialization.initializer, transform)
return AssignToVariableResultTransformation.createDelegated(transformation, initialization)
}
else {
return FlatMapToTransformation(loop, inputVariable, targetCollection, transform)
@@ -313,22 +284,6 @@ class FlatMapToTransformation private constructor(
}
}
class AssignFlatMapToTransformation(
loop: KtForExpression,
private val inputVariable: KtCallableDeclaration,
targetCollectionInitialization: VariableInitialization,
private val transform: KtExpression
) : AssignToVariableResultTransformation(loop, targetCollectionInitialization) {
override val presentation: String
get() = "flatMapTo(){}"
override fun generateCode(chainedCallGenerator: ChainedCallGenerator): KtExpression {
val lambda = generateLambda(inputVariable, transform)
return chainedCallGenerator.generate("flatMapTo($0) $1:'{}'", initialization.initializer, lambda)
}
}
class AssignToListTransformation(
loop: KtForExpression,
initialization: VariableInitialization