From f0f1c9a1749c4fd051d780bbd7e7e0e597e24ad8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brais=20Gab=C3=ADn?= Date: Sat, 23 Jul 2022 15:48:32 +0200 Subject: [PATCH 1/3] Support proper globbing in ReturnCount --- .../arturbosch/detekt/rules/style/ReturnCount.kt | 11 ++++++++--- .../detekt/rules/style/ReturnCountSpec.kt | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt index d0ffdba332c..aa2a95d07df 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt @@ -7,10 +7,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.parentsOfTypeUntil import io.gitlab.arturbosch.detekt.rules.yieldStatementsSkippingGuardClauses import org.jetbrains.kotlin.psi.KtCallExpression @@ -60,7 +60,7 @@ class ReturnCount(config: Config = Config.empty) : Rule(config) { private val max: Int by config(2) @Configuration("define a list of function names to be ignored by this check") - private val excludedFunctions: SplitPattern by config(listOf("equals")) { SplitPattern(it.joinToString(",")) } + private val excludedFunctions: List by config(listOf("equals")) { it.map(String::simplePatternToRegex) } @Configuration("if labeled return statements should be ignored") private val excludeLabeled: Boolean by config(false) @@ -90,7 +90,7 @@ class ReturnCount(config: Config = Config.empty) : Rule(config) { } } - private fun shouldBeIgnored(function: KtNamedFunction) = excludedFunctions.contains(function.name) + private fun shouldBeIgnored(function: KtNamedFunction) = function.name in excludedFunctions private fun countReturnStatements(function: KtNamedFunction): Int { fun KtReturnExpression.isExcluded(): Boolean = when { @@ -122,3 +122,8 @@ class ReturnCount(config: Config = Config.empty) : Rule(config) { return false } } + +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/ReturnCountSpec.kt b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCountSpec.kt index 1ce28adf704..08a79502390 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCountSpec.kt +++ b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCountSpec.kt @@ -331,7 +331,7 @@ class ReturnCountSpec { return 6 } - fun test3(x: Int): Int { + fun te_st1(x: Int): Int { when (x) { 5 -> println("x=5") 4 -> return 4 @@ -353,6 +353,19 @@ class ReturnCountSpec { ).compileAndLint(code) assertThat(findings).hasSize(1) } + + @Test + fun `should flag none of the ignored functions using globbing`() { + val findings = ReturnCount( + TestConfig( + mapOf( + MAX to "2", + EXCLUDED_FUNCTIONS to listOf("t*1") + ) + ) + ).compileAndLint(code) + assertThat(findings).hasSize(1) + } } @Nested From 0fffa5811cd718983b8849b1c40080857dd9356a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brais=20Gab=C3=ADn?= Date: Mon, 1 Aug 2022 18:13:39 +0200 Subject: [PATCH 2/3] Improve tests naming --- .../arturbosch/detekt/rules/style/ReturnCountSpec.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCountSpec.kt b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCountSpec.kt index 08a79502390..4b6bc3936c3 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCountSpec.kt +++ b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCountSpec.kt @@ -313,7 +313,7 @@ class ReturnCountSpec { @Nested inner class `a subset of functions are ignored` { val code = """ - fun test1(x: Int): Int { + fun factorial(x: Int): Int { when (x) { 5 -> println("x=5") 4 -> return 4 @@ -322,7 +322,7 @@ class ReturnCountSpec { return 6 } - fun test2(x: Int): Int { + fun fac(x: Int): Int { when (x) { 5 -> println("x=5") 4 -> return 4 @@ -331,7 +331,7 @@ class ReturnCountSpec { return 6 } - fun te_st1(x: Int): Int { + fun fansOfFactorial(x: Int): Int { when (x) { 5 -> println("x=5") 4 -> return 4 @@ -347,7 +347,7 @@ class ReturnCountSpec { TestConfig( mapOf( MAX to "2", - EXCLUDED_FUNCTIONS to listOf("test1", "test2") + EXCLUDED_FUNCTIONS to listOf("factorial", "fac"), ) ) ).compileAndLint(code) @@ -360,7 +360,7 @@ class ReturnCountSpec { TestConfig( mapOf( MAX to "2", - EXCLUDED_FUNCTIONS to listOf("t*1") + EXCLUDED_FUNCTIONS to listOf("fa*ctorial"), ) ) ).compileAndLint(code) From 1af95edaafac0ca5289325144dc0c0f9a58a8a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brais=20Gab=C3=ADn?= Date: Mon, 1 Aug 2022 18:14:29 +0200 Subject: [PATCH 3/3] Update detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt Co-authored-by: marschwar --- .../io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt index aa2a95d07df..e0d05d66850 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ReturnCount.kt @@ -124,6 +124,5 @@ class ReturnCount(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) } }