From 9ff0f4d736eb891903bb56bb2be60f57571fcdc3 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 21 Apr 2016 21:47:28 +0300 Subject: [PATCH] filterNotTo supported --- .../result/AddToCollectionTransformation.kt | 18 +++++++++++------- .../sequence/FilterTransformation.kt | 7 ++++--- .../intentions/loopToCallChain/filterNotTo.kt | 8 ++++++++ .../loopToCallChain/filterNotTo.kt.after | 5 +++++ 4 files changed, 28 insertions(+), 10 deletions(-) create mode 100644 idea/testData/intentions/loopToCallChain/filterNotTo.kt create mode 100644 idea/testData/intentions/loopToCallChain/filterNotTo.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/result/AddToCollectionTransformation.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/result/AddToCollectionTransformation.kt index feaf00305ef..53f3c6d56c6 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/result/AddToCollectionTransformation.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/result/AddToCollectionTransformation.kt @@ -37,7 +37,7 @@ class AddToCollectionTransformation( override fun mergeWithPrevious(previousTransformation: SequenceTransformation): ResultTransformation? { return when (previousTransformation) { is FilterTransformation -> { - FilterToTransformation.create(loop, previousTransformation.inputVariable, targetCollection, previousTransformation.effectiveCondition()) //TODO: use filterNotTo? + FilterToTransformation.create(loop, previousTransformation.inputVariable, targetCollection, previousTransformation.condition, previousTransformation.isInverse) } is FilterIndexedTransformation -> { @@ -191,15 +191,18 @@ class FilterToTransformation private constructor( loop: KtForExpression, private val inputVariable: KtCallableDeclaration, private val targetCollection: KtExpression, - private val filter: KtExpression + private val filter: KtExpression, + isInverse: Boolean ) : ReplaceLoopResultTransformation(loop) { + private val functionName = if (isInverse) "filterNotTo" else "filterTo" + override val presentation: String - get() = "filterTo(){}" + get() = "$functionName(){}" override fun generateCode(chainedCallGenerator: ChainedCallGenerator): KtExpression { val lambda = generateLambda(inputVariable, filter) - return chainedCallGenerator.generate("filterTo($0) $1:'{}'", targetCollection, lambda) + return chainedCallGenerator.generate("$functionName($0) $1:'{}'", targetCollection, lambda) } companion object { @@ -207,15 +210,16 @@ class FilterToTransformation private constructor( loop: KtForExpression, inputVariable: KtCallableDeclaration, targetCollection: KtExpression, - filter: KtExpression + filter: KtExpression, + isInverse: Boolean ): ResultTransformation { val initialization = targetCollection.detectInitializationBeforeLoop(loop, checkNoOtherUsagesInLoop = true) if (initialization != null && initialization.initializer.hasNoSideEffect()) { - val transformation = FilterToTransformation(loop, inputVariable, initialization.initializer, filter) + val transformation = FilterToTransformation(loop, inputVariable, initialization.initializer, filter, isInverse) return AssignToVariableResultTransformation.createDelegated(transformation, initialization) } else { - return FilterToTransformation(loop, inputVariable, targetCollection, filter) + return FilterToTransformation(loop, inputVariable, targetCollection, filter, isInverse) } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/sequence/FilterTransformation.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/sequence/FilterTransformation.kt index 74fa7c079ac..7b568b74ed0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/sequence/FilterTransformation.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/sequence/FilterTransformation.kt @@ -40,16 +40,17 @@ class FilterTransformation( return FilterTransformation(loop, inputVariable, mergedCondition, isInverse = false) //TODO: build filterNot in some cases? } + private val functionName = if (isInverse) "filterNot" else "filter" + override val affectsIndex: Boolean get() = true override val presentation: String - get() = if (isInverse) "filterNot{}" else "filter{}" + get() = "$functionName{}" override fun generateCode(chainedCallGenerator: ChainedCallGenerator): KtExpression { val lambda = generateLambda(inputVariable, condition) - val name = if (isInverse) "filterNot" else "filter" - return chainedCallGenerator.generate("$0$1:'{}'", name, lambda) + return chainedCallGenerator.generate("$0$1:'{}'", functionName, lambda) } /** diff --git a/idea/testData/intentions/loopToCallChain/filterNotTo.kt b/idea/testData/intentions/loopToCallChain/filterNotTo.kt new file mode 100644 index 00000000000..92dac16733c --- /dev/null +++ b/idea/testData/intentions/loopToCallChain/filterNotTo.kt @@ -0,0 +1,8 @@ +// WITH_RUNTIME +// INTENTION_TEXT: "Replace with 'filterNotTo(){}'" +fun foo(list: List, target: MutableList) { + for (s in list) { + if (s.length == 0) continue + target.add(s) + } +} \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/filterNotTo.kt.after b/idea/testData/intentions/loopToCallChain/filterNotTo.kt.after new file mode 100644 index 00000000000..3a99dd02197 --- /dev/null +++ b/idea/testData/intentions/loopToCallChain/filterNotTo.kt.after @@ -0,0 +1,5 @@ +// WITH_RUNTIME +// INTENTION_TEXT: "Replace with 'filterNotTo(){}'" +fun foo(list: List, target: MutableList) { + list.filterNotTo(target) { it.length == 0 } +} \ No newline at end of file