Transformation not necessary has real input variable

This commit is contained in:
Valentin Kipyatkov
2016-04-20 17:33:30 +03:00
parent e0a7e1dbed
commit 955e1166fd
9 changed files with 41 additions and 54 deletions
@@ -37,7 +37,6 @@ interface ChainedCallGenerator {
* Base interface for recognized transformations of the sequence. Should always be either [SequenceTransformation] or [ResultTransformation]
*/
interface Transformation {
val inputVariable: KtCallableDeclaration
val loop: KtForExpression
val presentation: String
@@ -33,9 +33,9 @@ import org.jetbrains.kotlin.renderer.render
class AddToCollectionTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
private val inputVariable: KtCallableDeclaration,
private val targetCollection: KtExpression
) : ReplaceLoopResultTransformation(loop, inputVariable) {
) : ReplaceLoopResultTransformation(loop) {
override fun mergeWithPrevious(previousTransformation: SequenceTransformation): ResultTransformation? {
return when (previousTransformation) {
@@ -120,7 +120,7 @@ class AddToCollectionTransformation(
when {
canChangeInitializerType(collectionInitialization, KotlinBuiltIns.FQ_NAMES.list, state.outerLoop) -> {
val transformation = if (argumentIsInputVariable) {
AssignToListTransformation(state.outerLoop, state.inputVariable, collectionInitialization)
AssignToListTransformation(state.outerLoop, collectionInitialization)
}
else {
val mapTransformation = MapTransformation(state.outerLoop, state.inputVariable, addOperationArgument)
@@ -131,7 +131,7 @@ class AddToCollectionTransformation(
canChangeInitializerType(collectionInitialization, KotlinBuiltIns.FQ_NAMES.mutableList, state.outerLoop) -> {
if (argumentIsInputVariable) {
val transformation = AssignToMutableListTransformation(state.outerLoop, state.inputVariable, collectionInitialization)
val transformation = AssignToMutableListTransformation(state.outerLoop, collectionInitialization)
return ResultTransformationMatch(transformation)
}
}
@@ -141,11 +141,11 @@ class AddToCollectionTransformation(
CollectionKind.SET -> {
val assignToSetTransformation = when {
canChangeInitializerType(collectionInitialization, KotlinBuiltIns.FQ_NAMES.set, state.outerLoop) -> {
AssignToSetTransformation(state.outerLoop, state.inputVariable/*TODO: it's not correct and it looks like not all transformations should have inputVariable*/, collectionInitialization)
AssignToSetTransformation(state.outerLoop, collectionInitialization)
}
canChangeInitializerType(collectionInitialization, KotlinBuiltIns.FQ_NAMES.mutableSet, state.outerLoop) -> {
AssignToMutableSetTransformation(state.outerLoop, state.inputVariable, collectionInitialization)
AssignToMutableSetTransformation(state.outerLoop, collectionInitialization)
}
else -> return null
@@ -178,10 +178,10 @@ class AddToCollectionTransformation(
class FilterToTransformation private constructor(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
private val inputVariable: KtCallableDeclaration,
private val targetCollection: KtExpression,
private val filter: KtExpression
) : ReplaceLoopResultTransformation(loop, inputVariable) {
) : ReplaceLoopResultTransformation(loop) {
override val presentation: String
get() = "filterTo(){}"
@@ -211,10 +211,10 @@ class FilterToTransformation private constructor(
class AssignFilterToTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
private val inputVariable: KtCallableDeclaration,
targetCollectionInitialization: VariableInitialization,
private val filter: KtExpression
) : AssignToVariableResultTransformation(loop, inputVariable, targetCollectionInitialization) {
) : AssignToVariableResultTransformation(loop, targetCollectionInitialization) {
override val presentation: String
get() = "filterTo(){}"
@@ -227,10 +227,10 @@ class AssignFilterToTransformation(
class MapToTransformation private constructor(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
private val inputVariable: KtCallableDeclaration,
private val targetCollection: KtExpression,
private val mapping: KtExpression
) : ReplaceLoopResultTransformation(loop, inputVariable) {
) : ReplaceLoopResultTransformation(loop) {
override val presentation: String
get() = "mapTo(){}"
@@ -260,10 +260,10 @@ class MapToTransformation private constructor(
class AssignMapToTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
private val inputVariable: KtCallableDeclaration,
targetCollectionInitialization: VariableInitialization,
private val mapping: KtExpression
) : AssignToVariableResultTransformation(loop, inputVariable, targetCollectionInitialization) {
) : AssignToVariableResultTransformation(loop, targetCollectionInitialization) {
override val presentation: String
get() = "mapTo(){}"
@@ -276,10 +276,10 @@ class AssignMapToTransformation(
class FlatMapToTransformation private constructor(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
private val inputVariable: KtCallableDeclaration,
private val targetCollection: KtExpression,
private val transform: KtExpression
) : ReplaceLoopResultTransformation(loop, inputVariable) {
) : ReplaceLoopResultTransformation(loop) {
override val presentation: String
get() = "flatMapTo(){}"
@@ -309,10 +309,10 @@ class FlatMapToTransformation private constructor(
class AssignFlatMapToTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
private val inputVariable: KtCallableDeclaration,
targetCollectionInitialization: VariableInitialization,
private val transform: KtExpression
) : AssignToVariableResultTransformation(loop, inputVariable, targetCollectionInitialization) {
) : AssignToVariableResultTransformation(loop, targetCollectionInitialization) {
override val presentation: String
get() = "flatMapTo(){}"
@@ -325,9 +325,8 @@ class AssignFlatMapToTransformation(
class AssignToListTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
initialization: VariableInitialization
) : AssignToVariableResultTransformation(loop, inputVariable, initialization) {
) : AssignToVariableResultTransformation(loop, initialization) {
override val presentation: String
get() = "toList()"
@@ -344,9 +343,8 @@ class AssignToListTransformation(
class AssignToMutableListTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
initialization: VariableInitialization
) : AssignToVariableResultTransformation(loop, inputVariable, initialization) {
) : AssignToVariableResultTransformation(loop, initialization) {
override val presentation: String
get() = "toMutableList()"
@@ -358,9 +356,8 @@ class AssignToMutableListTransformation(
class AssignToSetTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
initialization: VariableInitialization
) : AssignToVariableResultTransformation(loop, inputVariable, initialization) {
) : AssignToVariableResultTransformation(loop, initialization) {
override val presentation: String
get() = "toSet()"
@@ -372,9 +369,8 @@ class AssignToSetTransformation(
class AssignToMutableSetTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
initialization: VariableInitialization
) : AssignToVariableResultTransformation(loop, inputVariable, initialization) {
) : AssignToVariableResultTransformation(loop, initialization) {
override val presentation: String
get() = "toMutableSet()"
@@ -28,10 +28,10 @@ import org.jetbrains.kotlin.psi.*
class CountTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
private val inputVariable: KtCallableDeclaration,
initialization: VariableInitialization,
private val filter: KtExpression?
) : AssignToVariableResultTransformation(loop, inputVariable, initialization) {
) : AssignToVariableResultTransformation(loop, initialization) {
override fun mergeWithPrevious(previousTransformation: SequenceTransformation): ResultTransformation? {
if (previousTransformation !is FilterTransformation) return null
@@ -22,22 +22,24 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.*
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.sequence.FilterTransformation
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.KtBinaryExpression
import org.jetbrains.kotlin.psi.KtBreakExpression
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtForExpression
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
class FindAndAssignTransformation(
loop: KtForExpression,
inputVariable: KtCallableDeclaration,
private val generator: FindOperatorGenerator,
initialization: VariableInitialization,
private val filter: KtExpression? = null
) : AssignToVariableResultTransformation(loop, inputVariable, initialization) {
) : AssignToVariableResultTransformation(loop, initialization) {
override fun mergeWithPrevious(previousTransformation: SequenceTransformation): ResultTransformation? {
if (previousTransformation !is FilterTransformation) return null
assert(filter == null) { "Should not happen because no 2 consecutive FilterTransformation's possible"}
return FindAndAssignTransformation(loop, previousTransformation.inputVariable, generator, initialization, previousTransformation.effectiveCondition())
return FindAndAssignTransformation(loop, generator, initialization, previousTransformation.effectiveCondition())
}
override val presentation: String
@@ -102,7 +104,7 @@ class FindAndAssignTransformation(
val generator = buildFindOperationGenerator(right, initialization.initializer, state.inputVariable, findFirst) ?: return null
val transformation = FindAndAssignTransformation(state.outerLoop, state.inputVariable, generator, initialization)
val transformation = FindAndAssignTransformation(state.outerLoop, generator, initialization)
return ResultTransformationMatch(transformation)
}
}
@@ -18,7 +18,6 @@ package org.jetbrains.kotlin.idea.intentions.loopToCallChain.result
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.*
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.sequence.FilterTransformation
import org.jetbrains.kotlin.psi.KtCallableDeclaration
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtForExpression
import org.jetbrains.kotlin.psi.KtReturnExpression
@@ -26,7 +25,6 @@ import org.jetbrains.kotlin.psi.psiUtil.PsiChildRange
class FindAndReturnTransformation(
override val loop: KtForExpression,
override val inputVariable: KtCallableDeclaration,
private val generator: FindOperatorGenerator,
private val endReturn: KtReturnExpression,
private val filter: KtExpression? = null
@@ -35,7 +33,7 @@ class FindAndReturnTransformation(
override fun mergeWithPrevious(previousTransformation: SequenceTransformation): ResultTransformation? {
if (previousTransformation !is FilterTransformation) return null
assert(filter == null) { "Should not happen because no 2 consecutive FilterTransformation's possible"}
return FindAndReturnTransformation(loop, previousTransformation.inputVariable, generator, endReturn, previousTransformation.effectiveCondition())
return FindAndReturnTransformation(loop, generator, endReturn, previousTransformation.effectiveCondition())
}
override val commentSavingRange = PsiChildRange(loop.unwrapIfLabeled(), endReturn)
@@ -85,7 +83,7 @@ class FindAndReturnTransformation(
val generator = buildFindOperationGenerator(returnValueInLoop, returnValueAfterLoop, state.inputVariable, findFirst = true) ?: return null
val transformation = FindAndReturnTransformation(state.outerLoop, state.inputVariable, generator, returnAfterLoop)
val transformation = FindAndReturnTransformation(state.outerLoop, generator, returnAfterLoop)
return ResultTransformationMatch(transformation)
}
}
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.psi.psiUtil.blockExpressionsOrSingle
class FilterTransformation(
override val loop: KtForExpression,
override val inputVariable: KtCallableDeclaration,
val inputVariable: KtCallableDeclaration,
val condition: KtExpression,
val isInverse: Boolean
) : SequenceTransformation {
@@ -105,7 +105,7 @@ class FilterTransformation(
) {
val typeRef = effectiveCondition.typeReference
if (typeRef != null) {
return FilterIsInstanceTransformation(loop, inputVariable, typeRef)
return FilterIsInstanceTransformation(loop, typeRef)
}
}
@@ -114,7 +114,7 @@ class FilterTransformation(
&& effectiveCondition.right.isNullExpression()
&& effectiveCondition.left.isSimpleName(inputVariable.nameAsSafeName)
) {
return FilterNotNullTransformation(loop, inputVariable)
return FilterNotNullTransformation(loop)
}
return FilterTransformation(loop, inputVariable, condition, isInverse)
@@ -124,7 +124,6 @@ class FilterTransformation(
class FilterIsInstanceTransformation(
override val loop: KtForExpression,
override val inputVariable: KtCallableDeclaration,
private val type: KtTypeReference
) : SequenceTransformation {
@@ -139,10 +138,7 @@ class FilterIsInstanceTransformation(
}
}
class FilterNotNullTransformation(
override val loop: KtForExpression,
override val inputVariable: KtCallableDeclaration
) : SequenceTransformation {
class FilterNotNullTransformation(override val loop: KtForExpression) : SequenceTransformation {
override val affectsIndex: Boolean
get() = true
@@ -27,7 +27,7 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
class FlatMapTransformation(
override val loop: KtForExpression,
override val inputVariable: KtCallableDeclaration,
val inputVariable: KtCallableDeclaration,
val transform: KtExpression
) : SequenceTransformation {
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.psi.KtProperty
class MapTransformation(
override val loop: KtForExpression,
override val inputVariable: KtCallableDeclaration,
val inputVariable: KtCallableDeclaration,
val mapping: KtExpression
) : SequenceTransformation {
@@ -312,10 +312,7 @@ fun KtExpression.detectInitializationBeforeLoop(loop: KtForExpression): Variable
return VariableInitialization(variable, assignment, initializer)
}
abstract class ReplaceLoopResultTransformation(
override val loop: KtForExpression,
final override val inputVariable: KtCallableDeclaration
): ResultTransformation {
abstract class ReplaceLoopResultTransformation(override val loop: KtForExpression): ResultTransformation {
override val commentSavingRange = PsiChildRange.singleElement(loop.unwrapIfLabeled())
@@ -328,7 +325,6 @@ abstract class ReplaceLoopResultTransformation(
abstract class AssignToVariableResultTransformation(
override val loop: KtForExpression,
final override val inputVariable: KtCallableDeclaration,
protected val initialization: VariableInitialization
) : ResultTransformation {
@@ -353,7 +349,7 @@ abstract class AssignToVariableResultTransformation(
class AssignSequenceTransformationResultTransformation(
private val sequenceTransformation: SequenceTransformation,
initialization: VariableInitialization
) : AssignToVariableResultTransformation(sequenceTransformation.loop, sequenceTransformation.inputVariable, initialization) {
) : AssignToVariableResultTransformation(sequenceTransformation.loop, initialization) {
override val presentation: String
get() = sequenceTransformation.presentation