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 10 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 @@ -12,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault
import io.gitlab.arturbosch.detekt.api.internal.Configuration
import io.gitlab.arturbosch.detekt.rules.identifierName
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtConstructor
Fixed Show fixed Hide fixed

/**
* Reports class or object names that do not follow the specified naming convention.
Expand All @@ -32,6 +33,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,6 +43,9 @@ class ConstructorParameterNaming(config: Config = Config.empty) : Rule(config) {
private val ignoreOverridden: Boolean by config(true)

override fun visitParameter(parameter: KtParameter) {
if (parameter.nameAsSafeName.isSpecial || parameter.nameIdentifier?.parent?.javaClass == null || parameter.ownerFunction !is KtConstructor<*>) {
Fixed Show fixed Hide fixed
return
}
if (parameter.isContainingExcludedClassOrObject(excludeClassPattern) || isIgnoreOverridden(parameter)) {
return
}
Expand Down
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,6 +47,9 @@ class FunctionParameterNaming(config: Config = Config.empty) : Rule(config) {
private val ignoreOverridden: Boolean by configWithFallback(::ignoreOverriddenFunctions, true)

override fun visitParameter(parameter: KtParameter) {
if (parameter.nameAsSafeName.isSpecial || parameter.nameIdentifier?.parent?.javaClass == null || parameter.ownerFunction !is KtNamedFunction) {
Fixed Show fixed Hide fixed
return
}
if (parameter.isContainingExcludedClass(excludeClassPattern)) {
return
}
Expand Down
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)
}
"""
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 Expand Up @@ -514,22 +530,6 @@ 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 var default: java.lang.Boolean = java.lang.Boolean(true)
}
"""
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,24 @@
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 use custom name for method and class`() {
val config = TestConfig(mapOf(ClassNaming.CLASS_PATTERN to "^aBbD$"))
assertThat(
ClassNaming(config).compileAndLint(
"""
class aBbD{}
"""
)
).isEmpty()
}

@Test
fun `should detect no violations class with numbers`() {
val code = """
Expand Down
@@ -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
}
"""
)
).isEmpty()
}

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

@Test
Expand Down
@@ -0,0 +1,31 @@
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 FunctionMaxLengthSpec {

@Test
fun `should report a function name that is too long base on config`() {
val code = "fun thisFunctionLongName() = 3"
assertThat(
FunctionMaxLength(TestConfig(mapOf("maximumFunctionNameLength" to 10)))
.compileAndLint(code)
)
.hasSize(1)
}

@Test
fun `should report a function name that is too long`() {
val code = "fun thisFunctionIsDefinitelyWayTooLongAndShouldBeMuchShorter() = 3"
assertThat(FunctionMaxLength().compileAndLint(code)).hasSize(1)
}

@Test
fun `should not report a function name that is okay`() {
val code = "fun three() = 3"
assertThat(FunctionMaxLength().compileAndLint(code)).isEmpty()
}
}