KT-12040 "Replace when with if" produce invalid code for first entry which has comment

#KT-12040 Fixed
This commit is contained in:
Valentin Kipyatkov
2016-05-04 18:19:34 +03:00
parent 17dacb1efa
commit c45bee5327
4 changed files with 48 additions and 0 deletions
@@ -184,7 +184,12 @@ class CommentSaver(originalElements: PsiChildRange, private val saveLineBreaks:
get() = getCopyableUserData(SAVED_TREE_KEY)
set(value) = putCopyableUserData(SAVED_TREE_KEY, value)
var isFinished = false
private set
fun deleteCommentsInside(element: PsiElement) {
assert(!isFinished)
element.accept(object : PsiRecursiveElementVisitor() {
override fun visitComment(comment: PsiComment) {
val treeElement = comment.savedTreeElement
@@ -196,6 +201,7 @@ class CommentSaver(originalElements: PsiChildRange, private val saveLineBreaks:
}
fun elementCreatedByText(createdElement: PsiElement, original: PsiElement, rangeInOriginal: TextRange) {
assert(!isFinished)
assert(createdElement.textLength == rangeInOriginal.length)
assert(createdElement.text == original.text.substring(rangeInOriginal.startOffset, rangeInOriginal.endOffset))
@@ -235,6 +241,7 @@ class CommentSaver(originalElements: PsiChildRange, private val saveLineBreaks:
}
fun restore(resultElements: PsiChildRange, forceAdjustIndent: Boolean = false) {
assert(!isFinished)
assert(!resultElements.isEmpty)
if (commentsToRestore.isNotEmpty() || lineBreaksToRestore.isNotEmpty()) {
@@ -281,6 +288,8 @@ class CommentSaver(originalElements: PsiChildRange, private val saveLineBreaks:
}
CodeStyleManager.getInstance(project).adjustLineIndent(file, resultElements.textRange)
}
isFinished = true
}
private fun restoreComments(resultElements: PsiChildRange) {
@@ -302,6 +311,18 @@ class CommentSaver(originalElements: PsiChildRange, private val saveLineBreaks:
if (commentTreeElement.spaceBefore.isNotEmpty()) {
parent.addAfter(psiFactory.createWhiteSpace(commentTreeElement.spaceBefore), anchorElement)
}
// make sure that there is a line break after EOL_COMMENT
if (restored.tokenType == KtTokens.EOL_COMMENT) {
val whiteSpace = restored.nextLeaf(skipEmptyElements = true) as? PsiWhiteSpace
if (whiteSpace == null) {
parent.addAfter(psiFactory.createWhiteSpace("\n"), restored)
}
else if (!whiteSpace.textContains('\n')) {
val newWhiteSpace = psiFactory.createWhiteSpace("\n" + whiteSpace.text)
whiteSpace.replace(newWhiteSpace)
}
}
}
else {
restored = parent.addBefore(comment, anchorElement) as PsiComment
@@ -0,0 +1,11 @@
fun foo(a: Int) {
<caret>when (a) {
// some comment
0 -> bar(a)
// another comment
1 -> bar(a)
}
}
fun bar(p: Int){}
@@ -0,0 +1,10 @@
fun foo(a: Int) {
if (a
// some comment
== 0) bar(a)
// another comment
else if (a == 1) bar(a)
}
fun bar(p: Int){}
@@ -1675,6 +1675,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
doTest(fileName);
}
@TestMetadata("kt12040.kt")
public void testKt12040() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifWhen/whenToIf/kt12040.kt");
doTest(fileName);
}
@TestMetadata("whenWithDotQualifiedExpression.kt")
public void testWhenWithDotQualifiedExpression() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/branched/ifWhen/whenToIf/whenWithDotQualifiedExpression.kt");