If to when: more accurate comment handling #KT-12649 Fixed

This commit is contained in:
Mikhail Glukhikh
2016-06-08 17:05:45 +03:00
parent d2bf4cbfa0
commit 9470308fe7
5 changed files with 43 additions and 5 deletions
@@ -89,9 +89,11 @@ class IfToWhenIntention : SelfTargetingRangeIntention<KtIfExpression>(KtIfExpres
override fun applyTo(element: KtIfExpression, editor: Editor?) {
val siblings = element.siblings()
val commentSaver = CommentSaver(PsiChildRange(element, siblings.last()), saveLineBreaks = true)
val elementCommentSaver = CommentSaver(element)
val fullCommentSaver = CommentSaver(PsiChildRange(element, siblings.last()), saveLineBreaks = true)
val toDelete = ArrayList<PsiElement>()
var applyFullCommentSaver = true
var whenExpression = KtPsiFactory(element).buildExpression {
appendFixedText("when {\n")
@@ -134,8 +136,8 @@ class IfToWhenIntention : SelfTargetingRangeIntention<KtIfExpression>(KtIfExpres
currentIfExpression = currentElseBranch
}
else {
toDelete.addAll(baseIfExpressionForSyntheticBranch.siblingsUpTo(currentElseBranch))
appendElseBlock(currentElseBranch)
applyFullCommentSaver = false
break
}
}
@@ -149,7 +151,7 @@ class IfToWhenIntention : SelfTargetingRangeIntention<KtIfExpression>(KtIfExpres
}
val result = element.replace(whenExpression)
commentSaver.restore(result)
(if (applyFullCommentSaver) fullCommentSaver else elementCommentSaver).restore(result)
toDelete.forEach {
it.delete()
}
@@ -1,6 +1,6 @@
fun foo(arg: Int): Int {
when (arg) {
0 -> return 0 // 1
else -> return -1 // 2
}
else -> return -1
} // 2
}
@@ -0,0 +1,16 @@
fun toInt(s: Number): Int {
<caret>if (s is Int) {
foo()
}
else {
return -1
}
// code below will be lost!
bar()
// before return
return s
}
fun foo() {}
fun bar() {}
@@ -0,0 +1,14 @@
fun toInt(s: Number): Int {
when (s) {
is Int -> foo()
else -> return -1
}
// code below will be lost!
bar()
// before return
return s
}
fun foo() {}
fun bar() {}
@@ -1576,6 +1576,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
doTest(fileName);
}
@TestMetadata("ifElseSwallowTail.kt")
public void testIfElseSwallowTail() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifWhen/ifToWhen/ifElseSwallowTail.kt");
doTest(fileName);
}
@TestMetadata("ifWithEqualityTests.kt")
public void testIfWithEqualityTests() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifWhen/ifToWhen/ifWithEqualityTests.kt");