diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/AddForLoopIndicesIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/AddForLoopIndicesIntention.kt index 4abfc21b589..c327ebc3dcd 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/AddForLoopIndicesIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/AddForLoopIndicesIntention.kt @@ -17,15 +17,14 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.codeInsight.intention.LowPriorityAction +import com.intellij.codeInsight.template.TemplateBuilderImpl import com.intellij.openapi.editor.Editor import com.intellij.openapi.util.TextRange +import com.intellij.psi.PsiDocumentManager import org.jetbrains.kotlin.analyzer.analyzeInContext import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.core.replaced -import org.jetbrains.kotlin.psi.JetExpression -import org.jetbrains.kotlin.psi.JetForExpression -import org.jetbrains.kotlin.psi.JetPsiFactory -import org.jetbrains.kotlin.psi.createExpressionByPattern +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset import org.jetbrains.kotlin.resolve.BindingContext @@ -68,7 +67,34 @@ public class AddForLoopIndicesIntention : JetSelfTargetingRangeIntention { + val statement = body.statements.firstOrNull() + if (statement != null) { + templateBuilder.setEndVariableBefore(statement) + } + else { + templateBuilder.setEndVariableAfter(body.lBrace) + } + } + + null -> forExpression.rightParenthesis.let { templateBuilder.setEndVariableAfter(it) } + + else -> templateBuilder.setEndVariableBefore(body) + } + + templateBuilder.run(editor, true) } private fun createWithIndexExpression(originalExpression: JetExpression): JetExpression { diff --git a/idea/testData/intentions/addForLoopIndices/explicitParamType.kt.after b/idea/testData/intentions/addForLoopIndices/explicitParamType.kt.after index 09d634c6844..0d9a18f1439 100644 --- a/idea/testData/intentions/addForLoopIndices/explicitParamType.kt.after +++ b/idea/testData/intentions/addForLoopIndices/explicitParamType.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME fun a() { val b = listOf(1,2,3,4,5) - for ((index, c : Int) in b.withIndex()) { + for ((index, c : Int) in b.withIndex()) { } } \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/intArray.kt.after b/idea/testData/intentions/addForLoopIndices/intArray.kt.after index c4b6f424b0e..1be0bfb6bf9 100644 --- a/idea/testData/intentions/addForLoopIndices/intArray.kt.after +++ b/idea/testData/intentions/addForLoopIndices/intArray.kt.after @@ -1,6 +1,6 @@ // WITH_RUNTIME fun foo(bar: IntArray) { - for ((index, a) in bar.withIndex()) { + for ((index, a) in bar.withIndex()) { } } \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/iterable.kt.after b/idea/testData/intentions/addForLoopIndices/iterable.kt.after index 673b64d48de..f96fe487f34 100644 --- a/idea/testData/intentions/addForLoopIndices/iterable.kt.after +++ b/idea/testData/intentions/addForLoopIndices/iterable.kt.after @@ -1,6 +1,6 @@ // WITH_RUNTIME fun foo(bar: Iterable) { - for ((index, a) in bar.withIndex()) { + for ((index, a) in bar.withIndex()) { } } \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/noBody.kt b/idea/testData/intentions/addForLoopIndices/noBody.kt new file mode 100644 index 00000000000..e47e3432851 --- /dev/null +++ b/idea/testData/intentions/addForLoopIndices/noBody.kt @@ -0,0 +1,4 @@ +// WITH_RUNTIME +fun foo(bar: IntArray) { + for (a in bar) +} \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/noBody.kt.after b/idea/testData/intentions/addForLoopIndices/noBody.kt.after new file mode 100644 index 00000000000..66fb942fd4c --- /dev/null +++ b/idea/testData/intentions/addForLoopIndices/noBody.kt.after @@ -0,0 +1,4 @@ +// WITH_RUNTIME +fun foo(bar: IntArray) { + for ((index, a) in bar.withIndex()) +} \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/objectArray.kt.after b/idea/testData/intentions/addForLoopIndices/objectArray.kt.after index 0f51422ec66..097db825620 100644 --- a/idea/testData/intentions/addForLoopIndices/objectArray.kt.after +++ b/idea/testData/intentions/addForLoopIndices/objectArray.kt.after @@ -1,6 +1,6 @@ // WITH_RUNTIME fun foo(bar: Array) { - for ((index, a) in bar.withIndex()) { + for ((index, a) in bar.withIndex()) { } } \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/sequence.kt b/idea/testData/intentions/addForLoopIndices/sequence.kt index cc90fb6fd4e..71f1e5be815 100644 --- a/idea/testData/intentions/addForLoopIndices/sequence.kt +++ b/idea/testData/intentions/addForLoopIndices/sequence.kt @@ -1,6 +1,5 @@ // WITH_RUNTIME fun foo(bar: Sequence) { - for (a in bar) { - - } + for (a in bar) + print(a) } \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/sequence.kt.after b/idea/testData/intentions/addForLoopIndices/sequence.kt.after index 29a31946b3f..c1fbaf64dab 100644 --- a/idea/testData/intentions/addForLoopIndices/sequence.kt.after +++ b/idea/testData/intentions/addForLoopIndices/sequence.kt.after @@ -1,6 +1,5 @@ // WITH_RUNTIME fun foo(bar: Sequence) { - for ((index, a) in bar.withIndex()) { - - } + for ((index, a) in bar.withIndex()) + print(a) } \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/simpleIntList.kt.after b/idea/testData/intentions/addForLoopIndices/simpleIntList.kt.after index 72b7ca64e6e..4a3c9653a5d 100644 --- a/idea/testData/intentions/addForLoopIndices/simpleIntList.kt.after +++ b/idea/testData/intentions/addForLoopIndices/simpleIntList.kt.after @@ -1,7 +1,7 @@ // WITH_RUNTIME fun a() { val b = listOf(1,2,3,4,5) - for ((index, c) in b.withIndex()) { + for ((index, c) in b.withIndex()) { } } \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/string.kt b/idea/testData/intentions/addForLoopIndices/string.kt index f2da1ff5806..6fa3a2bd2a0 100644 --- a/idea/testData/intentions/addForLoopIndices/string.kt +++ b/idea/testData/intentions/addForLoopIndices/string.kt @@ -1,6 +1,6 @@ // WITH_RUNTIME fun foo(bar: String) { for (a in bar) { - + print(a) } } \ No newline at end of file diff --git a/idea/testData/intentions/addForLoopIndices/string.kt.after b/idea/testData/intentions/addForLoopIndices/string.kt.after index 4eaba4e1f2d..0956ed2394a 100644 --- a/idea/testData/intentions/addForLoopIndices/string.kt.after +++ b/idea/testData/intentions/addForLoopIndices/string.kt.after @@ -1,6 +1,6 @@ // WITH_RUNTIME fun foo(bar: String) { for ((index, a) in bar.withIndex()) { - + print(a) } } \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 36d3715fd69..6d1333cd1e0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -148,6 +148,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("noBody.kt") + public void testNoBody() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/addForLoopIndices/noBody.kt"); + doTest(fileName); + } + @TestMetadata("objectArray.kt") public void testObjectArray() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/addForLoopIndices/objectArray.kt");