diff options
author | Chiang Fong Lee <myself@cflee.net> | 2024-05-12 17:14:34 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-12 11:14:34 +0200 |
commit | 238f9f35fc1eff96c71641c29ab231e0d69f62fc (patch) | |
tree | 85f8aa82f345e823f09a68ead36bcdc849b3d272 | |
parent | 605b5e7e390e2ceeb6bf544a65288268dcf96d9e (diff) | |
download | ktlint-upstream-master.tar.gz |
Fix check for spacing around operator for binary operators inside unary expression (#2653)upstream-master
For example an expression wrapped in `!(<some-binary-expression>)` should check/fix spacing around the operator in the inner binary expression.
Fixes #2652
2 files changed, 27 insertions, 1 deletions
diff --git a/ktlint-ruleset-standard/src/main/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRule.kt b/ktlint-ruleset-standard/src/main/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRule.kt index cb895963..a50826b9 100644 --- a/ktlint-ruleset-standard/src/main/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRule.kt +++ b/ktlint-ruleset-standard/src/main/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRule.kt @@ -31,6 +31,7 @@ import com.pinterest.ktlint.rule.engine.core.api.SinceKtlint import com.pinterest.ktlint.rule.engine.core.api.SinceKtlint.Status.STABLE import com.pinterest.ktlint.rule.engine.core.api.isPartOf import com.pinterest.ktlint.rule.engine.core.api.nextLeaf +import com.pinterest.ktlint.rule.engine.core.api.parent import com.pinterest.ktlint.rule.engine.core.api.prevLeaf import com.pinterest.ktlint.rule.engine.core.api.upsertWhitespaceAfterMe import com.pinterest.ktlint.rule.engine.core.api.upsertWhitespaceBeforeMe @@ -39,6 +40,7 @@ import org.jetbrains.kotlin.com.intellij.lang.ASTNode import org.jetbrains.kotlin.com.intellij.psi.PsiWhiteSpace import org.jetbrains.kotlin.com.intellij.psi.tree.TokenSet import org.jetbrains.kotlin.psi.KtImportDirective +import org.jetbrains.kotlin.psi.KtOperationExpression import org.jetbrains.kotlin.psi.KtPrefixExpression @SinceKtlint("0.1", STABLE) @@ -107,7 +109,7 @@ public class SpacingAroundOperatorsRule : StandardRule("op-spacing") { } } - private fun ASTNode.isUnaryOperator() = isPartOf(KtPrefixExpression::class) + private fun ASTNode.isUnaryOperator() = parent { it.psi is KtOperationExpression }?.psi is KtPrefixExpression private fun ASTNode.isSpreadOperator() = // fn(*array) diff --git a/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRuleTest.kt b/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRuleTest.kt index 86da5807..96b5560e 100644 --- a/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRuleTest.kt +++ b/ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRuleTest.kt @@ -314,4 +314,28 @@ class SpacingAroundOperatorsRuleTest { LintViolation(4, 41, "Missing spacing after \"andThen\""), ).isFormattedAs(formattedCode) } + + @Test + fun `Given a binary operator inside a unary expression`() { + val code = + """ + val foo1 = !(null?:true) + val foo2 = !(null?: true) + val foo3 = !(null ?:true) + val foo4 = !(null ?: true) + """.trimIndent() + val formattedCode = + """ + val foo1 = !(null ?: true) + val foo2 = !(null ?: true) + val foo3 = !(null ?: true) + val foo4 = !(null ?: true) + """.trimIndent() + spacingAroundOperatorsRuleAssertThat(code) + .hasLintViolations( + LintViolation(1, 18, "Missing spacing around \"?:\""), + LintViolation(2, 18, "Missing spacing before \"?:\""), + LintViolation(3, 21, "Missing spacing after \"?:\""), + ).isFormattedAs(formattedCode) + } } |