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