diff --git a/ktlint-ruleset-experimental/src/main/kotlin/com/pinterest/ktlint/ruleset/experimental/ArgumentListWrappingRule.kt b/ktlint-ruleset-experimental/src/main/kotlin/com/pinterest/ktlint/ruleset/experimental/ArgumentListWrappingRule.kt index 884f2f8ac0..cd00342156 100644 --- a/ktlint-ruleset-experimental/src/main/kotlin/com/pinterest/ktlint/ruleset/experimental/ArgumentListWrappingRule.kt +++ b/ktlint-ruleset-experimental/src/main/kotlin/com/pinterest/ktlint/ruleset/experimental/ArgumentListWrappingRule.kt @@ -10,6 +10,7 @@ import com.pinterest.ktlint.core.ast.isRoot import com.pinterest.ktlint.core.ast.isWhiteSpace import com.pinterest.ktlint.core.ast.isWhiteSpaceWithNewline import com.pinterest.ktlint.core.ast.lineIndent +import com.pinterest.ktlint.core.ast.lineNumber import com.pinterest.ktlint.core.ast.prevLeaf import com.pinterest.ktlint.core.ast.visit import kotlin.math.max @@ -18,6 +19,11 @@ import org.jetbrains.kotlin.com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafElement import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.PsiWhiteSpaceImpl +import org.jetbrains.kotlin.psi.KtContainerNode +import org.jetbrains.kotlin.psi.KtDoWhileExpression +import org.jetbrains.kotlin.psi.KtIfExpression +import org.jetbrains.kotlin.psi.KtWhileExpression +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType /** * https://kotlinlang.org/docs/reference/coding-conventions.html#method-call-formatting @@ -86,7 +92,8 @@ class ArgumentListWrappingRule : Rule("argument-list-wrapping") { // VALUE_ARGUMENT... // RPAR val lineIndent = node.lineIndent() - val indent = "\n" + lineIndent.substring(0, (lineIndent.length - adjustedIndent).coerceAtLeast(0)) + val indent = ("\n" + lineIndent.substring(0, (lineIndent.length - adjustedIndent).coerceAtLeast(0))) + .let { if (node.isOnSameLineAsIfKeyword()) it + " ".repeat(indentSize) else it } val paramIndent = indent + " ".repeat(indentSize) nextChild@ for (child in node.children()) { when (child.elementType) { @@ -206,4 +213,13 @@ class ArgumentListWrappingRule : Rule("argument-list-wrapping") { } return null } + + private fun ASTNode.isOnSameLineAsIfKeyword(): Boolean { + val containerNode = psi.getStrictParentOfType() ?: return false + return when (val parent = containerNode.parent) { + is KtIfExpression, is KtWhileExpression -> parent.node + is KtDoWhileExpression -> parent.whileKeyword?.node + else -> null + }?.lineNumber() == lineNumber() + } } diff --git a/ktlint-ruleset-experimental/src/test/kotlin/com/pinterest/ktlint/ruleset/experimental/ArgumentListWrappingRuleTest.kt b/ktlint-ruleset-experimental/src/test/kotlin/com/pinterest/ktlint/ruleset/experimental/ArgumentListWrappingRuleTest.kt index d95c596554..d7e72b683b 100644 --- a/ktlint-ruleset-experimental/src/test/kotlin/com/pinterest/ktlint/ruleset/experimental/ArgumentListWrappingRuleTest.kt +++ b/ktlint-ruleset-experimental/src/test/kotlin/com/pinterest/ktlint/ruleset/experimental/ArgumentListWrappingRuleTest.kt @@ -314,4 +314,112 @@ class ArgumentListWrappingRuleTest { ) ).isEmpty() } + + @Test + fun testLintInIfCondition() { + assertThat( + ArgumentListWrappingRule().lint( + """ + fun test(param1: Int, param2: Int) { + if (listOfNotNull( + param1 + ).isEmpty() + ) { + println(1) + } else if (listOfNotNull( + param2 + ).isEmpty() + ) { + println(2) + } + } + """.trimIndent() + ) + ).isEmpty() + } + + @Test + fun testLintInIfCondition2() { + assertThat( + ArgumentListWrappingRule().lint( + """ + fun test(param1: Int, param2: Int) { + if ( + listOfNotNull( + param1 + ).isEmpty() + ) { + println(1) + } else if ( + listOfNotNull( + param2 + ).isEmpty() + ) { + println(2) + } + } + """.trimIndent() + ) + ).isEmpty() + } + + @Test + fun testLintInWhenCondition() { + assertThat( + ArgumentListWrappingRule().lint( + """ + fun foo(i: Int) = true + + fun test(i: Int) { + when (foo( + i + )) { + true -> println(1) + false -> println(2) + } + } + """.trimIndent() + ) + ).isEmpty() + } + + @Test + fun testLintInWhileCondition() { + assertThat( + ArgumentListWrappingRule().lint( + """ + fun foo(i: Int) = true + + fun test(i: Int) { + while (foo( + i + ) + ) { + println() + } + } + """.trimIndent() + ) + ).isEmpty() + } + + @Test + fun testLintInDoWhileCondition() { + assertThat( + ArgumentListWrappingRule().lint( + """ + fun foo(i: Int) = true + + fun test(i: Int) { + do { + println() + } while (foo( + i + ) + ) + } + """.trimIndent() + ) + ).isEmpty() + } }