aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChiang Fong Lee <myself@cflee.net>2024-05-12 17:14:34 +0800
committerGitHub <noreply@github.com>2024-05-12 11:14:34 +0200
commit238f9f35fc1eff96c71641c29ab231e0d69f62fc (patch)
tree85f8aa82f345e823f09a68ead36bcdc849b3d272
parent605b5e7e390e2ceeb6bf544a65288268dcf96d9e (diff)
downloadktlint-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
-rw-r--r--ktlint-ruleset-standard/src/main/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRule.kt4
-rw-r--r--ktlint-ruleset-standard/src/test/kotlin/com/pinterest/ktlint/ruleset/standard/rules/SpacingAroundOperatorsRuleTest.kt24
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)
+ }
}