From 395e61ca5798faacddd646ccc75d9439687b4d5b Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 21 Apr 2016 21:04:47 +0300 Subject: [PATCH] filterNotNullTo supported --- .../result/AddToCollectionTransformation.kt | 33 +++++++++++++++++++ .../loopToCallChain/filterNotNullTo.kt | 9 +++++ .../loopToCallChain/filterNotNullTo.kt.after | 5 +++ .../loopToCallChain/filterNotNullTo2.kt | 12 +++++++ .../loopToCallChain/filterNotNullTo2.kt.after | 7 ++++ 5 files changed, 66 insertions(+) create mode 100644 idea/testData/intentions/loopToCallChain/filterNotNullTo.kt create mode 100644 idea/testData/intentions/loopToCallChain/filterNotNullTo.kt.after create mode 100644 idea/testData/intentions/loopToCallChain/filterNotNullTo2.kt create mode 100644 idea/testData/intentions/loopToCallChain/filterNotNullTo2.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 f39b7371090..feaf00305ef 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 @@ -44,6 +44,10 @@ class AddToCollectionTransformation( FilterIndexedToTransformation.create(loop, previousTransformation.inputVariable, previousTransformation.indexVariable, targetCollection, previousTransformation.condition) } + is FilterNotNullTransformation -> { + FilterNotNullToTransformation.create(loop, targetCollection) + } + is MapTransformation -> { MapToTransformation.create(loop, previousTransformation.inputVariable, targetCollection, previousTransformation.mapping) } @@ -253,6 +257,35 @@ class FilterIndexedToTransformation private constructor( } } +class FilterNotNullToTransformation private constructor( + loop: KtForExpression, + private val targetCollection: KtExpression +) : ReplaceLoopResultTransformation(loop) { + + override val presentation: String + get() = "filterNotNullTo()" + + override fun generateCode(chainedCallGenerator: ChainedCallGenerator): KtExpression { + return chainedCallGenerator.generate("filterNotNullTo($0)", targetCollection) + } + + companion object { + fun create( + loop: KtForExpression, + targetCollection: KtExpression + ): ResultTransformation { + val initialization = targetCollection.detectInitializationBeforeLoop(loop, checkNoOtherUsagesInLoop = true) + if (initialization != null && initialization.initializer.hasNoSideEffect()) { + val transformation = FilterNotNullToTransformation(loop, initialization.initializer) + return AssignToVariableResultTransformation.createDelegated(transformation, initialization) + } + else { + return FilterNotNullToTransformation(loop, targetCollection) + } + } + } +} + class MapToTransformation private constructor( loop: KtForExpression, private val inputVariable: KtCallableDeclaration, diff --git a/idea/testData/intentions/loopToCallChain/filterNotNullTo.kt b/idea/testData/intentions/loopToCallChain/filterNotNullTo.kt new file mode 100644 index 00000000000..14d45edf855 --- /dev/null +++ b/idea/testData/intentions/loopToCallChain/filterNotNullTo.kt @@ -0,0 +1,9 @@ +// WITH_RUNTIME +// INTENTION_TEXT: "Replace with 'filterNotNullTo()'" +fun foo(list: List, target: MutableCollection) { + for (s in list) { + if (s != null) { + target.add(s) + } + } +} \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/filterNotNullTo.kt.after b/idea/testData/intentions/loopToCallChain/filterNotNullTo.kt.after new file mode 100644 index 00000000000..aac8cc4789d --- /dev/null +++ b/idea/testData/intentions/loopToCallChain/filterNotNullTo.kt.after @@ -0,0 +1,5 @@ +// WITH_RUNTIME +// INTENTION_TEXT: "Replace with 'filterNotNullTo()'" +fun foo(list: List, target: MutableCollection) { + list.filterNotNullTo(target) +} \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/filterNotNullTo2.kt b/idea/testData/intentions/loopToCallChain/filterNotNullTo2.kt new file mode 100644 index 00000000000..2a78a848cef --- /dev/null +++ b/idea/testData/intentions/loopToCallChain/filterNotNullTo2.kt @@ -0,0 +1,12 @@ +// WITH_RUNTIME +// INTENTION_TEXT: "Replace with 'filterNotNullTo()'" +import java.util.ArrayList + +fun foo(list: List) { + val target = ArrayList(1000) + for (s in list) { + if (s != null) { + target.add(s) + } + } +} \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/filterNotNullTo2.kt.after b/idea/testData/intentions/loopToCallChain/filterNotNullTo2.kt.after new file mode 100644 index 00000000000..644d020ed11 --- /dev/null +++ b/idea/testData/intentions/loopToCallChain/filterNotNullTo2.kt.after @@ -0,0 +1,7 @@ +// WITH_RUNTIME +// INTENTION_TEXT: "Replace with 'filterNotNullTo()'" +import java.util.ArrayList + +fun foo(list: List) { + val target = list.filterNotNullTo(ArrayList(1000)) +} \ No newline at end of file