From 84836a0ccb22ff4e634550234497a16b4b7e0b6c Mon Sep 17 00:00:00 2001 From: schalkms Date: Sun, 13 Aug 2017 10:15:20 +0200 Subject: [PATCH 1/2] Added naming rule for packages --- .../detekt/rules/style/NamingConventionViolation.kt | 11 +++++++++++ .../detekt/rules/NamingConventionViolationSpec.kt | 12 ++++++++++++ 2 files changed, 23 insertions(+) diff --git a/detekt-rules/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NamingConventionViolation.kt b/detekt-rules/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NamingConventionViolation.kt index c9e69d8d827..60852fa56cd 100644 --- a/detekt-rules/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NamingConventionViolation.kt +++ b/detekt-rules/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/NamingConventionViolation.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.psi.KtEnumEntry import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtObjectDeclaration +import org.jetbrains.kotlin.psi.KtPackageDirective import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.psi.KtVariableDeclaration import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType @@ -33,6 +34,15 @@ class NamingConventionViolation(config: Config = Config.empty) : Rule(config) { private val methodPattern = Regex(valueOrDefault(METHOD_PATTERN, "^[a-z$][a-zA-Z$0-9]*$")) private val classPattern = Regex(valueOrDefault(CLASS_PATTERN, "^[A-Z$][a-zA-Z$]*$")) private val enumEntryPattern = Regex(valueOrDefault(ENUM_PATTERN, "^[A-Z$][A-Z_$]*$")) + private val packagePattern = Regex(valueOrDefault(PACKAGE_PATTERN, "^[a-z]+(\\.[a-z][a-z0-9]*)*$")) + + override fun visitPackageDirective(directive: KtPackageDirective, data: Void?): Void? { + val name = directive.qualifiedName + if (name.isNotEmpty() && !name.matches(packagePattern)) { + report(CodeSmell(issue, Entity.from(directive))) + } + return null + } override fun visitNamedDeclaration(declaration: KtNamedDeclaration) { if (declaration.nameAsSafeName.isSpecial) return @@ -84,6 +94,7 @@ class NamingConventionViolation(config: Config = Config.empty) : Rule(config) { const val METHOD_PATTERN = "methodPattern" const val CLASS_PATTERN = "classPattern" const val ENUM_PATTERN = "enumEntryPattern" + const val PACKAGE_PATTERN = "packagePattern" } } diff --git a/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/NamingConventionViolationSpec.kt b/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/NamingConventionViolationSpec.kt index ddc6d59197a..2f88b6f8d10 100644 --- a/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/NamingConventionViolationSpec.kt +++ b/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/NamingConventionViolationSpec.kt @@ -46,6 +46,18 @@ class NamingConventionTest { )).hasSize(0) } + @Test + fun inCorrectPackageDirectiveName() { + assertThat(NamingConventionViolation().lint("package NM" + )).hasSize(1) + } + + @Test + fun correctPackageDirectiveName() { + assertThat(NamingConventionViolation().lint("package foo.bar" + )).hasSize(0) + } + @Test fun uppercaseAndUnderscoreAreAllowedLowercaseNotForEnumEntries() { val lint = NamingConventionViolation().lint( From 01cc85cb58ddbe9b727ddbe38514ff7426357905 Mon Sep 17 00:00:00 2001 From: schalkms Date: Mon, 14 Aug 2017 12:06:18 +0200 Subject: [PATCH 2/2] Added more test cases for illegal package name --- .../rules/NamingConventionViolationSpec.kt | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/NamingConventionViolationSpec.kt b/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/NamingConventionViolationSpec.kt index 2f88b6f8d10..abd9cb0d566 100644 --- a/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/NamingConventionViolationSpec.kt +++ b/detekt-rules/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/NamingConventionViolationSpec.kt @@ -47,15 +47,23 @@ class NamingConventionTest { } @Test - fun inCorrectPackageDirectiveName() { - assertThat(NamingConventionViolation().lint("package NM" - )).hasSize(1) + fun upperCasePackageDirectiveName() { + assertThat(NamingConventionViolation().lint("package FOO.BAR")).hasSize(1) + } + + @Test + fun upperCamelCasePackageDirectiveName() { + assertThat(NamingConventionViolation().lint("package Foo.Bar")).hasSize(1) + } + + @Test + fun camelCasePackageDirectiveName() { + assertThat(NamingConventionViolation().lint("package fOO.bAR")).hasSize(1) } @Test fun correctPackageDirectiveName() { - assertThat(NamingConventionViolation().lint("package foo.bar" - )).hasSize(0) + assertThat(NamingConventionViolation().lint("package foo.bar")).hasSize(0) } @Test