Supported filterIndexedTo
This commit is contained in:
+41
-4
@@ -22,10 +22,7 @@ import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
|||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
||||||
import org.jetbrains.kotlin.idea.imports.importableFqName
|
import org.jetbrains.kotlin.idea.imports.importableFqName
|
||||||
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.*
|
||||||
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.sequence.FlatMapTransformation
|
|
||||||
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.sequence.MapIndexedTransformation
|
|
||||||
import org.jetbrains.kotlin.idea.intentions.loopToCallChain.sequence.MapTransformation
|
|
||||||
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
@@ -43,6 +40,10 @@ class AddToCollectionTransformation(
|
|||||||
FilterToTransformation.create(loop, previousTransformation.inputVariable, targetCollection, previousTransformation.effectiveCondition()) //TODO: use filterNotTo?
|
FilterToTransformation.create(loop, previousTransformation.inputVariable, targetCollection, previousTransformation.effectiveCondition()) //TODO: use filterNotTo?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is FilterIndexedTransformation -> {
|
||||||
|
FilterIndexedToTransformation.create(loop, previousTransformation.inputVariable, previousTransformation.indexVariable, targetCollection, previousTransformation.condition)
|
||||||
|
}
|
||||||
|
|
||||||
is MapTransformation -> {
|
is MapTransformation -> {
|
||||||
MapToTransformation.create(loop, previousTransformation.inputVariable, targetCollection, previousTransformation.mapping)
|
MapToTransformation.create(loop, previousTransformation.inputVariable, targetCollection, previousTransformation.mapping)
|
||||||
}
|
}
|
||||||
@@ -216,6 +217,42 @@ class FilterToTransformation private constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class FilterIndexedToTransformation private constructor(
|
||||||
|
loop: KtForExpression,
|
||||||
|
private val inputVariable: KtCallableDeclaration,
|
||||||
|
private val indexVariable: KtCallableDeclaration,
|
||||||
|
private val targetCollection: KtExpression,
|
||||||
|
private val filter: KtExpression
|
||||||
|
) : ReplaceLoopResultTransformation(loop) {
|
||||||
|
|
||||||
|
override val presentation: String
|
||||||
|
get() = "filterIndexedTo(){}"
|
||||||
|
|
||||||
|
override fun generateCode(chainedCallGenerator: ChainedCallGenerator): KtExpression {
|
||||||
|
val lambda = generateLambda(filter, indexVariable, inputVariable)
|
||||||
|
return chainedCallGenerator.generate("filterIndexedTo($0) $1:'{}'", targetCollection, lambda)
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun create(
|
||||||
|
loop: KtForExpression,
|
||||||
|
inputVariable: KtCallableDeclaration,
|
||||||
|
indexVariable: KtCallableDeclaration,
|
||||||
|
targetCollection: KtExpression,
|
||||||
|
filter: KtExpression
|
||||||
|
): ResultTransformation {
|
||||||
|
val initialization = targetCollection.detectInitializationBeforeLoop(loop, checkNoOtherUsagesInLoop = true)
|
||||||
|
if (initialization != null && initialization.initializer.hasNoSideEffect()) {
|
||||||
|
val transformation = FilterIndexedToTransformation(loop, inputVariable, indexVariable, initialization.initializer, filter)
|
||||||
|
return AssignToVariableResultTransformation.createDelegated(transformation, initialization)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return FilterIndexedToTransformation(loop, inputVariable, indexVariable, targetCollection, filter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class MapToTransformation private constructor(
|
class MapToTransformation private constructor(
|
||||||
loop: KtForExpression,
|
loop: KtForExpression,
|
||||||
private val inputVariable: KtCallableDeclaration,
|
private val inputVariable: KtCallableDeclaration,
|
||||||
|
|||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterIndexedTo(){}'"
|
||||||
|
fun foo(list: List<String>, target: MutableList<String>) {
|
||||||
|
<caret>for ((index, s) in list.withIndex()) {
|
||||||
|
if (s.length > index)
|
||||||
|
target.add(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterIndexedTo(){}'"
|
||||||
|
fun foo(list: List<String>, target: MutableList<String>) {
|
||||||
|
<caret>list.filterIndexedTo(target) { index, s -> s.length > index }
|
||||||
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterIndexedTo(){}'"
|
||||||
|
import java.util.ArrayList
|
||||||
|
|
||||||
|
fun foo(list: List<String>): List<String> {
|
||||||
|
val result = ArrayList<String>(1000)
|
||||||
|
<caret>for ((index, s) in list.withIndex()) {
|
||||||
|
if (s.length > index)
|
||||||
|
result.add(s)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
// INTENTION_TEXT: "Replace with 'filterIndexedTo(){}'"
|
||||||
|
import java.util.ArrayList
|
||||||
|
|
||||||
|
fun foo(list: List<String>): List<String> {
|
||||||
|
val <caret>result = list.filterIndexedTo(ArrayList<String>(1000)) { index, s -> s.length > index }
|
||||||
|
return result
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// INTENTION_TEXT: "Replace with '+= filterIndexed{}.filterIndexed{}'"
|
// INTENTION_TEXT: "Replace with 'filterIndexed{}.filterIndexedTo(){}'"
|
||||||
fun foo(list: List<String>, target: MutableCollection<String>) {
|
fun foo(list: List<String>, target: MutableCollection<String>) {
|
||||||
var j = 0
|
var j = 0
|
||||||
<caret>for ((i, s) in list.withIndex()) {
|
<caret>for ((i, s) in list.withIndex()) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
// INTENTION_TEXT: "Replace with '+= filterIndexed{}.filterIndexed{}'"
|
// INTENTION_TEXT: "Replace with 'filterIndexed{}.filterIndexedTo(){}'"
|
||||||
fun foo(list: List<String>, target: MutableCollection<String>) {
|
fun foo(list: List<String>, target: MutableCollection<String>) {
|
||||||
<caret>target += list
|
<caret>list
|
||||||
.filterIndexed { i, s -> s.length <= i }
|
.filterIndexed { i, s -> s.length <= i }
|
||||||
.filterIndexed { j, s -> s.length % j == 0 }
|
.filterIndexedTo(target) { j, s -> s.length % j == 0 }
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user