aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJelloRanger <jacob@jabramson.com>2018-04-29 17:05:00 -0700
committerJelloRanger <jacob@jabramson.com>2018-04-29 17:06:55 -0700
commit1025de12f72bef7a1e69aff508097b07d1aec439 (patch)
treef8e767e989f230120148e0e86680a79216ed7575
parent790710e3d8337250a7d2e76297c2be37d94a3362 (diff)
downloadktlint-1025de12f72bef7a1e69aff508097b07d1aec439.tar.gz
Address feedback on ClassNameMatchesFileNameRule PR
- Get filepath from userData - Ignore non .kt files - Change offset to 0 for errror reporting - Removed ASTNodeExtensions, moved visit() method to internal util file
-rw-r--r--ktlint-core/src/main/kotlin/com/github/shyiko/ktlint/core/ASTNodeExtensions.kt8
-rw-r--r--ktlint-core/src/main/kotlin/com/github/shyiko/ktlint/core/KtLint.kt5
-rw-r--r--ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRule.kt22
-rw-r--r--ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoMultipleSpacesRule.kt1
-rw-r--r--ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoUnusedImportsRule.kt1
-rw-r--r--ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ParameterListWrappingRule.kt1
-rw-r--r--ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/package.kt5
-rw-r--r--ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRuleTest.kt45
8 files changed, 53 insertions, 35 deletions
diff --git a/ktlint-core/src/main/kotlin/com/github/shyiko/ktlint/core/ASTNodeExtensions.kt b/ktlint-core/src/main/kotlin/com/github/shyiko/ktlint/core/ASTNodeExtensions.kt
deleted file mode 100644
index ed42b46d..00000000
--- a/ktlint-core/src/main/kotlin/com/github/shyiko/ktlint/core/ASTNodeExtensions.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.github.shyiko.ktlint.core
-
-import org.jetbrains.kotlin.com.intellij.lang.ASTNode
-
-fun ASTNode.visit(cb: (node: ASTNode) -> Unit) {
- cb(this)
- this.getChildren(null).forEach { it.visit(cb) }
-}
diff --git a/ktlint-core/src/main/kotlin/com/github/shyiko/ktlint/core/KtLint.kt b/ktlint-core/src/main/kotlin/com/github/shyiko/ktlint/core/KtLint.kt
index a1d572a2..fd3b6d3b 100644
--- a/ktlint-core/src/main/kotlin/com/github/shyiko/ktlint/core/KtLint.kt
+++ b/ktlint-core/src/main/kotlin/com/github/shyiko/ktlint/core/KtLint.kt
@@ -487,4 +487,9 @@ object KtLint {
}
return null
}
+
+ private fun ASTNode.visit(cb: (node: ASTNode) -> Unit) {
+ cb(this)
+ this.getChildren(null).forEach { it.visit(cb) }
+ }
}
diff --git a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRule.kt b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRule.kt
index d008fe75..5740b864 100644
--- a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRule.kt
+++ b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRule.kt
@@ -1,7 +1,7 @@
package com.github.shyiko.ktlint.ruleset.standard
+import com.github.shyiko.ktlint.core.KtLint
import com.github.shyiko.ktlint.core.Rule
-import com.github.shyiko.ktlint.core.visit
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
@@ -12,30 +12,32 @@ import java.nio.file.Paths
*/
class ClassNameMatchesFileNameRule : Rule("class-name-matches-file-name"), Rule.Modifier.RestrictToRoot {
- private class NameWithOffset(val name: String, val offset: Int)
-
override fun visit(
node: ASTNode,
autoCorrect: Boolean,
- fileName: String,
emit: (offset: Int, errorMessage: String, canBeAutoCorrected: Boolean) -> Unit
) {
- val topLevelClassNames = mutableListOf<NameWithOffset>()
+ // Ignore all non ".kt" files (including ".kts")
+ if (node.getUserData(KtLint.FILE_PATH_USER_DATA_KEY)?.endsWith(".kt") != true) {
+ return
+ }
+
+ val topLevelClassNames = mutableListOf<String>()
node.visit {
if (it.elementType == KtStubElementTypes.CLASS && it.treeParent.elementType == KtStubElementTypes.FILE) {
val classIdentifier = it.findChildByType(KtTokens.IDENTIFIER)
classIdentifier?.let {
val className = it.text
- topLevelClassNames.add(NameWithOffset(className, it.startOffset))
+ topLevelClassNames.add(className)
}
}
}
- val name = Paths.get(fileName).fileName.toString().substringBefore(".")
- if (topLevelClassNames.size == 1 && name != topLevelClassNames.first().name) {
- emit(topLevelClassNames.first().offset,
- "Single top level class name [${topLevelClassNames.first().name}] does not match file name",
+ val name = Paths.get(node.getUserData(KtLint.FILE_PATH_USER_DATA_KEY)).fileName.toString().substringBefore(".")
+ if (topLevelClassNames.size == 1 && name != topLevelClassNames.first()) {
+ emit(0,
+ "Single top level class name [${topLevelClassNames.first()}] does not match file name",
false)
}
}
diff --git a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoMultipleSpacesRule.kt b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoMultipleSpacesRule.kt
index 8137e923..15aa1a2a 100644
--- a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoMultipleSpacesRule.kt
+++ b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoMultipleSpacesRule.kt
@@ -1,7 +1,6 @@
package com.github.shyiko.ktlint.ruleset.standard
import com.github.shyiko.ktlint.core.Rule
-import com.github.shyiko.ktlint.core.visit
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.com.intellij.openapi.util.TextRange
import org.jetbrains.kotlin.com.intellij.psi.PsiComment
diff --git a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoUnusedImportsRule.kt b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoUnusedImportsRule.kt
index bbe0932d..3b0e1b8f 100644
--- a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoUnusedImportsRule.kt
+++ b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/NoUnusedImportsRule.kt
@@ -1,7 +1,6 @@
package com.github.shyiko.ktlint.ruleset.standard
import com.github.shyiko.ktlint.core.Rule
-import com.github.shyiko.ktlint.core.visit
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.kdoc.lexer.KDocTokens
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 1afd24e7..96c41bdd 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
@@ -1,7 +1,6 @@
package com.github.shyiko.ktlint.ruleset.standard
import com.github.shyiko.ktlint.core.Rule
-import com.github.shyiko.ktlint.core.visit
import org.jetbrains.kotlin.KtNodeTypes
import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.com.intellij.lang.FileASTNode
diff --git a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/package.kt b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/package.kt
index 087a1934..1d64c651 100644
--- a/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/package.kt
+++ b/ktlint-ruleset-standard/src/main/kotlin/com/github/shyiko/ktlint/ruleset/standard/package.kt
@@ -1,5 +1,6 @@
package com.github.shyiko.ktlint.ruleset.standard
+import org.jetbrains.kotlin.com.intellij.lang.ASTNode
import org.jetbrains.kotlin.com.intellij.psi.PsiElement
import org.jetbrains.kotlin.com.intellij.psi.impl.source.tree.LeafPsiElement
import org.jetbrains.kotlin.com.intellij.psi.util.PsiTreeUtil
@@ -11,6 +12,10 @@ internal fun PsiElement.isPartOf(clazz: KClass<out PsiElement>) = getNonStrictPa
internal fun PsiElement.isPartOfString() = isPartOf(KtStringTemplateEntry::class)
internal fun PsiElement.prevLeaf(): LeafPsiElement? = PsiTreeUtil.prevLeaf(this) as LeafPsiElement?
internal fun PsiElement.nextLeaf(): LeafPsiElement? = PsiTreeUtil.nextLeaf(this) as LeafPsiElement?
+internal fun ASTNode.visit(cb: (node: ASTNode) -> Unit) {
+ cb(this)
+ this.getChildren(null).forEach { it.visit(cb) }
+}
internal fun <T> List<T>.head() = this.subList(0, this.size - 1)
internal fun <T> List<T>.tail() = this.subList(1, this.size)
diff --git a/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRuleTest.kt b/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRuleTest.kt
index 6c93070b..675f2d48 100644
--- a/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRuleTest.kt
+++ b/ktlint-ruleset-standard/src/test/kotlin/com/github/shyiko/ktlint/ruleset/standard/ClassNameMatchesFileNameRuleTest.kt
@@ -1,7 +1,7 @@
package com.github.shyiko.ktlint.ruleset.standard
import com.github.shyiko.ktlint.core.LintError
-import com.github.shyiko.ktlint.test.lintWithFileName
+import com.github.shyiko.ktlint.test.lint
import org.assertj.core.api.Assertions.assertThat
import org.testng.annotations.Test
@@ -9,56 +9,73 @@ class ClassNameMatchesFileNameRuleTest {
@Test
fun testMatchingSingleClassName() {
- assertThat(ClassNameMatchesFileNameRule().lintWithFileName("/some/path/A.kt",
+ assertThat(ClassNameMatchesFileNameRule().lint(
"""
class A
- """.trimIndent()
+ """.trimIndent(),
+ fileName("/some/path/A.kt")
)).isEmpty()
}
@Test
fun testNonMatchingSingleClassName() {
- assertThat(ClassNameMatchesFileNameRule().lintWithFileName("A.kt",
+ assertThat(ClassNameMatchesFileNameRule().lint(
"""
class B
- """.trimIndent()
+ """.trimIndent(),
+ fileName("A.kt")
)).isEqualTo(listOf(
- LintError(1, 7, "class-name-matches-file-name", "Single top level class name [B] does not match file name")
+ LintError(1, 1, "class-name-matches-file-name", "Single top level class name [B] does not match file name")
))
}
@Test
fun testMultipleTopLevelClasses() {
- assertThat(ClassNameMatchesFileNameRule().lintWithFileName("A.kt",
+ assertThat(ClassNameMatchesFileNameRule().lint(
"""
class B
class C
- """.trimIndent()
+ """.trimIndent(),
+ fileName("A.kt")
)).isEmpty()
}
@Test
fun testMultipleNonTopLevelClasses() {
- assertThat(ClassNameMatchesFileNameRule().lintWithFileName("A.kt",
+ assertThat(ClassNameMatchesFileNameRule().lint(
"""
class B {
class C
class D
}
- """.trimIndent()
+ """.trimIndent(),
+ fileName("A.kt")
)).isEqualTo(listOf(
- LintError(1, 7, "class-name-matches-file-name", "Single top level class name [B] does not match file name")
+ LintError(1, 1, "class-name-matches-file-name", "Single top level class name [B] does not match file name")
))
}
@Test
fun testCaseSensitiveMatching() {
- assertThat(ClassNameMatchesFileNameRule().lintWithFileName("woohoo.kt",
+ assertThat(ClassNameMatchesFileNameRule().lint(
"""
interface Woohoo
- """.trimIndent()
+ """.trimIndent(),
+ fileName("woohoo.kt")
)).isEqualTo(listOf(
- LintError(1, 11, "class-name-matches-file-name", "Single top level class name [Woohoo] does not match file name")
+ LintError(1, 1, "class-name-matches-file-name", "Single top level class name [Woohoo] does not match file name")
))
}
+
+ @Test
+ fun testIgnoreKotlinScriptFiles() {
+ assertThat(ClassNameMatchesFileNameRule().lint(
+ """
+ class B
+ """.trimIndent(),
+ fileName("A.kts")
+ )).isEmpty()
+ }
+
+ private fun fileName(fileName: String) = mapOf("file_path" to fileName)
}