From c8830e0ced188049c0e6fef4d9fb1f37de2d7f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brais=20Gab=C3=ADn?= Date: Sat, 23 Jul 2022 16:04:15 +0200 Subject: [PATCH 1/2] Use list config for FunctionOnlyReturningConstant>excludedFunctions --- .../main/resources/default-detekt-config.yml | 2 +- .../style/FunctionOnlyReturningConstant.kt | 11 ++++++++--- .../style/FunctionOnlyReturningConstantSpec.kt | 18 +++++++++++++++++- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/detekt-core/src/main/resources/default-detekt-config.yml b/detekt-core/src/main/resources/default-detekt-config.yml index 7be728a345f..204ef6a5150 100644 --- a/detekt-core/src/main/resources/default-detekt-config.yml +++ b/detekt-core/src/main/resources/default-detekt-config.yml @@ -556,7 +556,7 @@ style: active: true ignoreOverridableFunction: true ignoreActualFunction: true - excludedFunctions: '' + excludedFunctions: [] LibraryCodeMustSpecifyReturnType: active: true excludes: ['**'] diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstant.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstant.kt index 56eb25a572b..fce38f4da41 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstant.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstant.kt @@ -8,10 +8,10 @@ import io.gitlab.arturbosch.detekt.api.Entity import io.gitlab.arturbosch.detekt.api.Issue import io.gitlab.arturbosch.detekt.api.Rule import io.gitlab.arturbosch.detekt.api.Severity -import io.gitlab.arturbosch.detekt.api.SplitPattern import io.gitlab.arturbosch.detekt.api.config import io.gitlab.arturbosch.detekt.api.internal.ActiveByDefault import io.gitlab.arturbosch.detekt.api.internal.Configuration +import io.gitlab.arturbosch.detekt.api.simplePatternToRegex import io.gitlab.arturbosch.detekt.rules.isActual import io.gitlab.arturbosch.detekt.rules.isOpen import io.gitlab.arturbosch.detekt.rules.isOverride @@ -52,7 +52,7 @@ class FunctionOnlyReturningConstant(config: Config = Config.empty) : Rule(config private val ignoreActualFunction: Boolean by config(true) @Configuration("excluded functions") - private val excludedFunctions: SplitPattern by config("") { SplitPattern(it) } + private val excludedFunctions: List by config(emptyList()) { it.map(String::simplePatternToRegex) } @Configuration("allows to provide a list of annotations that disable this check") @Deprecated("Use `ignoreAnnotated` instead") @@ -110,7 +110,7 @@ class FunctionOnlyReturningConstant(config: Config = Config.empty) : Rule(config } private fun isNotExcluded(function: KtNamedFunction) = - !excludedFunctions.contains(function.name) && !annotationExcluder.shouldExclude(function.annotationEntries) + function.name !in excludedFunctions && !annotationExcluder.shouldExclude(function.annotationEntries) private fun isReturningAConstant(function: KtNamedFunction) = isConstantExpression(function.bodyExpression) || returnsConstant(function) @@ -127,3 +127,8 @@ class FunctionOnlyReturningConstant(config: Config = Config.empty) : Rule(config return isConstantExpression(returnExpression?.returnedExpression) } } + +private operator fun Iterable.contains(input: String?): Boolean { + input ?: return false + return any { it.matches(input) } +} diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstantSpec.kt b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstantSpec.kt index b674cf7dd2f..8724eee44c8 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstantSpec.kt +++ b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstantSpec.kt @@ -63,13 +63,29 @@ class FunctionOnlyReturningConstantSpec { } @Test - fun `does not report excluded function which returns a constant`() { + fun `does not report excluded function which returns a constant (with string configuration)`() { val code = "fun f() = 1" val config = TestConfig(mapOf(EXCLUDED_FUNCTIONS to "f")) val rule = FunctionOnlyReturningConstant(config) assertThat(rule.compileAndLint(code)).isEmpty() } + @Test + fun `does not report excluded function which returns a constant`() { + val code = "fun f() = 1" + val config = TestConfig(mapOf(EXCLUDED_FUNCTIONS to listOf("f"))) + val rule = FunctionOnlyReturningConstant(config) + assertThat(rule.compileAndLint(code)).isEmpty() + } + + @Test + fun `does not report wildcard excluded function which returns a constant`() { + val code = "fun function() = 1" + val config = TestConfig(mapOf(EXCLUDED_FUNCTIONS to listOf("f*ion"))) + val rule = FunctionOnlyReturningConstant(config) + assertThat(rule.compileAndLint(code)).isEmpty() + } + @Test @DisplayName( "does not report excluded annotated function which returns a constant when given \"kotlin.SinceKotlin\"" From f377c01d1ff84465be7f8a9c0e11b28cb1228e55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brais=20Gab=C3=ADn?= Date: Wed, 3 Aug 2022 16:36:20 +0200 Subject: [PATCH 2/2] Update detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstant.kt Co-authored-by: marschwar --- .../detekt/rules/style/FunctionOnlyReturningConstant.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstant.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstant.kt index fce38f4da41..8b71fcb982b 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstant.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/FunctionOnlyReturningConstant.kt @@ -129,6 +129,5 @@ class FunctionOnlyReturningConstant(config: Config = Config.empty) : Rule(config } private operator fun Iterable.contains(input: String?): Boolean { - input ?: return false - return any { it.matches(input) } + return input != null && any { it.matches(input) } }