diff --git a/plugins/kotlin/base/code-insight/minimal/resource/kotlin.base.code-insight.minimal.xml b/plugins/kotlin/base/code-insight/minimal/resource/kotlin.base.code-insight.minimal.xml index 7ca1deb47f15..b1ad55752074 100644 --- a/plugins/kotlin/base/code-insight/minimal/resource/kotlin.base.code-insight.minimal.xml +++ b/plugins/kotlin/base/code-insight/minimal/resource/kotlin.base.code-insight.minimal.xml @@ -22,5 +22,12 @@ + + + + + + + \ No newline at end of file diff --git a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinDeclarationAndAssignmentHandler.kt b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinDeclarationAndAssignmentHandler.kt similarity index 85% rename from plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinDeclarationAndAssignmentHandler.kt rename to plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinDeclarationAndAssignmentHandler.kt index d494f2acb7e1..d3d95da16b62 100644 --- a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinDeclarationAndAssignmentHandler.kt +++ b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinDeclarationAndAssignmentHandler.kt @@ -1,8 +1,7 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. - +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.joinLines -import com.intellij.codeInsight.editorActions.JoinLinesHandlerDelegate.CANNOT_JOIN +import com.intellij.codeInsight.editorActions.JoinLinesHandlerDelegate import com.intellij.codeInsight.editorActions.JoinRawLinesHandlerDelegate import com.intellij.openapi.editor.Document import com.intellij.openapi.util.text.StringUtil @@ -10,9 +9,9 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.util.elementType +import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtBinaryExpression -import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.psiUtil.endOffset @@ -22,18 +21,18 @@ import org.jetbrains.kotlin.psi.psiUtil.startOffset class JoinDeclarationAndAssignmentHandler : JoinRawLinesHandlerDelegate { override fun tryJoinRawLines(document: Document, file: PsiFile, start: Int, end: Int): Int { - if (file !is KtFile) return CANNOT_JOIN + if (file.fileType !is KotlinFileType) return JoinLinesHandlerDelegate.CANNOT_JOIN val element = file.findElementAt(start) ?.siblings(forward = false, withItself = false) - ?.firstOrNull { !isToSkip(it) } ?: return CANNOT_JOIN + ?.firstOrNull { !isToSkip(it) } ?: return JoinLinesHandlerDelegate.CANNOT_JOIN - val (property, assignment) = element.parentsWithSelf.mapNotNull { getPropertyAndAssignment(it) }.firstOrNull() ?: return CANNOT_JOIN + val (property, assignment) = element.parentsWithSelf.mapNotNull { getPropertyAndAssignment(it) }.firstOrNull() ?: return JoinLinesHandlerDelegate.CANNOT_JOIN document.replaceString(property.endOffset, assignment.operationReference.startOffset, " ") return property.startOffset } - override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int) = CANNOT_JOIN + override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int) = JoinLinesHandlerDelegate.CANNOT_JOIN private fun getPropertyAndAssignment(element: PsiElement): Pair? { val property = element as? KtProperty ?: return null @@ -55,4 +54,4 @@ class JoinDeclarationAndAssignmentHandler : JoinRawLinesHandlerDelegate { is PsiWhiteSpace -> StringUtil.getLineBreakCount(element.text) <= 1 // do not skip blank line else -> element.elementType == KtTokens.SEMICOLON } -} +} \ No newline at end of file diff --git a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinStatementsAddSemicolonHandler.kt b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinStatementsAddSemicolonHandler.kt similarity index 61% rename from plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinStatementsAddSemicolonHandler.kt rename to plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinStatementsAddSemicolonHandler.kt index a3e6b7e5bc10..273f318ce222 100644 --- a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinStatementsAddSemicolonHandler.kt +++ b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinStatementsAddSemicolonHandler.kt @@ -1,17 +1,15 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. - +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.joinLines -import com.intellij.codeInsight.editorActions.JoinLinesHandlerDelegate.CANNOT_JOIN +import com.intellij.codeInsight.editorActions.JoinLinesHandlerDelegate import com.intellij.codeInsight.editorActions.JoinRawLinesHandlerDelegate import com.intellij.openapi.editor.Document import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile -import org.jetbrains.kotlin.KtNodeTypes.BLOCK -import org.jetbrains.kotlin.lexer.KtTokens.LBRACE -import org.jetbrains.kotlin.lexer.KtTokens.WHITE_SPACE_OR_COMMENT_BIT_SET +import org.jetbrains.kotlin.KtNodeTypes +import org.jetbrains.kotlin.idea.KotlinFileType +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.parsing.KotlinExpressionParsing -import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtPropertyAccessor import org.jetbrains.kotlin.psi.psiUtil.siblings @@ -19,34 +17,34 @@ import org.jetbrains.kotlin.psi.psiUtil.siblings class JoinStatementsAddSemicolonHandler : JoinRawLinesHandlerDelegate { override fun tryJoinRawLines(document: Document, file: PsiFile, start: Int, end: Int): Int { - if (file !is KtFile) return CANNOT_JOIN + if (file.fileType !is KotlinFileType) return JoinLinesHandlerDelegate.CANNOT_JOIN val linebreak = file.findElementAt(start) ?.siblings(forward = true, withItself = true) ?.firstOrNull { it.textContains('\n') } - ?: return CANNOT_JOIN + ?: return JoinLinesHandlerDelegate.CANNOT_JOIN - val parent = linebreak.parent ?: return CANNOT_JOIN - val element1 = linebreak.firstMaterialSiblingSameLine { prevSibling } ?: return CANNOT_JOIN - val element2 = linebreak.firstMaterialSiblingSameLine { nextSibling } ?: return CANNOT_JOIN + val parent = linebreak.parent ?: return JoinLinesHandlerDelegate.CANNOT_JOIN + val element1 = linebreak.firstMaterialSiblingSameLine { prevSibling } ?: return JoinLinesHandlerDelegate.CANNOT_JOIN + val element2 = linebreak.firstMaterialSiblingSameLine { nextSibling } ?: return JoinLinesHandlerDelegate.CANNOT_JOIN - if (linebreak.text.count { it == '\n' } > 1) return CANNOT_JOIN + if (linebreak.text.count { it == '\n' } > 1) return JoinLinesHandlerDelegate.CANNOT_JOIN if (element1 !is KtPropertyAccessor) { val parentOfElement1 = element1.parent if (parentOfElement1 is KtProperty && parentOfElement1.initializer == null && element2 is KtPropertyAccessor) { - return CANNOT_JOIN + return JoinLinesHandlerDelegate.CANNOT_JOIN } } if ( - (element1 !is KtPropertyAccessor && element2 !is KtPropertyAccessor) && - // `val x=1 fun f(){}` is error; while `fun f(){} val x=1` is OK - (element1 !is KtProperty) + (element1 !is KtPropertyAccessor && element2 !is KtPropertyAccessor) && + // `val x=1 fun f(){}` is error; while `fun f(){} val x=1` is OK + (element1 !is KtProperty) ) { - if (parent.node.elementType != BLOCK) return CANNOT_JOIN - if (!element1.isStatement()) return CANNOT_JOIN - if (!element2.isStatement()) return CANNOT_JOIN + if (parent.node.elementType != KtNodeTypes.BLOCK) return JoinLinesHandlerDelegate.CANNOT_JOIN + if (!element1.isStatement()) return JoinLinesHandlerDelegate.CANNOT_JOIN + if (!element2.isStatement()) return JoinLinesHandlerDelegate.CANNOT_JOIN } document.replaceString(linebreak.textRange.startOffset, linebreak.textRange.endOffset, " ") @@ -55,13 +53,13 @@ class JoinStatementsAddSemicolonHandler : JoinRawLinesHandlerDelegate { return linebreak.textRange.startOffset + 1 } - override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int): Int = CANNOT_JOIN + override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int): Int = JoinLinesHandlerDelegate.CANNOT_JOIN private fun PsiElement.firstMaterialSiblingSameLine(getNext: PsiElement.() -> PsiElement?): PsiElement? { var element = this do { element = element.getNext() ?: return null - if (element.node.elementType !in WHITE_SPACE_OR_COMMENT_BIT_SET) + if (element.node.elementType !in KtTokens.WHITE_SPACE_OR_COMMENT_BIT_SET) return element } while (!element.textContains('\n')) @@ -69,7 +67,7 @@ class JoinStatementsAddSemicolonHandler : JoinRawLinesHandlerDelegate { } private fun PsiElement.isStatement(): Boolean { - if (this.node.elementType == LBRACE) return false + if (this.node.elementType == KtTokens.LBRACE) return false var firstSubElement: PsiElement = this while (true) firstSubElement = firstSubElement.firstChild ?: break diff --git a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinToStringTemplateHandler.kt b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinToStringTemplateHandler.kt similarity index 74% rename from plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinToStringTemplateHandler.kt rename to plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinToStringTemplateHandler.kt index 86a931884d5d..bf52e79dbfd4 100644 --- a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinToStringTemplateHandler.kt +++ b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinToStringTemplateHandler.kt @@ -1,30 +1,32 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. - +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.joinLines +import com.intellij.codeInsight.editorActions.JoinLinesHandlerDelegate import com.intellij.codeInsight.editorActions.JoinRawLinesHandlerDelegate import com.intellij.openapi.editor.Document import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.PsiFile -import org.jetbrains.kotlin.idea.base.psi.getLineCount +import org.jetbrains.kotlin.idea.KotlinFileType +import org.jetbrains.kotlin.idea.util.getLineCount import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.KtBinaryExpression +import org.jetbrains.kotlin.psi.KtOperationReferenceExpression +import org.jetbrains.kotlin.psi.KtPsiFactory +import org.jetbrains.kotlin.psi.KtStringTemplateExpression import org.jetbrains.kotlin.psi.psiUtil.endOffset -import org.jetbrains.kotlin.psi.psiUtil.parents -import org.jetbrains.kotlin.util.match class JoinToStringTemplateHandler : JoinRawLinesHandlerDelegate { override fun tryJoinRawLines(document: Document, file: PsiFile, start: Int, end: Int): Int { - if (file !is KtFile) return -1 + if (file.fileType !is KotlinFileType) return JoinLinesHandlerDelegate.CANNOT_JOIN - if (start == 0) return -1 + if (start == 0) return JoinLinesHandlerDelegate.CANNOT_JOIN val c = document.charsSequence[start] val index = if (c == '\n') start - 1 else start - val plus = file.findElementAt(index)?.takeIf { it.node?.elementType == KtTokens.PLUS } ?: return -1 - var binaryExpr = plus.parents.match(KtOperationReferenceExpression::class, last = KtBinaryExpression::class) + val plus = file.findElementAt(index)?.takeIf { it.node?.elementType == KtTokens.PLUS } ?: return JoinLinesHandlerDelegate.CANNOT_JOIN + var binaryExpr = ((plus.parent as? KtOperationReferenceExpression)?.parent as? KtBinaryExpression) ?.takeIf(KtBinaryExpression::joinable) - ?: return -1 + ?: return JoinLinesHandlerDelegate.CANNOT_JOIN val lineCount = binaryExpr.getLineCount() @@ -37,7 +39,7 @@ class JoinToStringTemplateHandler : JoinRawLinesHandlerDelegate { var rightText = unescape(binaryExpr.right as KtStringTemplateExpression) var left = binaryExpr.left while (left is KtBinaryExpression && left.joinable()) { - val leftLeft = (left as? KtBinaryExpression)?.left ?: break + val leftLeft = left.left ?: break if (leftLeft.getLineCount() < lineCount - 1) break rightText = unescape(left.right as KtStringTemplateExpression) + rightText left = left.left @@ -57,10 +59,10 @@ class JoinToStringTemplateHandler : JoinRawLinesHandlerDelegate { binaryExpr.replace(left) offset } else { - -1 + JoinLinesHandlerDelegate.CANNOT_JOIN } } - else -> -1 + else -> JoinLinesHandlerDelegate.CANNOT_JOIN } } @@ -79,7 +81,7 @@ class JoinToStringTemplateHandler : JoinRawLinesHandlerDelegate { return KtPsiFactory(left.project).createExpression("\"$leftText$rightText\"") as KtStringTemplateExpression } - override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int): Int = -1 + override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int): Int = JoinLinesHandlerDelegate.CANNOT_JOIN } private fun KtBinaryExpression.joinable(): Boolean { @@ -90,4 +92,4 @@ private fun KtBinaryExpression.joinable(): Boolean { is KtBinaryExpression -> left.right is KtStringTemplateExpression else -> false } -} +} \ No newline at end of file diff --git a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinWhenEntryHandler.kt b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinWhenEntryHandler.kt similarity index 61% rename from plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinWhenEntryHandler.kt rename to plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinWhenEntryHandler.kt index f3ad651a4a21..08582d5d986d 100644 --- a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinWhenEntryHandler.kt +++ b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinWhenEntryHandler.kt @@ -1,39 +1,46 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.joinLines -import com.intellij.codeInsight.editorActions.JoinLinesHandlerDelegate.CANNOT_JOIN +import com.intellij.codeInsight.editorActions.JoinLinesHandlerDelegate import com.intellij.codeInsight.editorActions.JoinRawLinesHandlerDelegate import com.intellij.openapi.editor.Document import com.intellij.psi.PsiComment import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.PsiWhiteSpace -import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.psi.KtWhenEntry import org.jetbrains.kotlin.psi.KtWhenExpression -import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.psi.psiUtil.allChildren +import org.jetbrains.kotlin.psi.psiUtil.endOffset +import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespace +import org.jetbrains.kotlin.psi.psiUtil.getNextSiblingIgnoringWhitespaceAndComments +import org.jetbrains.kotlin.psi.psiUtil.getPrevSiblingIgnoringWhitespace +import org.jetbrains.kotlin.psi.psiUtil.getPrevSiblingIgnoringWhitespaceAndComments +import org.jetbrains.kotlin.psi.psiUtil.siblings +import org.jetbrains.kotlin.psi.psiUtil.startOffset class JoinWhenEntryHandler : JoinRawLinesHandlerDelegate { override fun tryJoinRawLines(document: Document, file: PsiFile, start: Int, end: Int): Int { - if (file !is KtFile) return CANNOT_JOIN - val element = file.findElementAt(start) ?: return CANNOT_JOIN + if (file.fileType !is KotlinFileType) return JoinLinesHandlerDelegate.CANNOT_JOIN + val element = file.findElementAt(start) ?: return JoinLinesHandlerDelegate.CANNOT_JOIN - val entry = element.getPrevSiblingIgnoringWhitespaceAndComments() as? KtWhenEntry ?: return CANNOT_JOIN - val entryLastCondition = entry.conditions.lastOrNull() ?: return CANNOT_JOIN - val whenExpression = entry.parent as? KtWhenExpression ?: return CANNOT_JOIN + val entry = element.getPrevSiblingIgnoringWhitespaceAndComments() as? KtWhenEntry ?: return JoinLinesHandlerDelegate.CANNOT_JOIN + val entryLastCondition = entry.conditions.lastOrNull() ?: return JoinLinesHandlerDelegate.CANNOT_JOIN + val whenExpression = entry.parent as? KtWhenExpression ?: return JoinLinesHandlerDelegate.CANNOT_JOIN val prevSiblingIgnoringWhitespace = element.getPrevSiblingIgnoringWhitespace() val nextSiblingIgnoringWhitespace = element.getNextSiblingIgnoringWhitespace() if (nextSiblingIgnoringWhitespace is PsiComment && nextSiblingIgnoringWhitespace.noKtWhenEntryTillNewLine()) - return CANNOT_JOIN + return JoinLinesHandlerDelegate.CANNOT_JOIN - val nextEntry = entry.getNextSiblingIgnoringWhitespaceAndComments() as? KtWhenEntry ?: return CANNOT_JOIN + val nextEntry = entry.getNextSiblingIgnoringWhitespaceAndComments() as? KtWhenEntry ?: return JoinLinesHandlerDelegate.CANNOT_JOIN - if (nextEntry.isElse) return CANNOT_JOIN + if (nextEntry.isElse) return JoinLinesHandlerDelegate.CANNOT_JOIN if (element is PsiWhiteSpace && element.text.contains('\n') && element.noKtWhenEntryTillNewLine(false)) - return CANNOT_JOIN + return JoinLinesHandlerDelegate.CANNOT_JOIN if (entry.hasComments() || nextEntry.hasComments() || !nextEntry.hasSameExpression(entry)) { return joinWithSemicolon(document, @@ -41,28 +48,28 @@ class JoinWhenEntryHandler : JoinRawLinesHandlerDelegate { nextSiblingIgnoringWhitespace ?: nextEntry) } - val nextEntryFirstCondition = nextEntry.conditions.firstOrNull() ?: return CANNOT_JOIN + val nextEntryFirstCondition = nextEntry.conditions.firstOrNull() ?: return JoinLinesHandlerDelegate.CANNOT_JOIN val separator = if (whenExpression.subjectExpression != null) ", " else " || " document.replaceString(entryLastCondition.endOffset, nextEntryFirstCondition.startOffset, separator) return entry.startOffset } private fun joinWithSemicolon( - document: Document, - entry: PsiElement, - nextEntry: PsiElement + document: Document, + entry: PsiElement, + nextEntry: PsiElement ): Int { document.replaceString(entry.textRange.endOffset, nextEntry.textRange.startOffset, "; ") return entry.textRange.endOffset + 1 } - override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int): Int = CANNOT_JOIN + override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int): Int = JoinLinesHandlerDelegate.CANNOT_JOIN private fun KtWhenEntry.hasComments(): Boolean = - allChildren.any { it is PsiComment } || siblings(withItself = false).takeWhile { !it.textContains('\n') }.any { it is PsiComment } + allChildren.any { it is PsiComment } || siblings(withItself = false).takeWhile { !it.textContains('\n') }.any { it is PsiComment } private fun KtWhenEntry.hasSameExpression(other: KtWhenEntry) = expression?.text == other.expression?.text private fun PsiElement.noKtWhenEntryTillNewLine(forward: Boolean = true) = siblings(forward = forward, withItself = false).takeWhile { !it.textContains('\n') }.none { it is KtWhenEntry } -} +} \ No newline at end of file diff --git a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinWithTrailingCommaHandler.kt b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinWithTrailingCommaHandler.kt similarity index 76% rename from plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinWithTrailingCommaHandler.kt rename to plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinWithTrailingCommaHandler.kt index 5f7a25dd7f8b..27814fab002c 100644 --- a/plugins/kotlin/code-insight/impl-base/src/org/jetbrains/kotlin/idea/joinLines/JoinWithTrailingCommaHandler.kt +++ b/plugins/kotlin/base/code-insight/minimal/src/org/jetbrains/kotlin/idea/joinLines/JoinWithTrailingCommaHandler.kt @@ -1,10 +1,9 @@ -// Copyright 2000-2024 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. - +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package org.jetbrains.kotlin.idea.joinLines import com.intellij.codeInsight.editorActions.JoinLinesHandlerDelegate -import com.intellij.codeInsight.editorActions.JoinLinesHandlerDelegate.CANNOT_JOIN import com.intellij.openapi.editor.Document +import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.PsiWhiteSpace @@ -12,29 +11,29 @@ import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.TokenSet import com.intellij.psi.util.elementType import com.intellij.psi.util.nextLeaf -import org.jetbrains.kotlin.idea.base.psi.containsLineBreakInRange +import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.formatter.trailingComma.TrailingCommaHelper import org.jetbrains.kotlin.idea.formatter.trailingComma.TrailingCommaState import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf import org.jetbrains.kotlin.psi.psiUtil.startOffset +import kotlin.math.abs class JoinWithTrailingCommaHandler : JoinLinesHandlerDelegate { override fun tryJoinLines(document: Document, file: PsiFile, start: Int, end: Int): Int { - if (file !is KtFile) return CANNOT_JOIN + if (file.fileType !is KotlinFileType) return JoinLinesHandlerDelegate.CANNOT_JOIN val startElement = file.findElementAt(start) val commaOwner = startElement ?.parentsWithSelf - ?.filter { !document.containsLineBreakInRange(it.textRange) } + ?.filter { !(document.getLineCountInRange(it.textRange) != 0) } ?.find { TrailingCommaState.stateForElement(it) == TrailingCommaState.REDUNDANT } as? KtElement - ?: return CANNOT_JOIN + ?: return JoinLinesHandlerDelegate.CANNOT_JOIN val comma = TrailingCommaHelper.trailingCommaOrLastElement(commaOwner)?.takeIf { it.elementType == KtTokens.COMMA - } ?: return CANNOT_JOIN + } ?: return JoinLinesHandlerDelegate.CANNOT_JOIN comma.nextWhiteSpaceOrNull()?.delete() deleteOrReplaceWithWhiteSpace(comma, comma.nextLeaf()?.elementType) @@ -45,10 +44,10 @@ class JoinWithTrailingCommaHandler : JoinLinesHandlerDelegate { } private val TOKENS_WITH_SPACES = TokenSet.create( - KtTokens.ARROW, - KtTokens.RBRACE, - KtTokens.LBRACE, - KtTokens.COMMA, + KtTokens.ARROW, + KtTokens.RBRACE, + KtTokens.LBRACE, + KtTokens.COMMA, ) private fun deleteOrReplaceWithWhiteSpace(element: PsiElement, type: IElementType?) { @@ -60,3 +59,5 @@ private fun deleteOrReplaceWithWhiteSpace(element: PsiElement, type: IElementTyp } private fun PsiElement.nextWhiteSpaceOrNull(): PsiElement? = nextLeaf().takeIf { it is PsiWhiteSpace } + +fun Document.getLineCountInRange(textRange: TextRange): Int = abs(getLineNumber(textRange.startOffset) - getLineNumber(textRange.endOffset)) \ No newline at end of file diff --git a/plugins/kotlin/base/psi/src/org/jetbrains/kotlin/idea/base/psi/PsiLinesUtils.kt b/plugins/kotlin/base/psi/src/org/jetbrains/kotlin/idea/base/psi/PsiLinesUtils.kt index 527c2f5b2852..00af827715af 100644 --- a/plugins/kotlin/base/psi/src/org/jetbrains/kotlin/idea/base/psi/PsiLinesUtils.kt +++ b/plugins/kotlin/base/psi/src/org/jetbrains/kotlin/idea/base/psi/PsiLinesUtils.kt @@ -8,6 +8,7 @@ import com.intellij.openapi.util.text.StringUtil import com.intellij.psi.* import com.intellij.psi.util.PsiTreeUtil import com.intellij.util.DocumentUtil +import org.jetbrains.annotations.ApiStatus import org.jetbrains.kotlin.psi.psiUtil.endOffset import org.jetbrains.kotlin.psi.psiUtil.startOffset import kotlin.math.abs @@ -74,4 +75,7 @@ fun PsiElement.isOneLiner() = getLineCount() == 1 fun Document.getLineCountInRange(textRange: TextRange): Int = abs(getLineNumber(textRange.startOffset) - getLineNumber(textRange.endOffset)) +@Deprecated("Please use DocumentUtil.getLineCountInRange() instead", ReplaceWith("getLineCountInRange(textRange) != 0")) +@Suppress("unused", "DeprecatedCallableAddReplaceWith") +@ApiStatus.ScheduledForRemoval fun Document.containsLineBreakInRange(textRange: TextRange): Boolean = getLineCountInRange(textRange) != 0 diff --git a/plugins/kotlin/plugin/common/resources/META-INF/kotlin-core.xml b/plugins/kotlin/plugin/common/resources/META-INF/kotlin-core.xml index 06792df2b363..c5f23153fe59 100644 --- a/plugins/kotlin/plugin/common/resources/META-INF/kotlin-core.xml +++ b/plugins/kotlin/plugin/common/resources/META-INF/kotlin-core.xml @@ -368,13 +368,8 @@ - - - - -