From a16d9c758df1f1430b989e7e5ba703e277778525 Mon Sep 17 00:00:00 2001 From: Chao Zhang Date: Sat, 17 Sep 2022 14:53:26 -0700 Subject: [PATCH] Upgrade ktlint to 0.47.1 --- .../detekt/formatting/FormattingRule.kt | 116 +++++++++++------- .../detekt/formatting/KtLintMultiRule.kt | 30 +---- .../detekt/formatting/wrappers/Indentation.kt | 11 -- .../wrappers/TrailingCommaOnCallSite.kt | 27 ++++ ...a.kt => TrailingCommaOnDeclarationSite.kt} | 16 +-- .../detekt/formatting/wrappers/Wrapping.kt | 9 -- .../detekt/formatting/KtLintMultiRuleSpec.kt | 10 +- .../arturbosch/detekt/formatting/TestFiles.kt | 1 - ...Spec.kt => TrailingCommaOnCallSiteSpec.kt} | 43 +++---- .../TrailingCommaOnDeclarationSiteSpec.kt | 72 +++++++++++ gradle/libs.versions.toml | 2 +- 11 files changed, 200 insertions(+), 137 deletions(-) create mode 100644 detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingCommaOnCallSite.kt rename detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/{TrailingComma.kt => TrailingCommaOnDeclarationSite.kt} (55%) rename detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/{TrailingCommaSpec.kt => TrailingCommaOnCallSiteSpec.kt} (60%) create mode 100644 detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaOnDeclarationSiteSpec.kt diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRule.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRule.kt index defc385ea1e7..001c61f2f09f 100644 --- a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRule.kt +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/FormattingRule.kt @@ -2,8 +2,8 @@ package io.gitlab.arturbosch.detekt.formatting import com.pinterest.ktlint.core.KtLint import com.pinterest.ktlint.core.Rule.VisitorModifier.RunAsLateAsPossible -import com.pinterest.ktlint.core.Rule.VisitorModifier.RunOnRootNodeOnly import com.pinterest.ktlint.core.api.DefaultEditorConfigProperties.codeStyleSetProperty +import com.pinterest.ktlint.core.api.EditorConfigProperties import com.pinterest.ktlint.core.api.UsesEditorConfigProperties import io.github.detekt.psi.fileName import io.github.detekt.psi.toFilePath @@ -20,7 +20,8 @@ import io.gitlab.arturbosch.detekt.api.SourceLocation import io.gitlab.arturbosch.detekt.api.TextLocation import org.ec4j.core.model.Property import org.jetbrains.kotlin.com.intellij.lang.ASTNode -import org.jetbrains.kotlin.com.intellij.lang.FileASTNode +import org.jetbrains.kotlin.com.intellij.psi.impl.source.JavaDummyElement +import org.jetbrains.kotlin.com.intellij.psi.impl.source.JavaDummyHolder import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.psiUtil.endOffset @@ -38,9 +39,6 @@ abstract class FormattingRule(config: Config) : Rule(config) { protected val isAndroid get() = FormattingProvider.android.value(ruleSetConfig) - val runOnRootNodeOnly - get() = RunOnRootNodeOnly in wrapping.visitorModifiers - val runAsLateAsPossible get() = RunAsLateAsPossible in wrapping.visitorModifiers @@ -54,61 +52,87 @@ abstract class FormattingRule(config: Config) : Rule(config) { this.root = root positionByOffset = KtLintLineColCalculator .calculateLineColByOffset(KtLintLineColCalculator.normalizeText(root.text)) + root.node.putUserData(KtLint.FILE_PATH_USER_DATA_KEY, root.name) + + wrapping.beforeFirstNode(computeEditorConfigProperties()) + root.node.visitASTNodes() + wrapping.afterLastNode() + } + + open fun overrideEditorConfigProperties(): Map, String>? = null - val editorConfigProperties = overrideEditorConfigProperties()?.toMutableMap() + open fun getTextLocationForViolation(node: ASTNode, offset: Int) = + TextLocation(node.startOffset, node.psi.endOffset) + + private fun computeEditorConfigProperties(): EditorConfigProperties { + val usesEditorConfigProperties = overrideEditorConfigProperties()?.toMutableMap() ?: mutableMapOf() if (isAndroid) { - editorConfigProperties[codeStyleSetProperty] = "android" + usesEditorConfigProperties[codeStyleSetProperty] = "android" } - if (editorConfigProperties.isNotEmpty()) { - val userData = (root.node.getUserData(KtLint.EDITOR_CONFIG_PROPERTIES_USER_DATA_KEY).orEmpty()) - .toMutableMap() - - editorConfigProperties.forEach { (editorConfigProperty, defaultValue) -> - userData[editorConfigProperty.type.name] = Property.builder() - .name(editorConfigProperty.type.name) - .type(editorConfigProperty.type) - .value(defaultValue) - .build() + return buildMap { + usesEditorConfigProperties.forEach { (editorConfigProperty, defaultValue) -> + put( + key = editorConfigProperty.type.name, + value = Property.builder() + .name(editorConfigProperty.type.name) + .type(editorConfigProperty.type) + .value(defaultValue) + .build() + ) } - root.node.putUserData(KtLint.EDITOR_CONFIG_PROPERTIES_USER_DATA_KEY, userData) } - root.node.putUserData(KtLint.FILE_PATH_USER_DATA_KEY, root.name) } - open fun overrideEditorConfigProperties(): Map, String>? = null - - fun apply(node: ASTNode) { - if (ruleShouldOnlyRunOnFileNode(node)) { - return + private fun beforeVisitChildNodes(node: ASTNode) { + wrapping.beforeVisitChildNodes(node, autoCorrect) { + offset, errorMessage, canBeAutoCorrected -> emit.invoke(offset, errorMessage, canBeAutoCorrected) } + } - wrapping.visit(node, autoCorrect) { offset, message, _ -> - val (line, column) = positionByOffset(offset) - val location = Location( - SourceLocation(line, column), - getTextLocationForViolation(node, offset), - root.toFilePath() - ) - - // Nodes reported by 'NoConsecutiveBlankLines' are dangling whitespace nodes which means they have - // no direct parent which we can use to get the containing file needed to baseline or suppress findings. - // For these reasons we do not report a KtElement which may lead to crashes when postprocessing it - // e.g. reports (html), baseline etc. - val packageName = root.packageFqName.asString() - .takeIf { it.isNotEmpty() } - ?.plus(".") - .orEmpty() - val entity = Entity("", "$packageName${root.fileName}:$line", location, root) - report(CorrectableCodeSmell(issue, entity, message, autoCorrectEnabled = autoCorrect)) + private fun afterVisitChildNodes(node: ASTNode) { + wrapping.afterVisitChildNodes(node, autoCorrect) { + offset, errorMessage, canBeAutoCorrected -> emit.invoke(offset, errorMessage, canBeAutoCorrected) } } - open fun getTextLocationForViolation(node: ASTNode, offset: Int) = - TextLocation(node.startOffset, node.psi.endOffset) + private val emit = { offset: Int, message: String, _: Boolean -> + val (line, column) = positionByOffset(offset) + val location = Location( + SourceLocation(line, column), + // Use offset + 1 since ktlint always reports a single location. + TextLocation(offset, offset + 1), + root.toFilePath() + ) + + // Nodes reported by 'NoConsecutiveBlankLines' are dangling whitespace nodes which means they have + // no direct parent which we can use to get the containing file needed to baseline or suppress findings. + // For these reasons we do not report a KtElement which may lead to crashes when postprocessing it + // e.g. reports (html), baseline etc. + val packageName = root.packageFqName.asString() + .takeIf { it.isNotEmpty() } + ?.plus(".") + .orEmpty() + val entity = Entity("", "$packageName${root.fileName}:$line", location, root) + report(CorrectableCodeSmell(issue, entity, message, autoCorrectEnabled = autoCorrect)) + } - private fun ruleShouldOnlyRunOnFileNode(node: ASTNode) = - runOnRootNodeOnly && node !is FileASTNode + private fun ASTNode.visitASTNodes() { + if (isNotDummyElement()) { + beforeVisitChildNodes(this) + } + getChildren(null).forEach { + it.visitASTNodes() + } + if (isNotDummyElement()) { + afterVisitChildNodes(this) + } + } + + private fun ASTNode.isNotDummyElement(): Boolean { + val parent = this.psi?.parent + return parent !is JavaDummyHolder && parent !is JavaDummyElement + } } diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRule.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRule.kt index b003a594357d..403d768d5268 100644 --- a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRule.kt +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRule.kt @@ -57,7 +57,8 @@ import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingBetweenDeclaration import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingBetweenDeclarationsWithComments import io.gitlab.arturbosch.detekt.formatting.wrappers.SpacingBetweenFunctionNameAndOpeningParenthesis import io.gitlab.arturbosch.detekt.formatting.wrappers.StringTemplate -import io.gitlab.arturbosch.detekt.formatting.wrappers.TrailingComma +import io.gitlab.arturbosch.detekt.formatting.wrappers.TrailingCommaOnCallSite +import io.gitlab.arturbosch.detekt.formatting.wrappers.TrailingCommaOnDeclarationSite import io.gitlab.arturbosch.detekt.formatting.wrappers.TypeArgumentListSpacing import io.gitlab.arturbosch.detekt.formatting.wrappers.TypeParameterListSpacing import io.gitlab.arturbosch.detekt.formatting.wrappers.UnnecessaryParenthesesBeforeTrailingLambda @@ -119,7 +120,8 @@ class KtLintMultiRule(config: Config = Config.empty) : SpacingBetweenDeclarationsWithAnnotations(config), SpacingBetweenDeclarationsWithComments(config), StringTemplate(config), - TrailingComma(config), // in standard ruleset but not enabled by default + TrailingCommaOnCallSite(config), // in standard ruleset but not enabled by default + TrailingCommaOnDeclarationSite(config), // in standard ruleset but not enabled by default Wrapping(config), // Wrappers for ktlint-ruleset-experimental rules. Disabled by default. @@ -142,43 +144,23 @@ class KtLintMultiRule(config: Config = Config.empty) : ) override fun visit(root: KtFile) { - val sortedRules = getSortedRules() - sortedRules.forEach { it.visit(root) } - root.node.visitTokens { node -> - sortedRules.forEach { it.apply(node) } + getSortedRules().forEach { rule -> + rule.visit(root) } } internal fun getSortedRules(): List { - val runFirstOnRoot = mutableListOf() val other = mutableListOf() - val runLastOnRoot = mutableListOf() val runLast = mutableListOf() for (rule in activeRules.filterIsInstance()) { when { - rule.runOnRootNodeOnly && rule.runAsLateAsPossible -> runLastOnRoot.add(rule) - rule.runOnRootNodeOnly -> runFirstOnRoot.add(rule) rule.runAsLateAsPossible -> runLast.add(rule) else -> other.add(rule) } } return LinkedList().apply { - addAll(runFirstOnRoot) addAll(other) - addAll(runLastOnRoot) addAll(runLast) } } - - private fun ASTNode.visitTokens(currentNode: (ASTNode) -> Unit) { - if (this.isNoFakeElement()) { - currentNode(this) - } - getChildren(null).forEach { it.visitTokens(currentNode) } - } - - private fun ASTNode.isNoFakeElement(): Boolean { - val parent = this.psi?.parent - return parent !is JavaDummyHolder && parent !is JavaDummyElement - } } diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/Indentation.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/Indentation.kt index f943995d3473..f212da79a303 100644 --- a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/Indentation.kt +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/Indentation.kt @@ -34,15 +34,4 @@ class Indentation(config: Config) : FormattingRule(config) { mapOf( DefaultEditorConfigProperties.indentSizeProperty to indentSize.toString(), ) - - /** - * [IndentationRule] has visitor modifier RunOnRootNodeOnly, so [node] is always the root file. - * Override the parent implementation to highlight the entire file. - */ - override fun getTextLocationForViolation(node: ASTNode, offset: Int): TextLocation { - val relativeEnd = node.text - .drop(offset) - .indexOfFirst { !it.isWhitespace() } - return TextLocation(offset, offset + relativeEnd) - } } diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingCommaOnCallSite.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingCommaOnCallSite.kt new file mode 100644 index 000000000000..6d84b46ac2e7 --- /dev/null +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingCommaOnCallSite.kt @@ -0,0 +1,27 @@ +package io.gitlab.arturbosch.detekt.formatting.wrappers + +import com.pinterest.ktlint.core.api.UsesEditorConfigProperties +import com.pinterest.ktlint.ruleset.standard.TrailingCommaOnCallSiteRule +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.config +import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable +import io.gitlab.arturbosch.detekt.api.internal.Configuration +import io.gitlab.arturbosch.detekt.formatting.FormattingRule + +/** + * See [ktlint docs](https://pinterest.github.io/ktlint/rules/standard/) for documentation. + */ +@AutoCorrectable(since = "1.23.0") +class TrailingCommaOnCallSite(config: Config) : FormattingRule(config) { + + override val wrapping = TrailingCommaOnCallSiteRule() + override val issue = issueFor("Rule to mandate/forbid trailing commas") + + @Configuration("Defines whether a trailing comma (or no trailing comma) should be enforced on the call side") + private val allowTrailingComma by config(false) + + override fun overrideEditorConfigProperties(): Map, String> = + mapOf( + TrailingCommaOnCallSiteRule.allowTrailingCommaOnCallSiteProperty to allowTrailingComma.toString(), + ) +} diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingComma.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingCommaOnDeclarationSite.kt similarity index 55% rename from detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingComma.kt rename to detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingCommaOnDeclarationSite.kt index 98ca6a7e3e11..b6ea120c60e7 100644 --- a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingComma.kt +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/TrailingCommaOnDeclarationSite.kt @@ -1,7 +1,7 @@ package io.gitlab.arturbosch.detekt.formatting.wrappers import com.pinterest.ktlint.core.api.UsesEditorConfigProperties -import com.pinterest.ktlint.ruleset.experimental.trailingcomma.TrailingCommaRule +import com.pinterest.ktlint.ruleset.standard.TrailingCommaOnDeclarationSiteRule import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.config import io.gitlab.arturbosch.detekt.api.internal.AutoCorrectable @@ -11,21 +11,17 @@ import io.gitlab.arturbosch.detekt.formatting.FormattingRule /** * See [ktlint docs](https://pinterest.github.io/ktlint/rules/standard/) for documentation. */ -@AutoCorrectable(since = "1.20.0") -class TrailingComma(config: Config) : FormattingRule(config) { +@AutoCorrectable(since = "1.23.0") +class TrailingCommaOnDeclarationSite(config: Config) : FormattingRule(config) { - override val wrapping = TrailingCommaRule() + override val wrapping = TrailingCommaOnDeclarationSiteRule() override val issue = issueFor("Rule to mandate/forbid trailing commas") - @Configuration("Defines whether a trailing comma (or no trailing comma) should be enforced on the defining side") + @Configuration("Defines whether a trailing comma (or no trailing comma) should be enforced on the declaration side") private val allowTrailingComma by config(false) - @Configuration("Defines whether a trailing comma (or no trailing comma) should be enforced on the calling side") - private val allowTrailingCommaOnCallSite by config(false) - override fun overrideEditorConfigProperties(): Map, String> = mapOf( - TrailingCommaRule.allowTrailingCommaProperty to allowTrailingComma.toString(), - TrailingCommaRule.allowTrailingCommaOnCallSiteProperty to allowTrailingCommaOnCallSite.toString(), + TrailingCommaOnDeclarationSiteRule.allowTrailingCommaProperty to allowTrailingComma.toString(), ) } diff --git a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/Wrapping.kt b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/Wrapping.kt index 82b0283ac02f..33a84300a094 100644 --- a/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/Wrapping.kt +++ b/detekt-formatting/src/main/kotlin/io/gitlab/arturbosch/detekt/formatting/wrappers/Wrapping.kt @@ -25,15 +25,6 @@ class Wrapping(config: Config) : FormattingRule(config) { @Configuration("indentation size") private val indentSize by config(4) - /** - * [Wrapping] has visitor modifier RunOnRootNodeOnly, so [node] is always the root file. - * Override the parent implementation to highlight the entire file. - */ - override fun getTextLocationForViolation(node: ASTNode, offset: Int): TextLocation { - // Use offset + 1 since Wrapping always reports the location of missing new line. - return TextLocation(offset, offset + 1) - } - override fun overrideEditorConfigProperties(): Map, String> = mapOf( DefaultEditorConfigProperties.indentSizeProperty to indentSize.toString(), diff --git a/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRuleSpec.kt b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRuleSpec.kt index 9b225f911732..5fd78570a245 100644 --- a/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRuleSpec.kt +++ b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/KtLintMultiRuleSpec.kt @@ -13,14 +13,8 @@ class KtLintMultiRuleSpec { ktlintRule.visitFile(compileContentForTest("")) val sortedRules = ktlintRule.getSortedRules() assertThat(sortedRules).isNotEmpty - assertThat(sortedRules.indexOfFirst { it.runOnRootNodeOnly }) + assertThat(sortedRules.indexOfFirst { !it.runAsLateAsPossible }) .isGreaterThan(-1) - .isLessThan(sortedRules.indexOfFirst { !it.runOnRootNodeOnly }) - assertThat(sortedRules.indexOfFirst { !it.runOnRootNodeOnly }) - .isGreaterThan(-1) - .isLessThan(sortedRules.indexOfFirst { it.runOnRootNodeOnly && it.runAsLateAsPossible }) - assertThat(sortedRules.indexOfFirst { it.runOnRootNodeOnly && it.runAsLateAsPossible }) - .isGreaterThan(-1) - .isLessThan(sortedRules.indexOfFirst { it.runAsLateAsPossible && !it.runOnRootNodeOnly }) + .isLessThan(sortedRules.indexOfFirst { it.runAsLateAsPossible }) } } diff --git a/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TestFiles.kt b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TestFiles.kt index 636725d4dbc2..2989a7a54bce 100644 --- a/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TestFiles.kt +++ b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TestFiles.kt @@ -13,7 +13,6 @@ import java.nio.file.Paths fun FormattingRule.lint(@Language("kotlin") content: String, fileName: String = "Test.kt"): List { val root = compileContentForTest(content, fileName) this.visit(root) - root.node.visit { node -> this.apply(node) } return this.findings } diff --git a/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaSpec.kt b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaOnCallSiteSpec.kt similarity index 60% rename from detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaSpec.kt rename to detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaOnCallSiteSpec.kt index f72703cb707c..4f9a54fe7c2a 100644 --- a/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaSpec.kt +++ b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaOnCallSiteSpec.kt @@ -1,30 +1,27 @@ package io.gitlab.arturbosch.detekt.formatting -import io.gitlab.arturbosch.detekt.formatting.wrappers.TrailingComma +import io.gitlab.arturbosch.detekt.formatting.wrappers.TrailingCommaOnCallSite import io.gitlab.arturbosch.detekt.test.TestConfig import io.gitlab.arturbosch.detekt.test.assertThat import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test -private const val ALLOW_TRAILING_COMMA = "allowTrailingComma" -private const val ALLOW_TRAILING_COMMA_ON_CALL_SITE = "allowTrailingCommaOnCallSite" - /** * Some test cases were used directly from KtLint to verify the wrapper rule: * - * https://github.com/pinterest/ktlint/blob/master/ktlint-ruleset-experimental/src/test/kotlin/com/pinterest/ktlint/ruleset/experimental/TrailingCommaRuleTest.kt + * https://github.com/pinterest/ktlint/blob/master/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/TrailingCommaOnCallSiteRuleTest.kt */ -class TrailingCommaSpec { +class TrailingCommaOnCallSiteSpec { @Nested - inner class `unnecessary comma` { + inner class Unnecessary { @Test fun `reports unnecessary comma on function call`() { val code = """ val foo1 = listOf("a", "b",) """.trimIndent() - val findings = TrailingComma(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) + val findings = TrailingCommaOnCallSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) assertThat(findings).hasSize(1) } @@ -33,7 +30,7 @@ class TrailingCommaSpec { val code = """ val foo2 = Pair(1, 2,) """.trimIndent() - val findings = TrailingComma(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) + val findings = TrailingCommaOnCallSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) assertThat(findings).hasSize(1) } @@ -42,7 +39,7 @@ class TrailingCommaSpec { val code = """ val foo3: List = emptyList() """.trimIndent() - val findings = TrailingComma(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) + val findings = TrailingCommaOnCallSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) assertThat(findings).hasSize(1) } @@ -52,7 +49,7 @@ class TrailingCommaSpec { val foo4 = Array(2) { 42 } val bar4 = foo4[1,] """.trimIndent() - val findings = TrailingComma(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) + val findings = TrailingCommaOnCallSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) assertThat(findings).hasSize(1) } @@ -62,25 +59,13 @@ class TrailingCommaSpec { @Foo5([1, 2,]) val foo5: Int = 0 """.trimIndent() - val findings = TrailingComma(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) + val findings = TrailingCommaOnCallSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) assertThat(findings).hasSize(1) } } @Nested - inner class `missing comma` { - - @Test - fun `reports missing comma on field definition`() { - val code = """ - data class Foo1(val bar: Int) - data class Foo2( - val bar: Int - ) - """.trimIndent() - val findings = TrailingComma(TestConfig(mapOf(ALLOW_TRAILING_COMMA to true))).lint(code) - assertThat(findings).hasSize(1) - } + inner class MissingComma { @Test fun `reports missing comma on function call`() { @@ -91,7 +76,7 @@ class TrailingCommaSpec { "b" ) """.trimIndent() - val findings = TrailingComma(TestConfig(mapOf(ALLOW_TRAILING_COMMA_ON_CALL_SITE to true))).lint(code) + val findings = TrailingCommaOnCallSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to true))).lint(code) assertThat(findings).hasSize(1) } @@ -104,8 +89,12 @@ class TrailingCommaSpec { 2 ) """.trimIndent() - val findings = TrailingComma(TestConfig(mapOf(ALLOW_TRAILING_COMMA_ON_CALL_SITE to true))).lint(code) + val findings = TrailingCommaOnCallSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to true))).lint(code) assertThat(findings).hasSize(1) } } + + private companion object { + private const val ALLOW_TRAILING_COMMA = "allowTrailingComma" + } } diff --git a/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaOnDeclarationSiteSpec.kt b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaOnDeclarationSiteSpec.kt new file mode 100644 index 000000000000..3c60ebbf4b62 --- /dev/null +++ b/detekt-formatting/src/test/kotlin/io/gitlab/arturbosch/detekt/formatting/TrailingCommaOnDeclarationSiteSpec.kt @@ -0,0 +1,72 @@ +package io.gitlab.arturbosch.detekt.formatting + +import io.gitlab.arturbosch.detekt.formatting.wrappers.TrailingCommaOnDeclarationSite +import io.gitlab.arturbosch.detekt.test.TestConfig +import io.gitlab.arturbosch.detekt.test.assertThat +import org.junit.jupiter.api.Nested +import org.junit.jupiter.api.Test + +/** + * Some test cases were used directly from KtLint to verify the wrapper rule: + * + * https://github.com/pinterest/ktlint/blob/master/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/TrailingCommaOnDeclarationSiteRuleTest.kt + */ +class TrailingCommaOnDeclarationSiteSpec { + + @Nested + inner class UnnecessaryComma { + + @Test + fun `reports unnecessary comma on generic type definition`() { + val code = """ + class Foo1 {} + """.trimIndent() + val findings = TrailingCommaOnDeclarationSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) + assertThat(findings).hasSize(1) + } + + @Test + fun `reports unnecessary comma on property definition`() { + val code = """ + data class Foo1(val bar: Int,) + data class Foo2( + val bar: Int, + ) + """.trimIndent() + val findings = TrailingCommaOnDeclarationSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to false))).lint(code) + assertThat(findings).hasSize(2) + } + } + + @Nested + inner class MissingComma { + + @Test + fun `reports missing comma on generic type definition`() { + val code = """ + class Foo1< + A, + B + > {} + """.trimIndent() + val findings = TrailingCommaOnDeclarationSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to true))).lint(code) + assertThat(findings).hasSize(1) + } + + @Test + fun `reports missing comma on property definition`() { + val code = """ + data class Foo1(val bar: Int) + data class Foo2( + val bar: Int + ) + """.trimIndent() + val findings = TrailingCommaOnDeclarationSite(TestConfig(mapOf(ALLOW_TRAILING_COMMA to true))).lint(code) + assertThat(findings).hasSize(1) + } + } + + private companion object { + private const val ALLOW_TRAILING_COMMA = "allowTrailingComma" + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6359d7a28cfa..be0e35f6787e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ dokka = "1.7.10" jacoco = "0.8.8" kotlin = "1.7.10" -ktlint = "0.46.1" +ktlint = "0.47.1" junit = "5.9.0" contester = "0.2.0"