From e7c916188bf438dce8d85adcc7d0e0e2fbfa7b21 Mon Sep 17 00:00:00 2001 From: JelloRanger Date: Tue, 1 May 2018 00:39:54 -0700 Subject: [PATCH] Fix ParameterListWrappingRule to correctly identify misplaced left parens --- .../standard/ParameterListWrappingRule.kt | 14 ++- .../standard/ParameterListWrappingRuleTest.kt | 88 +++++++++++++++++++ 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRule.kt b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRule.kt index 3117727bca..16c85b3a46 100644 --- a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRule.kt +++ b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRule.kt @@ -47,12 +47,21 @@ class ParameterListWrappingRule : Rule("parameter-list-wrapping") { if (putParametersOnSeparateLines || maxLineLengthExceeded) { // aiming for // ... LPAR - // VALUE_PARAMETER... - // RPAR + // VALUE_PARAMETER... + // RPAR val indent = "\n" + node.psi.lineIndent() val paramIndent = indent + " ".repeat(indentSize) // single indent as recommended by Jetbrains/Google nextChild@ for (child in node.children()) { when (child.elementType) { + KtTokens.LPAR -> { + val prevLeaf = child.psi.prevLeaf()!! + if (prevLeaf.elementType == KtTokens.WHITE_SPACE && prevLeaf.textContains('\n')) { + emit(child.startOffset, errorMessage(child), true) + if (autoCorrect) { + prevLeaf.delete() + } + } + } KtStubElementTypes.VALUE_PARAMETER, KtTokens.RPAR -> { var paramInnerIndentAdjustment = 0 @@ -128,6 +137,7 @@ class ParameterListWrappingRule : Rule("parameter-list-wrapping") { private fun errorMessage(node: ASTNode) = when (node.elementType) { + KtTokens.LPAR -> """Unnecessary newline before "("""" KtStubElementTypes.VALUE_PARAMETER -> "Parameter should be on a separate line (unless all parameters can fit a single line)" KtTokens.RPAR -> """Missing newline before ")"""" diff --git a/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRuleTest.kt b/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRuleTest.kt index ea8f58aecd..02642351b4 100644 --- a/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRuleTest.kt +++ b/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRuleTest.kt @@ -391,4 +391,92 @@ class ParameterListWrappingRuleTest { LintError(6, 4, "parameter-list-wrapping", "Unexpected indentation (expected 4, actual 3)") )) } + + @Test + fun testLintClassDanglingLeftParen() { + assertThat( + ParameterListWrappingRule().lint( + """ + class ClassA + ( + paramA: String, + paramB: String, + paramC: String + ) + """.trimIndent() + ) + ).isEqualTo( + listOf( + LintError(2, 1, "parameter-list-wrapping", """Unnecessary newline before "("""") + ) + ) + } + + @Test + fun testLintFunctionDanglingLeftParen() { + assertThat( + ParameterListWrappingRule().lint( + """ + fun doSomething + ( + paramA: String, + paramB: String, + paramC: String + ) + """.trimIndent() + ) + ).isEqualTo( + listOf( + LintError(2, 1, "parameter-list-wrapping", """Unnecessary newline before "("""") + ) + ) + } + + @Test + fun testFormatClassDanglingLeftParen() { + assertThat( + ParameterListWrappingRule().format( + """ + class ClassA constructor + ( + paramA: String, + paramB: String, + paramC: String + ) + """.trimIndent() + ) + ).isEqualTo( + """ + class ClassA constructor( + paramA: String, + paramB: String, + paramC: String + ) + """.trimIndent() + ) + } + + @Test + fun testFormatFunctionDanglingLeftParen() { + assertThat( + ParameterListWrappingRule().format( + """ + fun doSomething + ( + paramA: String, + paramB: String, + paramC: String + ) + """.trimIndent() + ) + ).isEqualTo( + """ + fun doSomething( + paramA: String, + paramB: String, + paramC: String + ) + """.trimIndent() + ) + } }