Skip to content

Commit dd106cb

Browse files
committed
Add braces: use CommentSaver to save/restore comments
Related to KT-16332
1 parent 4726b44 commit dd106cb

File tree

1 file changed

+16
-39
lines changed

1 file changed

+16
-39
lines changed

idea/src/org/jetbrains/kotlin/idea/intentions/AddBracesIntention.kt

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,12 @@ package org.jetbrains.kotlin.idea.intentions
1818

1919
import com.intellij.openapi.editor.Editor
2020
import com.intellij.psi.PsiComment
21-
import com.intellij.psi.PsiElement
2221
import com.intellij.psi.PsiWhiteSpace
23-
import org.jetbrains.kotlin.KtNodeTypes
24-
import org.jetbrains.kotlin.idea.refactoring.getLineNumber
25-
import org.jetbrains.kotlin.j2k.isInSingleLine
22+
import org.jetbrains.kotlin.idea.util.CommentSaver
2623
import org.jetbrains.kotlin.psi.*
27-
import org.jetbrains.kotlin.psi.psiUtil.nextLeafs
28-
import org.jetbrains.kotlin.psi.psiUtil.prevLeafs
24+
import org.jetbrains.kotlin.psi.psiUtil.PsiChildRange
25+
import org.jetbrains.kotlin.psi.psiUtil.allChildren
26+
import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespace
2927
import org.jetbrains.kotlin.psi.psiUtil.startOffset
3028
import java.lang.IllegalArgumentException
3129

@@ -59,14 +57,24 @@ class AddBracesIntention : SelfTargetingIntention<KtElement>(KtElement::class.ja
5957
element.nextSibling!!.delete()
6058
}
6159

62-
val (prevComment, nextComment) = deleteCommentsOnSameLine(expression, element)
60+
val nextComment = when {
61+
element is KtDoWhileExpression -> null // bound to the closing while
62+
element is KtIfExpression && expression === element.then && element.`else` != null -> null // bound to else
63+
else -> element.getNextSiblingIgnoringWhitespace().takeIf { it is PsiComment }
64+
}
65+
val saver = if (nextComment == null) CommentSaver(element) else CommentSaver(PsiChildRange(element, nextComment))
66+
element.allChildren.filterIsInstance<PsiComment>().toList().forEach {
67+
it.delete()
68+
}
69+
nextComment?.delete()
6370

6471
val psiFactory = KtPsiFactory(element)
65-
expression.replace(psiFactory.createSingleStatementBlock(expression, prevComment, nextComment))
72+
val result = expression.replace(psiFactory.createSingleStatementBlock(expression))
6673

6774
if (element is KtDoWhileExpression) { // remove new line between '}' and while
6875
(element.body!!.parent.nextSibling as? PsiWhiteSpace)?.delete()
6976
}
77+
saver.restore(result)
7078
}
7179

7280
private fun KtElement.getTargetExpression(caretLocation: Int): KtExpression? {
@@ -86,35 +94,4 @@ class AddBracesIntention : SelfTargetingIntention<KtElement>(KtElement::class.ja
8694
else -> null
8795
}
8896
}
89-
90-
private fun deleteCommentsOnSameLine(expression: KtExpression, element: KtElement): Pair<String?, String?> {
91-
val lineNumber = expression.getLineNumber()
92-
93-
val prevComments = getCommentsOnSameLine(lineNumber, expression.prevLeafs).reversed()
94-
val prevCommentText = createCommentText(prevComments)
95-
96-
val nextLeafs = when {
97-
expression.parent.node.elementType == KtNodeTypes.THEN && (element as? KtIfExpression)?.`else` != null -> expression.nextLeafs
98-
element is KtDoWhileExpression -> expression.nextLeafs
99-
else -> expression.nextLeafs
100-
}
101-
val nextComments = getCommentsOnSameLine(lineNumber, nextLeafs)
102-
val nextCommentText = createCommentText(nextComments)
103-
104-
(prevComments + nextComments).forEach { (it as? PsiComment)?.delete() }
105-
106-
return prevCommentText to nextCommentText
107-
}
108-
109-
private fun getCommentsOnSameLine(lineNumber: Int, elements: Sequence<PsiElement>): List<PsiElement> {
110-
return elements
111-
.takeWhile { (it is PsiWhiteSpace || it is PsiComment) && lineNumber == it.getLineNumber() && it.isInSingleLine() }
112-
.dropWhile { it is PsiWhiteSpace }
113-
.toList()
114-
.dropLastWhile { it is PsiWhiteSpace }
115-
}
116-
117-
private fun createCommentText(comments: List<PsiElement>): String? =
118-
if (comments.isEmpty()) null else comments.joinToString("") { it.text }
119-
12097
}

0 commit comments

Comments
 (0)