diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/LoopToCallChainIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/LoopToCallChainIntention.kt index aa0d6f62681..e981862aca5 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/LoopToCallChainIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/loopToCallChain/LoopToCallChainIntention.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import org.jetbrains.kotlin.idea.intentions.SelfTargetingRangeIntention import org.jetbrains.kotlin.psi.KtForExpression +import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.psiUtil.startOffset class LoopToCallChainInspection : IntentionBasedInspection( @@ -55,6 +56,13 @@ class LoopToCallChainIntention : SelfTargetingRangeIntention( override fun applyTo(element: KtForExpression, editor: Editor?) { val match = match(element)!! val result = convertLoop(element, match) - editor?.moveCaret(result.startOffset) + + val offset = when (result) { + // if result is variable declaration, put the caret onto its name to allow quick inline + is KtProperty -> result.nameIdentifier?.startOffset ?: result.startOffset + else -> result.startOffset + } + + editor?.moveCaret(offset) } } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/any_ifAssign.kt.after b/idea/testData/intentions/loopToCallChain/any_ifAssign.kt.after index 5d0f8a902f9..d79e4bf9210 100644 --- a/idea/testData/intentions/loopToCallChain/any_ifAssign.kt.after +++ b/idea/testData/intentions/loopToCallChain/any_ifAssign.kt.after @@ -1,5 +1,5 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'any{}'" fun foo(list: List) { - val found = list.any { it.length > 0 } + val found = list.any { it.length > 0 } } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/any_ifAssign_noBreak.kt.after b/idea/testData/intentions/loopToCallChain/any_ifAssign_noBreak.kt.after index 5d0f8a902f9..d79e4bf9210 100644 --- a/idea/testData/intentions/loopToCallChain/any_ifAssign_noBreak.kt.after +++ b/idea/testData/intentions/loopToCallChain/any_ifAssign_noBreak.kt.after @@ -1,5 +1,5 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'any{}'" fun foo(list: List) { - val found = list.any { it.length > 0 } + val found = list.any { it.length > 0 } } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/any_ifAssign_nonBooleanResult.kt.after b/idea/testData/intentions/loopToCallChain/any_ifAssign_nonBooleanResult.kt.after index ae8a052f811..54fdfb6517e 100644 --- a/idea/testData/intentions/loopToCallChain/any_ifAssign_nonBooleanResult.kt.after +++ b/idea/testData/intentions/loopToCallChain/any_ifAssign_nonBooleanResult.kt.after @@ -1,5 +1,5 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'any{}'" fun foo(list: List) { - val result = if (list.any { it.length > 0 }) 1 else 0 + val result = if (list.any { it.length > 0 }) 1 else 0 } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/assignFilter.kt.after b/idea/testData/intentions/loopToCallChain/assignFilter.kt.after index d22853926bb..aac1e353ee0 100644 --- a/idea/testData/intentions/loopToCallChain/assignFilter.kt.after +++ b/idea/testData/intentions/loopToCallChain/assignFilter.kt.after @@ -3,6 +3,6 @@ import java.util.ArrayList fun foo(list: List): List { - val result = list.filter { it.length > 0 } + val result = list.filter { it.length > 0 } return result } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/assignFilter2.kt.after b/idea/testData/intentions/loopToCallChain/assignFilter2.kt.after index b35198b5954..11828dc76ee 100644 --- a/idea/testData/intentions/loopToCallChain/assignFilter2.kt.after +++ b/idea/testData/intentions/loopToCallChain/assignFilter2.kt.after @@ -4,7 +4,7 @@ import java.util.ArrayList fun foo(list: List, p: Int): List { return if (p > 0) { - val result = list.filter { it.length > 0 } + val result = list.filter { it.length > 0 } result } else { diff --git a/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired.kt.after b/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired.kt.after index 5d6c598537c..f09b76bc5a1 100644 --- a/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired.kt.after +++ b/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired.kt.after @@ -3,6 +3,6 @@ import java.util.ArrayList fun foo(list: List): ArrayList { - val result = list.filterTo(ArrayList()) { it.length > 0 } + val result = list.filterTo(ArrayList()) { it.length > 0 } return result } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired2.kt.after b/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired2.kt.after index 139df1b3467..7d17bd20e6e 100644 --- a/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired2.kt.after +++ b/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired2.kt.after @@ -4,7 +4,7 @@ import java.util.ArrayList fun foo(list: List, p: Int): ArrayList { return if (p > 0) { - val result = list.filterTo(ArrayList()) { it.length > 0 } + val result = list.filterTo(ArrayList()) { it.length > 0 } result } else { diff --git a/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired3.kt.after b/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired3.kt.after index 729452260ef..5dd7e61894f 100644 --- a/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired3.kt.after +++ b/idea/testData/intentions/loopToCallChain/assignFilter_ArrayListRequired3.kt.after @@ -4,7 +4,7 @@ import java.util.* fun foo(list: List): ArrayList { return run { - val result = list.filterTo(ArrayList()) { it.length > 0 } + val result = list.filterTo(ArrayList()) { it.length > 0 } result } } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/assignFilter_MutableListRequired.kt.after b/idea/testData/intentions/loopToCallChain/assignFilter_MutableListRequired.kt.after index 2d468694d2d..ae5e82c4296 100644 --- a/idea/testData/intentions/loopToCallChain/assignFilter_MutableListRequired.kt.after +++ b/idea/testData/intentions/loopToCallChain/assignFilter_MutableListRequired.kt.after @@ -3,7 +3,7 @@ import java.util.ArrayList fun foo(list: List): MutableList { - val result = list + val result = list .filter { it.length > 0 } .toMutableList() return result diff --git a/idea/testData/intentions/loopToCallChain/assignFilter_breakAndContinue.kt.after b/idea/testData/intentions/loopToCallChain/assignFilter_breakAndContinue.kt.after index c0644ce4490..05efff63889 100644 --- a/idea/testData/intentions/loopToCallChain/assignFilter_breakAndContinue.kt.after +++ b/idea/testData/intentions/loopToCallChain/assignFilter_breakAndContinue.kt.after @@ -4,7 +4,7 @@ import java.util.ArrayList fun foo(): List { while (true) { - val result = list().filter { it.length > 0 } + val result = list().filter { it.length > 0 } if (bar1()) continue if (bar2()) break diff --git a/idea/testData/intentions/loopToCallChain/count1.kt.after b/idea/testData/intentions/loopToCallChain/count1.kt.after index c6a15f3c87e..31d8c2c1d99 100644 --- a/idea/testData/intentions/loopToCallChain/count1.kt.after +++ b/idea/testData/intentions/loopToCallChain/count1.kt.after @@ -1,6 +1,6 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'count{}'" fun foo(list: List): Int { - val count = list.count { it.isNotBlank() } + val count = list.count { it.isNotBlank() } return count } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/count2.kt.after b/idea/testData/intentions/loopToCallChain/count2.kt.after index f8696726121..4913e945652 100644 --- a/idea/testData/intentions/loopToCallChain/count2.kt.after +++ b/idea/testData/intentions/loopToCallChain/count2.kt.after @@ -1,6 +1,6 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'count()'" fun foo(list: Iterable): Int { - val count = list.count() + val count = list.count() return count } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/count_nonConstantInitial.kt.after b/idea/testData/intentions/loopToCallChain/count_nonConstantInitial.kt.after index aee44505484..436f7f02e1a 100644 --- a/idea/testData/intentions/loopToCallChain/count_nonConstantInitial.kt.after +++ b/idea/testData/intentions/loopToCallChain/count_nonConstantInitial.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'count{}'" fun foo(list: List): Int { - val count = bar() + list.count { it.isNotBlank() } + val count = bar() + list.count { it.isNotBlank() } return count } diff --git a/idea/testData/intentions/loopToCallChain/count_nonZeroInitial.kt.after b/idea/testData/intentions/loopToCallChain/count_nonZeroInitial.kt.after index b17838f8228..50a5d562195 100644 --- a/idea/testData/intentions/loopToCallChain/count_nonZeroInitial.kt.after +++ b/idea/testData/intentions/loopToCallChain/count_nonZeroInitial.kt.after @@ -1,6 +1,6 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'count{}'" fun foo(list: List): Int { - val count = 1 + list.count { it.isNotBlank() } + val count = 1 + list.count { it.isNotBlank() } return count } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/count_prefix.kt.after b/idea/testData/intentions/loopToCallChain/count_prefix.kt.after index c6a15f3c87e..31d8c2c1d99 100644 --- a/idea/testData/intentions/loopToCallChain/count_prefix.kt.after +++ b/idea/testData/intentions/loopToCallChain/count_prefix.kt.after @@ -1,6 +1,6 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'count{}'" fun foo(list: List): Int { - val count = list.count { it.isNotBlank() } + val count = list.count { it.isNotBlank() } return count } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign.kt.after b/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign.kt.after index da5894d8436..3bbef95ae6f 100644 --- a/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign.kt.after +++ b/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign.kt.after @@ -1,5 +1,5 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'firstOrNull{}'" fun foo(list: List) { - val result: String? = list.firstOrNull { it.length > 0 } + val result: String? = list.firstOrNull { it.length > 0 } } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign_cannotBeVal.kt.after b/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign_cannotBeVal.kt.after index 9ce187c79da..e2eceaed0f7 100644 --- a/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign_cannotBeVal.kt.after +++ b/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign_cannotBeVal.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'firstOrNull{}'" fun foo(list: List) { - var result: String? = list.firstOrNull { it.length > 0 } + var result: String? = list.firstOrNull { it.length > 0 } result += "1" } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign_preserveComments.kt.after b/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign_preserveComments.kt.after index 7fed0e7d82d..0f6c87ba17d 100644 --- a/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign_preserveComments.kt.after +++ b/idea/testData/intentions/loopToCallChain/firstOrNull_ifAssign_preserveComments.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'firstOrNull{}'" fun foo(list: List) { - val result: String? = list.firstOrNull { // search for first non-empty string in the list + val result: String? = list.firstOrNull { // search for first non-empty string in the list it.length > 0 }// string should be non-empty // save it into result diff --git a/idea/testData/intentions/loopToCallChain/firstOrNull_let.kt.after b/idea/testData/intentions/loopToCallChain/firstOrNull_let.kt.after index bdf7a3cbc0d..74fb23090ae 100644 --- a/idea/testData/intentions/loopToCallChain/firstOrNull_let.kt.after +++ b/idea/testData/intentions/loopToCallChain/firstOrNull_let.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'firstOrNull{}'" fun foo(list: List) { - val result: String? = list + val result: String? = list .firstOrNull { it.length > 0 } ?.let { bar(it) } } diff --git a/idea/testData/intentions/loopToCallChain/firstOrNull_let2.kt.after b/idea/testData/intentions/loopToCallChain/firstOrNull_let2.kt.after index 28fab70bc11..0db7d52a1f2 100644 --- a/idea/testData/intentions/loopToCallChain/firstOrNull_let2.kt.after +++ b/idea/testData/intentions/loopToCallChain/firstOrNull_let2.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'firstOrNull{}'" fun foo(list: List) { - val result: String? = list + val result: String? = list .firstOrNull { it.length > 0 } ?.let { it.substring(0, it.length - 1) } } diff --git a/idea/testData/intentions/loopToCallChain/firstOrNull_letOrNotNull.kt.after b/idea/testData/intentions/loopToCallChain/firstOrNull_letOrNotNull.kt.after index e653bbbff70..c5504673d4e 100644 --- a/idea/testData/intentions/loopToCallChain/firstOrNull_letOrNotNull.kt.after +++ b/idea/testData/intentions/loopToCallChain/firstOrNull_letOrNotNull.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'firstOrNull{}'" fun foo(list: List) { - val result = list + val result = list .firstOrNull { it.length > 0 } ?.let { bar(it) } ?: "" } diff --git a/idea/testData/intentions/loopToCallChain/firstOrNull_safeDotExpression.kt.after b/idea/testData/intentions/loopToCallChain/firstOrNull_safeDotExpression.kt.after index 00603d87727..cc52207d140 100644 --- a/idea/testData/intentions/loopToCallChain/firstOrNull_safeDotExpression.kt.after +++ b/idea/testData/intentions/loopToCallChain/firstOrNull_safeDotExpression.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'firstOrNull{}'" fun foo(list: List) { - val result: String? = list + val result: String? = list .firstOrNull { it != "" } ?.substring(1) } diff --git a/idea/testData/intentions/loopToCallChain/flatMapTo2.kt.after b/idea/testData/intentions/loopToCallChain/flatMapTo2.kt.after index 8a9ea3999f9..ba07af17cb6 100644 --- a/idea/testData/intentions/loopToCallChain/flatMapTo2.kt.after +++ b/idea/testData/intentions/loopToCallChain/flatMapTo2.kt.after @@ -3,6 +3,6 @@ import java.util.ArrayList fun foo(list: List): List { - val target = list.flatMapTo(ArrayList(100)) { it.lines() } + val target = list.flatMapTo(ArrayList(100)) { it.lines() } return target } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/flatMapWithBreak.kt.after b/idea/testData/intentions/loopToCallChain/flatMapWithBreak.kt.after index 6dcf1b84bbc..16c926e5dcc 100644 --- a/idea/testData/intentions/loopToCallChain/flatMapWithBreak.kt.after +++ b/idea/testData/intentions/loopToCallChain/flatMapWithBreak.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'flatMap{}.firstOrNull{}'" fun foo(list: List): String? { - val result: String? = list + val result: String? = list .flatMap { it.lines() } .firstOrNull { it.isNotBlank() } return result diff --git a/idea/testData/intentions/loopToCallChain/itAlreadyUsed.kt.after b/idea/testData/intentions/loopToCallChain/itAlreadyUsed.kt.after index b134376c15f..75d1551f836 100644 --- a/idea/testData/intentions/loopToCallChain/itAlreadyUsed.kt.after +++ b/idea/testData/intentions/loopToCallChain/itAlreadyUsed.kt.after @@ -1,5 +1,5 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'any{}'" fun foo(list: List, it: Int) { - val found = list.any { s -> s.length > it } + val found = list.any { s -> s.length > it } } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/lastOrNull_ifAssign.kt.after b/idea/testData/intentions/loopToCallChain/lastOrNull_ifAssign.kt.after index f0519cffaf2..55558033370 100644 --- a/idea/testData/intentions/loopToCallChain/lastOrNull_ifAssign.kt.after +++ b/idea/testData/intentions/loopToCallChain/lastOrNull_ifAssign.kt.after @@ -1,5 +1,5 @@ // WITH_RUNTIME // INTENTION_TEXT: "Replace with 'lastOrNull{}'" fun foo(list: List) { - val result: String? = list.lastOrNull { it.length > 0 } + val result: String? = list.lastOrNull { it.length > 0 } } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/mapTo3.kt.after b/idea/testData/intentions/loopToCallChain/mapTo3.kt.after index bb1fa37f9cd..c1edb598710 100644 --- a/idea/testData/intentions/loopToCallChain/mapTo3.kt.after +++ b/idea/testData/intentions/loopToCallChain/mapTo3.kt.after @@ -3,7 +3,7 @@ import java.util.ArrayList fun foo(list: List): List { - val target = list + val target = list .filter { it.length > 0 } .mapTo(ArrayList(100)) { it.hashCode() } return target diff --git a/idea/testData/intentions/loopToCallChain/toList.kt.after b/idea/testData/intentions/loopToCallChain/toList.kt.after index 0d27a73d4bf..1bcee259ffd 100644 --- a/idea/testData/intentions/loopToCallChain/toList.kt.after +++ b/idea/testData/intentions/loopToCallChain/toList.kt.after @@ -3,6 +3,6 @@ import java.util.ArrayList fun foo(map: Map): List { - val result = map.values.toList() + val result = map.values.toList() return result } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/toMutableSet.kt.after b/idea/testData/intentions/loopToCallChain/toMutableSet.kt.after index 663b95fc513..06dccfbcb6a 100644 --- a/idea/testData/intentions/loopToCallChain/toMutableSet.kt.after +++ b/idea/testData/intentions/loopToCallChain/toMutableSet.kt.after @@ -3,6 +3,6 @@ import java.util.HashSet fun foo(map: Map): MutableCollection { - val result = map.values.toMutableSet() + val result = map.values.toMutableSet() return result } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/toSet.kt.after b/idea/testData/intentions/loopToCallChain/toSet.kt.after index 343e616b851..be8d562e51f 100644 --- a/idea/testData/intentions/loopToCallChain/toSet.kt.after +++ b/idea/testData/intentions/loopToCallChain/toSet.kt.after @@ -3,6 +3,6 @@ import java.util.HashSet fun foo(map: Map): Collection { - val result = map.values.toSet() + val result = map.values.toSet() return result } \ No newline at end of file diff --git a/idea/testData/intentions/loopToCallChain/toSetWithMap.kt.after b/idea/testData/intentions/loopToCallChain/toSetWithMap.kt.after index 8f1a22d5dc2..c9e57dd3332 100644 --- a/idea/testData/intentions/loopToCallChain/toSetWithMap.kt.after +++ b/idea/testData/intentions/loopToCallChain/toSetWithMap.kt.after @@ -3,7 +3,7 @@ import java.util.HashSet fun foo(map: Map): Collection { - val result = map.values + val result = map.values .map { it.length } .toSet() return result