diff options
author | JelloRanger <jacob@jabramson.com> | 2018-04-29 17:05:00 -0700 |
---|---|---|
committer | JelloRanger <jacob@jabramson.com> | 2018-04-29 17:06:55 -0700 |
commit | 1025de12f72bef7a1e69aff508097b07d1aec439 (patch) | |
tree | f8e767e989f230120148e0e86680a79216ed7575 | |
parent | 790710e3d8337250a7d2e76297c2be37d94a3362 (diff) | |
download | ktlint-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
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) } |