Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove rule from NamingRules multi rule #5212

Merged
merged 17 commits into from Sep 10, 2022
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -32,6 +32,9 @@ class ClassNaming(config: Config = Config.empty) : Rule(config) {
private val classPattern: Regex by config("[A-Z][a-zA-Z0-9]*") { it.toRegex() }

override fun visitClassOrObject(classOrObject: KtClassOrObject) {
if (classOrObject.nameAsSafeName.isSpecial || classOrObject.nameIdentifier?.parent?.javaClass == null) {
return
}
if (!classOrObject.identifierName().removeSurrounding("`").matches(classPattern)) {
report(
CodeSmell(
Expand Down
Expand Up @@ -13,6 +13,7 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.rules.identifierName
import io.gitlab.arturbosch.detekt.rules.isOverride
import io.gitlab.arturbosch.detekt.rules.naming.util.isContainingExcludedClassOrObject
import org.jetbrains.kotlin.psi.KtConstructor
import org.jetbrains.kotlin.psi.KtParameter
import org.jetbrains.kotlin.psi.psiUtil.isPrivate

Expand Down Expand Up @@ -42,7 +43,10 @@ class ConstructorParameterNaming(config: Config = Config.empty) : Rule(config) {
private val ignoreOverridden: Boolean by config(true)

override fun visitParameter(parameter: KtParameter) {
if (parameter.isContainingExcludedClassOrObject(excludeClassPattern) || isIgnoreOverridden(parameter)) {
if (!parameter.isConstructor() ||
parameter.isContainingExcludedClassOrObject(excludeClassPattern) ||
isIgnoreOverridden(parameter)
) {
return
}

Expand All @@ -54,7 +58,7 @@ class ConstructorParameterNaming(config: Config = Config.empty) : Rule(config) {
issue,
Entity.from(parameter),
message = "Constructor private parameter names should " +
"match the pattern: $privateParameterPattern"
"match the pattern: $privateParameterPattern"
Fixed Show fixed Hide fixed
)
)
}
Expand All @@ -72,4 +76,8 @@ class ConstructorParameterNaming(config: Config = Config.empty) : Rule(config) {
}

private fun isIgnoreOverridden(parameter: KtParameter) = ignoreOverridden && parameter.isOverride()

private fun KtParameter.isConstructor(): Boolean {
return this.ownerFunction is KtConstructor<*>
}
}
Expand Up @@ -15,6 +15,7 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.rules.identifierName
import io.gitlab.arturbosch.detekt.rules.isOverride
import io.gitlab.arturbosch.detekt.rules.naming.util.isContainingExcludedClass
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtParameter

/**
Expand Down Expand Up @@ -46,7 +47,7 @@ class FunctionParameterNaming(config: Config = Config.empty) : Rule(config) {
private val ignoreOverridden: Boolean by configWithFallback(::ignoreOverriddenFunctions, true)

override fun visitParameter(parameter: KtParameter) {
if (parameter.isContainingExcludedClass(excludeClassPattern)) {
if (parameter.isParameterInFunction()) {
return
}

Expand All @@ -65,4 +66,11 @@ class FunctionParameterNaming(config: Config = Config.empty) : Rule(config) {
)
}
}

private fun KtParameter.isParameterInFunction(): Boolean {
return this.nameAsSafeName.isSpecial ||
(this.nameIdentifier?.parent?.javaClass == null) ||
(this.ownerFunction !is KtNamedFunction) ||
this.isContainingExcludedClass(excludeClassPattern)
}
}
Expand Up @@ -18,9 +18,25 @@ class NamingProvider : DefaultRuleSetProvider {
listOf(
MatchingDeclarationName(config),
MemberNameEqualsClassName(config),
NamingRules(config),
InvalidPackageDeclaration(config),
NoNameShadowing(config)
NoNameShadowing(config),
TopLevelPropertyNaming(config),
BooleanPropertyNaming(config),
LambdaParameterNaming(config),
ConstructorParameterNaming(config),
ForbiddenClassName(config),
ClassNaming(config),
PackageNaming(config),
EnumNaming(config),
ObjectPropertyNaming(config),
FunctionParameterNaming(config),
FunctionNaming(config),
FunctionMinLength(config),
FunctionMaxLength(config),
VariableMaxLength(config),
VariableMinLength(config),
VariableNaming(config),
NonBooleanPropertyPrefixedWithIs(config)
)
)
}

This file was deleted.

Expand Up @@ -13,7 +13,9 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.rules.identifierName
import io.gitlab.arturbosch.detekt.rules.isOverride
import io.gitlab.arturbosch.detekt.rules.naming.util.isContainingExcludedClassOrObject
import org.jetbrains.kotlin.psi.KtObjectDeclaration
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
import org.jetbrains.kotlin.psi.psiUtil.isPrivate
import org.jetbrains.kotlin.resolve.calls.util.isSingleUnderscore

Expand Down Expand Up @@ -43,6 +45,9 @@ class VariableNaming(config: Config = Config.empty) : Rule(config) {
private val ignoreOverridden: Boolean by config(true)

override fun visitProperty(property: KtProperty) {
if (property.isPropertyTopLevelOrInCompanion()) {
return
}
if (property.isSingleUnderscore || property.isContainingExcludedClassOrObject(excludeClassPattern)) {
return
}
Expand All @@ -63,6 +68,13 @@ class VariableNaming(config: Config = Config.empty) : Rule(config) {
}
}

private fun KtProperty.isPropertyTopLevelOrInCompanion(): Boolean {
return this.nameAsSafeName.isSpecial ||
this.getNonStrictParentOfType<KtObjectDeclaration>() != null ||
this.isTopLevel ||
this.nameIdentifier?.parent?.javaClass == null
}

private fun report(property: KtProperty, message: String) {
report(
CodeSmell(
Expand All @@ -74,7 +86,6 @@ class VariableNaming(config: Config = Config.empty) : Rule(config) {
}

companion object {
const val VARIABLE_PATTERN = "variablePattern"
const val EXCLUDE_CLASS_PATTERN = "excludeClassPattern"
}
}
Expand Up @@ -180,7 +180,7 @@ class BooleanPropertyNamingSpec(val env: KotlinCoreEnvironment) {
}

@Test
fun `should not warn about Java Boolean override by default`() {
fun `should not warn about Java Boolean override in data class by default`() {
val code = """
interface Test {
val default: java.lang.Boolean
Expand All @@ -193,6 +193,22 @@ class BooleanPropertyNamingSpec(val env: KotlinCoreEnvironment) {
assertThat(findings).hasSize(1)
}

@Test
fun `should not warn about Java Boolean override by default`() {
val code = """
interface Test {
val default: java.lang.Boolean
}

class TestImpl : Test {
override val default: java.lang.Boolean = java.lang.Boolean(true)
}
""".trimIndent()
val findings = subject.compileAndLintWithContext(env, code)

assertThat(findings).hasSize(1)
}

@Test
fun `should warn about Java Boolean override if ignoreOverridden is false`() {
val code = """
Expand Down
@@ -1,11 +1,38 @@
package io.gitlab.arturbosch.detekt.rules.naming

import io.gitlab.arturbosch.detekt.test.TestConfig
import io.gitlab.arturbosch.detekt.test.assertThat
import io.gitlab.arturbosch.detekt.test.compileAndLint
import org.junit.jupiter.api.Test

class ClassNamingSpec {

@Test
fun `should detekt no violations for abstract class implementation`() {
val code = """
abstract class AbstractClass {
abstract fun foo()
}
val foo = object : AbstractClass() {
override fun foo() {}
}
""".trimIndent()

assertThat(ClassNaming().compileAndLint(code)).isEmpty()
}

@Test
fun `should use custom name for method and class`() {
val config = TestConfig(mapOf(ClassNaming.CLASS_PATTERN to "^aBbD$"))
assertThat(
ClassNaming(config).compileAndLint(
"""
class aBbD{}
""".trimIndent()
)
).isEmpty()
}

@Test
fun `should detect no violations class with numbers`() {
val code = """
Expand Down Expand Up @@ -64,4 +91,16 @@ class ClassNamingSpec {
""".trimIndent()
assertThat(ClassNaming().compileAndLint(code)).isEmpty()
}

@Test
fun `should not detect any`() {
val code = """
data class D(val i: Int, val j: Int)
fun doStuff() {
val (_, HOLY_GRAIL) = D(5, 4)
}
""".trimIndent()

assertThat(ClassNaming().compileAndLint(code)).isEmpty()
}
}
@@ -1,11 +1,26 @@
package io.gitlab.arturbosch.detekt.rules.naming

import io.gitlab.arturbosch.detekt.test.TestConfig
import io.gitlab.arturbosch.detekt.test.assertThat
import io.gitlab.arturbosch.detekt.test.compileAndLint
import org.junit.jupiter.api.Test

class EnumNamingSpec {

@Test
fun `should use custom name for enum`() {
val rule = EnumNaming(TestConfig(mapOf(EnumNaming.ENUM_PATTERN to "^(enum1)|(enum2)$")))
assertThat(
rule.compileAndLint(
"""
enum class aBbD {
enum1, enum2
}
""".trimIndent()
)
).isEmpty()
}

@Test
fun `should detect no violation`() {
val findings = EnumNaming().compileAndLint(
Expand All @@ -25,7 +40,7 @@ class EnumNamingSpec {
default
}
""".trimIndent()
assertThat(NamingRules().compileAndLint(code)).hasSize(1)
assertThat(EnumNaming().compileAndLint(code)).hasSize(1)
}

@Test
Expand Down