From dd106cb65c4ccbb96a0c02f28ba44e9f9a69f96b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 27 Feb 2018 17:11:41 +0300 Subject: [PATCH] Add braces: use CommentSaver to save/restore comments Related to KT-16332 --- .../idea/intentions/AddBracesIntention.kt | 55 ++++++------------- 1 file changed, 16 insertions(+), 39 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/AddBracesIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/AddBracesIntention.kt index f56b392aab4..520248cadf4 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/AddBracesIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/AddBracesIntention.kt @@ -18,14 +18,12 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor import com.intellij.psi.PsiComment -import com.intellij.psi.PsiElement import com.intellij.psi.PsiWhiteSpace -import org.jetbrains.kotlin.KtNodeTypes -import org.jetbrains.kotlin.idea.refactoring.getLineNumber -import org.jetbrains.kotlin.j2k.isInSingleLine +import org.jetbrains.kotlin.idea.util.CommentSaver import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.nextLeafs -import org.jetbrains.kotlin.psi.psiUtil.prevLeafs +import org.jetbrains.kotlin.psi.psiUtil.PsiChildRange +import org.jetbrains.kotlin.psi.psiUtil.allChildren +import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespace import org.jetbrains.kotlin.psi.psiUtil.startOffset import java.lang.IllegalArgumentException @@ -59,14 +57,24 @@ class AddBracesIntention : SelfTargetingIntention(KtElement::class.ja element.nextSibling!!.delete() } - val (prevComment, nextComment) = deleteCommentsOnSameLine(expression, element) + val nextComment = when { + element is KtDoWhileExpression -> null // bound to the closing while + element is KtIfExpression && expression === element.then && element.`else` != null -> null // bound to else + else -> element.getNextSiblingIgnoringWhitespace().takeIf { it is PsiComment } + } + val saver = if (nextComment == null) CommentSaver(element) else CommentSaver(PsiChildRange(element, nextComment)) + element.allChildren.filterIsInstance().toList().forEach { + it.delete() + } + nextComment?.delete() val psiFactory = KtPsiFactory(element) - expression.replace(psiFactory.createSingleStatementBlock(expression, prevComment, nextComment)) + val result = expression.replace(psiFactory.createSingleStatementBlock(expression)) if (element is KtDoWhileExpression) { // remove new line between '}' and while (element.body!!.parent.nextSibling as? PsiWhiteSpace)?.delete() } + saver.restore(result) } private fun KtElement.getTargetExpression(caretLocation: Int): KtExpression? { @@ -86,35 +94,4 @@ class AddBracesIntention : SelfTargetingIntention(KtElement::class.ja else -> null } } - - private fun deleteCommentsOnSameLine(expression: KtExpression, element: KtElement): Pair { - val lineNumber = expression.getLineNumber() - - val prevComments = getCommentsOnSameLine(lineNumber, expression.prevLeafs).reversed() - val prevCommentText = createCommentText(prevComments) - - val nextLeafs = when { - expression.parent.node.elementType == KtNodeTypes.THEN && (element as? KtIfExpression)?.`else` != null -> expression.nextLeafs - element is KtDoWhileExpression -> expression.nextLeafs - else -> expression.nextLeafs - } - val nextComments = getCommentsOnSameLine(lineNumber, nextLeafs) - val nextCommentText = createCommentText(nextComments) - - (prevComments + nextComments).forEach { (it as? PsiComment)?.delete() } - - return prevCommentText to nextCommentText - } - - private fun getCommentsOnSameLine(lineNumber: Int, elements: Sequence): List { - return elements - .takeWhile { (it is PsiWhiteSpace || it is PsiComment) && lineNumber == it.getLineNumber() && it.isInSingleLine() } - .dropWhile { it is PsiWhiteSpace } - .toList() - .dropLastWhile { it is PsiWhiteSpace } - } - - private fun createCommentText(comments: List): String? = - if (comments.isEmpty()) null else comments.joinToString("") { it.text } - }