From 6d7c03b6fd1f9f914204567956529c4bce69f96b Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Fri, 22 May 2020 14:28:48 +0700 Subject: [PATCH] Get rid of TrailingCommaHelper.needComma --- .../trailingComma/TrailingCommaHelper.kt | 71 ++----------------- .../TrailingCommaPostFormatProcessor.kt | 22 +++--- .../inspections/TrailingCommaInspection.kt | 37 ++++------ 3 files changed, 32 insertions(+), 98 deletions(-) diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/trailingComma/TrailingCommaHelper.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/trailingComma/TrailingCommaHelper.kt index 890d493a175..b1fe7b0bb6f 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/trailingComma/TrailingCommaHelper.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/trailingComma/TrailingCommaHelper.kt @@ -11,10 +11,15 @@ import com.intellij.psi.codeStyle.CodeStyleSettings import com.intellij.psi.tree.TokenSet import com.intellij.psi.util.PsiUtil import org.jetbrains.kotlin.idea.formatter.kotlinCustomSettings -import org.jetbrains.kotlin.idea.util.* +import org.jetbrains.kotlin.idea.util.isComma +import org.jetbrains.kotlin.idea.util.isLineBreak +import org.jetbrains.kotlin.idea.util.leafIgnoringWhitespace +import org.jetbrains.kotlin.idea.util.leafIgnoringWhitespaceAndComments import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.* +import org.jetbrains.kotlin.psi.psiUtil.getPrevSiblingIgnoringWhitespaceAndComments +import org.jetbrains.kotlin.psi.psiUtil.prevLeaf +import org.jetbrains.kotlin.psi.psiUtil.siblings import org.jetbrains.kotlin.utils.addToStdlib.cast object TrailingCommaHelper { @@ -25,26 +30,6 @@ object TrailingCommaHelper { it.prevLeaf(true)?.isLineBreak() == true || it.leafIgnoringWhitespace(false) != it.leafIgnoringWhitespaceAndComments(false) }?.toList().orEmpty() - fun needComma( - commaOwner: KtElement, - settings: CodeStyleSettings?, - checkExistingTrailingComma: Boolean = true, - ): Boolean = when { - commaOwner is KtWhenEntry -> - commaOwner.needTrailingComma(settings, checkExistingTrailingComma) - - commaOwner.parent is KtFunctionLiteral -> - commaOwner.parent.cast().needTrailingComma(settings, checkExistingTrailingComma) - - commaOwner is KtDestructuringDeclaration -> - commaOwner.needTrailingComma(settings, checkExistingTrailingComma) - - else -> (checkExistingTrailingComma && - trailingCommaOrLastElement(commaOwner)?.isComma == true || - settings?.kotlinCustomSettings?.addTrailingCommaIsAllowedFor(commaOwner) != false) && - commaOwner.isMultiline() - } - fun trailingCommaExistsOrCanExist(psiElement: PsiElement, settings: CodeStyleSettings): Boolean = TrailingCommaContext.create(psiElement).commaExistsOrMayExist(settings.kotlinCustomSettings) @@ -99,45 +84,3 @@ object TrailingCommaHelper { else -> lastChild } } - -private fun KtFunctionLiteral.needTrailingComma(settings: CodeStyleSettings?, checkExistingTrailingComma: Boolean = true): Boolean = - needTrailingComma( - settings = settings, - trailingComma = { if (checkExistingTrailingComma) valueParameterList?.trailingComma else null }, - globalStartOffset = { valueParameterList?.startOffset }, - globalEndOffset = { arrow?.endOffset }, - ) - -private fun KtWhenEntry.needTrailingComma(settings: CodeStyleSettings?, checkExistingTrailingComma: Boolean = true): Boolean = - needTrailingComma( - settings = settings, - trailingComma = { if (checkExistingTrailingComma) trailingComma else null }, - additionalCheck = { !isElse && parent.cast().leftParenthesis != null }, - globalEndOffset = { arrow?.endOffset }, - ) - -private fun KtDestructuringDeclaration.needTrailingComma( - settings: CodeStyleSettings?, - checkExistingTrailingComma: Boolean = true -): Boolean = - needTrailingComma( - settings = settings, - trailingComma = { if (checkExistingTrailingComma) trailingComma else null }, - globalStartOffset = { lPar?.startOffset }, - globalEndOffset = { rPar?.endOffset }, - ) - -private fun T.needTrailingComma( - settings: CodeStyleSettings?, - trailingComma: T.() -> PsiElement?, - additionalCheck: () -> Boolean = { true }, - globalStartOffset: T.() -> Int? = PsiElement::startOffset, - globalEndOffset: T.() -> Int? = PsiElement::endOffset, -): Boolean { - if (trailingComma() == null && settings?.kotlinCustomSettings?.addTrailingCommaIsAllowedFor(this) == false) return false - if (!additionalCheck()) return false - - val startOffset = globalStartOffset() ?: return false - val endOffset = globalEndOffset() ?: return false - return containsLineBreakInThis(startOffset, endOffset) -} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/formatter/TrailingCommaPostFormatProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/formatter/TrailingCommaPostFormatProcessor.kt index 9f443219d39..d09b480f809 100644 --- a/idea/src/org/jetbrains/kotlin/idea/formatter/TrailingCommaPostFormatProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/formatter/TrailingCommaPostFormatProcessor.kt @@ -16,13 +16,12 @@ import com.intellij.psi.codeStyle.CodeStyleManager import com.intellij.psi.codeStyle.CodeStyleSettings import com.intellij.psi.impl.source.codeStyle.PostFormatProcessor import com.intellij.psi.impl.source.codeStyle.PostFormatProcessorHelper -import com.intellij.psi.util.PsiUtil.getElementType import org.jetbrains.kotlin.idea.formatter.trailingComma.TrailingCommaHelper.findInvalidCommas -import org.jetbrains.kotlin.idea.formatter.trailingComma.TrailingCommaHelper.needComma import org.jetbrains.kotlin.idea.formatter.trailingComma.TrailingCommaHelper.trailingCommaOrLastElement +import org.jetbrains.kotlin.idea.formatter.trailingComma.TrailingCommaState +import org.jetbrains.kotlin.idea.formatter.trailingComma.addTrailingCommaIsAllowedFor import org.jetbrains.kotlin.idea.util.leafIgnoringWhitespace import org.jetbrains.kotlin.idea.util.leafIgnoringWhitespaceAndComments -import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtPsiFactory import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer @@ -52,25 +51,26 @@ private class TrailingCommaPostFormatVisitor(val settings: CodeStyleSettings) : private fun processCommaOwner(parent: KtElement) { if (!postFormatIsEnable(parent)) return - val lastElement = trailingCommaOrLastElement(parent) ?: return - val elementType = getElementType(lastElement) + val lastElementOrComma = trailingCommaOrLastElement(parent) ?: return updatePsi(parent) { + val stateForElement = TrailingCommaState.stateForElement(parent) when { - needComma(parent, settings, false) -> { + stateForElement == TrailingCommaState.MISSING && settings.kotlinCustomSettings.addTrailingCommaIsAllowedFor(parent) -> { // add a missing comma - if (elementType != KtTokens.COMMA && trailingCommaAllowedInModule(parent)) { - lastElement.addCommaAfter(KtPsiFactory(parent)) + if (trailingCommaAllowedInModule(parent)) { + lastElementOrComma.addCommaAfter(KtPsiFactory(parent)) } correctCommaPosition(parent) } - needComma(parent, settings) -> { + stateForElement == TrailingCommaState.EXISTS -> { correctCommaPosition(parent) } - elementType == KtTokens.COMMA -> { + stateForElement == TrailingCommaState.REDUNDANT -> { // remove redundant comma - lastElement.delete() + lastElementOrComma.delete() } + else -> Unit } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/TrailingCommaInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/TrailingCommaInspection.kt index eb52716edc1..9cc190ff963 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/TrailingCommaInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/TrailingCommaInspection.kt @@ -18,9 +18,10 @@ import com.intellij.psi.PsiElement import com.intellij.psi.PsiElementVisitor import com.intellij.psi.codeStyle.CodeStyleManager import org.jetbrains.kotlin.idea.KotlinBundle -import org.jetbrains.kotlin.idea.formatter.trailingComma.TrailingCommaHelper import org.jetbrains.kotlin.idea.formatter.TrailingCommaVisitor import org.jetbrains.kotlin.idea.formatter.kotlinCustomSettings +import org.jetbrains.kotlin.idea.formatter.trailingComma.TrailingCommaHelper +import org.jetbrains.kotlin.idea.formatter.trailingComma.TrailingCommaState import org.jetbrains.kotlin.idea.formatter.trailingCommaAllowedInModule import org.jetbrains.kotlin.idea.util.isComma import org.jetbrains.kotlin.idea.util.isLineBreak @@ -40,13 +41,16 @@ class TrailingCommaInspection( override fun process(commaOwner: KtElement) { useTrailingComma = CodeStyle.getSettings(commaOwner.project).kotlinCustomSettings.ALLOW_TRAILING_COMMA - val action = TrailingCommaAction.create(commaOwner) - if (action != TrailingCommaAction.REMOVE) { - checkCommaPosition(commaOwner) - checkLineBreaks(commaOwner) + val state = TrailingCommaState.stateForElement(commaOwner) + when (state) { + TrailingCommaState.MISSING, TrailingCommaState.EXISTS -> { + checkCommaPosition(commaOwner) + checkLineBreaks(commaOwner) + } + else -> Unit } - checkTrailingComma(commaOwner, action) + checkTrailingComma(commaOwner, state) } private fun checkLineBreaks(commaOwner: KtElement) { @@ -77,18 +81,17 @@ class TrailingCommaInspection( } } - private fun checkTrailingComma(commaOwner: KtElement, action: TrailingCommaAction) { + private fun checkTrailingComma(commaOwner: KtElement, state: TrailingCommaState) { val trailingCommaOrLastElement = TrailingCommaHelper.trailingCommaOrLastElement(commaOwner) ?: return - if (action == TrailingCommaAction.ADD) { - if (!trailingCommaAllowedInModule(commaOwner) || trailingCommaOrLastElement.isComma) return + if (state == TrailingCommaState.MISSING) { + if (!trailingCommaAllowedInModule(commaOwner)) return reportProblem( trailingCommaOrLastElement, KotlinBundle.message("inspection.trailing.comma.missing.trailing.comma"), KotlinBundle.message("inspection.trailing.comma.add.trailing.comma"), if (addCommaWarning) ProblemHighlightType.GENERIC_ERROR_OR_WARNING else ProblemHighlightType.INFORMATION, ) - } else if (action == TrailingCommaAction.REMOVE) { - if (!trailingCommaOrLastElement.isComma) return + } else if (state == TrailingCommaState.REDUNDANT) { reportProblem( trailingCommaOrLastElement, KotlinBundle.message("inspection.trailing.comma.useless.trailing.comma"), @@ -180,16 +183,4 @@ class TrailingCommaInspection( panel.addCheckbox(KotlinBundle.message("inspection.trailing.comma.report.also.a.missing.comma"), "addCommaWarning") return panel } -} - -private enum class TrailingCommaAction { - ADD, REFORMAT, REMOVE; - - companion object { - fun create(commaOwner: KtElement): TrailingCommaAction = when { - TrailingCommaHelper.needComma(commaOwner, null, checkExistingTrailingComma = false) -> ADD - TrailingCommaHelper.needComma(commaOwner, null, checkExistingTrailingComma = true) -> REFORMAT - else -> REMOVE - } - } } \ No newline at end of file