Restored live template but made it more useful
This commit is contained in:
@@ -17,15 +17,14 @@
|
|||||||
package org.jetbrains.kotlin.idea.intentions
|
package org.jetbrains.kotlin.idea.intentions
|
||||||
|
|
||||||
import com.intellij.codeInsight.intention.LowPriorityAction
|
import com.intellij.codeInsight.intention.LowPriorityAction
|
||||||
|
import com.intellij.codeInsight.template.TemplateBuilderImpl
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
|
import com.intellij.psi.PsiDocumentManager
|
||||||
import org.jetbrains.kotlin.analyzer.analyzeInContext
|
import org.jetbrains.kotlin.analyzer.analyzeInContext
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.core.replaced
|
import org.jetbrains.kotlin.idea.core.replaced
|
||||||
import org.jetbrains.kotlin.psi.JetExpression
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.JetForExpression
|
|
||||||
import org.jetbrains.kotlin.psi.JetPsiFactory
|
|
||||||
import org.jetbrains.kotlin.psi.createExpressionByPattern
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
@@ -68,7 +67,34 @@ public class AddForLoopIndicesIntention : JetSelfTargetingRangeIntention<JetForE
|
|||||||
|
|
||||||
val indexVariable = multiParameter.entries[0]
|
val indexVariable = multiParameter.entries[0]
|
||||||
editor.caretModel.moveToOffset(indexVariable.startOffset)
|
editor.caretModel.moveToOffset(indexVariable.startOffset)
|
||||||
editor.selectionModel.setSelection(indexVariable.startOffset, indexVariable.endOffset)
|
|
||||||
|
runTemplate(editor, element, indexVariable)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun runTemplate(editor: Editor, forExpression: JetForExpression, indexVariable: JetMultiDeclarationEntry) {
|
||||||
|
PsiDocumentManager.getInstance(forExpression.project).doPostponedOperationsAndUnblockDocument(editor.document)
|
||||||
|
|
||||||
|
val templateBuilder = TemplateBuilderImpl(forExpression)
|
||||||
|
templateBuilder.replaceElement(indexVariable, ChooseStringExpression(listOf("index", "i")))
|
||||||
|
|
||||||
|
val body = forExpression.body
|
||||||
|
when (body) {
|
||||||
|
is JetBlockExpression -> {
|
||||||
|
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 {
|
private fun createWithIndexExpression(originalExpression: JetExpression): JetExpression {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
fun a() {
|
fun a() {
|
||||||
val b = listOf(1,2,3,4,5)
|
val b = listOf(1,2,3,4,5)
|
||||||
for ((index, c : Int) in b.withIndex()) {
|
for ((index, c : Int) in b.withIndex()) {<caret>
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
fun foo(bar: IntArray) {
|
fun foo(bar: IntArray) {
|
||||||
for ((index, a) in bar.withIndex()) {
|
for ((index, a) in bar.withIndex()) {<caret>
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
fun foo(bar: Iterable<Int>) {
|
fun foo(bar: Iterable<Int>) {
|
||||||
for ((index, a) in bar.withIndex()) {
|
for ((index, a) in bar.withIndex()) {<caret>
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
fun foo(bar: IntArray) {
|
||||||
|
for (<caret>a in bar)
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
fun foo(bar: IntArray) {
|
||||||
|
for ((index, a) in bar.withIndex())<caret>
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
fun foo(bar: Array<Object>) {
|
fun foo(bar: Array<Object>) {
|
||||||
for ((index, a) in bar.withIndex()) {
|
for ((index, a) in bar.withIndex()) {<caret>
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-3
@@ -1,6 +1,5 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
fun foo(bar: Sequence<String>) {
|
fun foo(bar: Sequence<String>) {
|
||||||
for (<caret>a in bar) {
|
for (<caret>a in bar)
|
||||||
|
print(a)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
fun foo(bar: Sequence<String>) {
|
fun foo(bar: Sequence<String>) {
|
||||||
for ((index, a) in bar.withIndex()) {
|
for ((index, a) in bar.withIndex())
|
||||||
|
<caret>print(a)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
fun a() {
|
fun a() {
|
||||||
val b = listOf(1,2,3,4,5)
|
val b = listOf(1,2,3,4,5)
|
||||||
for ((index, c) in b.withIndex()) {
|
for ((index, c) in b.withIndex()) {<caret>
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
fun foo(bar: String) {
|
fun foo(bar: String) {
|
||||||
for (<caret>a in bar) {
|
for (<caret>a in bar) {
|
||||||
|
print(a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
fun foo(bar: String) {
|
fun foo(bar: String) {
|
||||||
for ((index, a) in bar.withIndex()) {
|
for ((index, a) in bar.withIndex()) {
|
||||||
|
<caret>print(a)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -148,6 +148,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("objectArray.kt")
|
||||||
public void testObjectArray() throws Exception {
|
public void testObjectArray() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/addForLoopIndices/objectArray.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/addForLoopIndices/objectArray.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user