From d8e55789cf0c9ef7481001b46c71c48a1a931184 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Brais=20Gab=C3=ADn?= Date: Sat, 4 Jun 2022 13:20:02 +0200 Subject: [PATCH] Add support for reasons in ForbiddenMethodCall --- .../detekt/rules/style/ForbiddenMethodCall.kt | 24 +++++++++++++------ .../rules/style/ForbiddenMethodCallSpec.kt | 6 +++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCall.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCall.kt index 8834dc87d408..a4600b8170c6 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCall.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCall.kt @@ -1,6 +1,7 @@ package io.gitlab.arturbosch.detekt.rules.style import io.github.detekt.tooling.api.FunctionMatcher +import io.github.detekt.tooling.api.FunctionMatcher.Companion.fromFunctionSignature import io.gitlab.arturbosch.detekt.api.CodeSmell import io.gitlab.arturbosch.detekt.api.Config import io.gitlab.arturbosch.detekt.api.Debt @@ -11,6 +12,7 @@ import io.gitlab.arturbosch.detekt.api.Severity import io.gitlab.arturbosch.detekt.api.config import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution +import io.gitlab.arturbosch.detekt.api.valuesWithReason import org.jetbrains.kotlin.psi.KtBinaryExpression import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression @@ -52,12 +54,14 @@ class ForbiddenMethodCall(config: Config = Config.empty) : Rule(config) { "`fun String.hello(a: Int)` you should add the receiver parameter as the first parameter like this: " + "`hello(kotlin.String, kotlin.Int)`" ) - private val methods: List by config( - listOf( - "kotlin.io.print", - "kotlin.io.println", + private val methods: List by config( + valuesWithReason( + "kotlin.io.print" to "print doesn't allow you to configure the output stream. Use a logger instead.", + "kotlin.io.println" to "println doesn't allow you to configure the output stream. Use a logger instead.", ) - ) { it.map(FunctionMatcher::fromFunctionSignature) } + ) { list -> + list.map { Forbidden(fromFunctionSignature(it.value), it.reason) } + } override fun visitCallExpression(expression: KtCallExpression) { super.visitCallExpression(expression) @@ -87,10 +91,16 @@ class ForbiddenMethodCall(config: Config = Config.empty) : Rule(config) { } ?: return for (descriptor in descriptors) { - methods.find { it.match(descriptor) }?.let { functionMatcher -> - val message = "The method `$functionMatcher` has been forbidden in the Detekt config." + methods.find { it.value.match(descriptor) }?.let { forbidden -> + val message = if (forbidden.reason != null) { + "The method `${forbidden.value}` has been forbidden: ${forbidden.reason}" + } else { + "The method `${forbidden.value}` has been forbidden in the Detekt config." + } report(CodeSmell(issue, Entity.from(expression), message)) } } } } + +private data class Forbidden(val value: FunctionMatcher, val reason: String?) diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCallSpec.kt b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCallSpec.kt index 416bbc80aceb..a7495b75cbd2 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCallSpec.kt +++ b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/ForbiddenMethodCallSpec.kt @@ -28,8 +28,10 @@ class ForbiddenMethodCallSpec(val env: KotlinCoreEnvironment) { SourceLocation(2, 5), SourceLocation(3, 5) ) - assertThat(findings[0]).hasMessage("The method `kotlin.io.print` has been forbidden in the Detekt config.") - assertThat(findings[1]).hasMessage("The method `kotlin.io.println` has been forbidden in the Detekt config.") + assertThat(findings[0]) + .hasMessage("The method `kotlin.io.print` has been forbidden: print doesn't allow you to configure the output stream. Use a logger instead.") + assertThat(findings[1]) + .hasMessage("The method `kotlin.io.println` has been forbidden: println doesn't allow you to configure the output stream. Use a logger instead.") } @Test