diff options
author | JelloRanger <jacob@jabramson.com> | 2018-04-09 00:08:23 -0700 |
---|---|---|
committer | JelloRanger <jacob@jabramson.com> | 2018-04-09 00:08:23 -0700 |
commit | 9a2191c6e798785d22494b7525ea0b4589d0f0e3 (patch) | |
tree | 46550702966e99bdbf409d4afb751cce1be4e232 | |
parent | fd2bc0e87c34bc51090885d90e645f7d565a704f (diff) | |
download | ktlint-9a2191c6e798785d22494b7525ea0b4589d0f0e3.tar.gz |
Fix ModifierRule autoFormat by replacing children elements
- The assumption that whitespace always separates modifiers isn't true
since annotations can be on separate lines.
- Added test case to catch previous error
2 files changed, 33 insertions, 14 deletions
diff --git a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ModifierOrderRule.kt b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ModifierOrderRule.kt index ba07b253..25c5d035 100644 --- a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ModifierOrderRule.kt +++ b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ModifierOrderRule.kt @@ -2,7 +2,6 @@ package com.github.shyiko.ktlint.ruleset.standard import com.github.shyiko.ktlint.core.Rule import org.jetbrains.kotlin.com.intellij.lang.ASTNode -import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.PsiWhiteSpaceImpl import org.jetbrains.kotlin.com.intellij.psi.tree.TokenSet import org.jetbrains.kotlin.lexer.KtTokens.ABSTRACT_KEYWORD import org.jetbrains.kotlin.lexer.KtTokens.ACTUAL_KEYWORD @@ -72,12 +71,8 @@ class ModifierOrderRule : Rule("modifier-order") { sorted.map { it.text }.joinToString(" ") }\")", true) if (autoCorrect) { - node.removeRange(node.firstChildNode, node.lastChildNode.treeNext) - modifierArr.forEachIndexed { i, _ -> - node.addChild(sorted[i], null) - if (i != sorted.size - 1) { - node.addChild(PsiWhiteSpaceImpl(" "), null) - } + modifierArr.forEachIndexed { i, n -> + node.replaceChild(n, sorted[i].clone() as ASTNode) } } } diff --git a/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ModifierOrderRuleTest.kt b/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ModifierOrderRuleTest.kt index 1e99ae93..6f1724c9 100644 --- a/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ModifierOrderRuleTest.kt +++ b/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ModifierOrderRuleTest.kt @@ -27,8 +27,14 @@ class ModifierOrderRuleTest { = if (x == Math.cos(x)) x else findFixPoint(Math.cos(x)) override @Annotation fun getSomething() = "" override @Annotation suspend public @Woohoo(data = "woohoo") fun doSomething() = "" - @AnnotationAboveLine - fun returnsSomething() = "" + @A + @B(v = [ + "foo", + "baz", + "bar" + ]) + @C + suspend public fun returnsSomething() = "" companion object { const internal val V = "" @@ -46,7 +52,13 @@ class ModifierOrderRuleTest { LintError(11, 5, "modifier-order", "Incorrect modifier order (should be \"override tailrec\")"), LintError(13, 5, "modifier-order", "Incorrect modifier order (should be \"@Annotation override\")"), LintError(14, 5, "modifier-order", "Incorrect modifier order (should be \"@Annotation @Woohoo(data = \"woohoo\") public override suspend\")"), - LintError(19, 8, "modifier-order", "Incorrect modifier order (should be \"internal const\")") + LintError(15, 5, "modifier-order", """Incorrect modifier order (should be "@A @B(v = [ + | "foo", + | "baz", + | "bar" + | ]) @C public suspend") + """.trimMargin()), + LintError(25, 8, "modifier-order", "Incorrect modifier order (should be \"internal const\")") )) } @@ -68,8 +80,14 @@ class ModifierOrderRuleTest { = if (x == Math.cos(x)) x else findFixPoint(Math.cos(x)) override @Annotation fun getSomething() = "" suspend @Annotation override public @Woohoo(data = "woohoo") fun doSomething() = "" - @AnnotationAboveLine - fun returnsSomething() = "" + @A + @B(v = [ + "foo", + "baz", + "bar" + ]) + @C + suspend public fun returnsSomething() = "" companion object { const internal val V = "" @@ -92,8 +110,14 @@ class ModifierOrderRuleTest { = if (x == Math.cos(x)) x else findFixPoint(Math.cos(x)) @Annotation override fun getSomething() = "" @Annotation @Woohoo(data = "woohoo") public override suspend fun doSomething() = "" - @AnnotationAboveLine - fun returnsSomething() = "" + @A + @B(v = [ + "foo", + "baz", + "bar" + ]) + @C + public suspend fun returnsSomething() = "" companion object { internal const val V = "" |