ConvertToForEachFunctionCallIntention preserves comments outside of body too

This commit is contained in:
Valentin Kipyatkov
2015-05-26 00:09:32 +03:00
parent 8b44c93667
commit 5d0b42ee71
4 changed files with 18 additions and 3 deletions
@@ -17,14 +17,13 @@
package org.jetbrains.kotlin.idea.intentions package org.jetbrains.kotlin.idea.intentions
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.idea.core.CommentSaver
import org.jetbrains.kotlin.psi.JetBlockExpression import org.jetbrains.kotlin.psi.JetBlockExpression
import org.jetbrains.kotlin.psi.JetForExpression import org.jetbrains.kotlin.psi.JetForExpression
import org.jetbrains.kotlin.psi.JetPsiFactory import org.jetbrains.kotlin.psi.JetPsiFactory
import org.jetbrains.kotlin.psi.createExpressionByPattern import org.jetbrains.kotlin.psi.createExpressionByPattern
import org.jetbrains.kotlin.psi.psiUtil.contentRange import org.jetbrains.kotlin.psi.psiUtil.contentRange
import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.getText
public class ConvertToForEachFunctionCallIntention : JetSelfTargetingIntention<JetForExpression>(javaClass(), "Replace with a forEach function call") { public class ConvertToForEachFunctionCallIntention : JetSelfTargetingIntention<JetForExpression>(javaClass(), "Replace with a forEach function call") {
override fun isApplicableTo(element: JetForExpression, caretOffset: Int): Boolean { override fun isApplicableTo(element: JetForExpression, caretOffset: Int): Boolean {
@@ -34,6 +33,8 @@ public class ConvertToForEachFunctionCallIntention : JetSelfTargetingIntention<J
} }
override fun applyTo(element: JetForExpression, editor: Editor) { override fun applyTo(element: JetForExpression, editor: Editor) {
val commentSaver = CommentSaver(element)
val body = element.getBody()!! val body = element.getBody()!!
val loopParameter = element.getLoopParameter()!! val loopParameter = element.getLoopParameter()!!
@@ -41,6 +42,8 @@ public class ConvertToForEachFunctionCallIntention : JetSelfTargetingIntention<J
val foreachExpression = JetPsiFactory(element).createExpressionByPattern( val foreachExpression = JetPsiFactory(element).createExpressionByPattern(
"$0.forEach{$1->$2}", element.getLoopRange()!!, loopParameter, functionBodyArgument) "$0.forEach{$1->$2}", element.getLoopRange()!!, loopParameter, functionBodyArgument)
element.replace(foreachExpression) val result = element.replace(foreachExpression)
commentSaver.restoreComments(result)
} }
} }
@@ -0,0 +1,3 @@
fun foo() {
<caret>for (x /* current */ in 1..10/* from 1 to 10 */) { }
}
@@ -0,0 +1,3 @@
fun foo() {
(1..10/* from 1 to 10 */).forEach { x /* current */ -> }
}
@@ -3943,6 +3943,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("commentsOutsideBody.kt")
public void testCommentsOutsideBody() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertToForEachFunctionCall/commentsOutsideBody.kt");
doTest(fileName);
}
@TestMetadata("emptyBody.kt") @TestMetadata("emptyBody.kt")
public void testEmptyBody() throws Exception { public void testEmptyBody() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertToForEachFunctionCall/emptyBody.kt"); String fileName = JetTestUtils.navigationMetadata("idea/testData/intentions/convertToForEachFunctionCall/emptyBody.kt");