@@ -18,14 +18,12 @@ package org.jetbrains.kotlin.idea.intentions
18
18
19
19
import com.intellij.openapi.editor.Editor
20
20
import com.intellij.psi.PsiComment
21
- import com.intellij.psi.PsiElement
22
21
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
26
23
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
29
27
import org.jetbrains.kotlin.psi.psiUtil.startOffset
30
28
import java.lang.IllegalArgumentException
31
29
@@ -59,14 +57,24 @@ class AddBracesIntention : SelfTargetingIntention<KtElement>(KtElement::class.ja
59
57
element.nextSibling!! .delete()
60
58
}
61
59
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()
63
70
64
71
val psiFactory = KtPsiFactory (element)
65
- expression.replace(psiFactory.createSingleStatementBlock(expression, prevComment, nextComment ))
72
+ val result = expression.replace(psiFactory.createSingleStatementBlock(expression))
66
73
67
74
if (element is KtDoWhileExpression ) { // remove new line between '}' and while
68
75
(element.body!! .parent.nextSibling as ? PsiWhiteSpace )?.delete()
69
76
}
77
+ saver.restore(result)
70
78
}
71
79
72
80
private fun KtElement.getTargetExpression (caretLocation : Int ): KtExpression ? {
@@ -86,35 +94,4 @@ class AddBracesIntention : SelfTargetingIntention<KtElement>(KtElement::class.ja
86
94
else -> null
87
95
}
88
96
}
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
-
120
97
}
0 commit comments