diff --git a/config/detekt/detekt.yml b/config/detekt/detekt.yml index c95a34898a2..e186770584d 100644 --- a/config/detekt/detekt.yml +++ b/config/detekt/detekt.yml @@ -277,3 +277,8 @@ libraries: active: true excludes: ['**/*.kt'] includes: ['**/detekt-api/src/main/**/api/*.kt'] + +ruleauthors: + ViolatesTypeResolutionRequirements: + active: true + excludes: ['**/test/**', '**/*Test.kt', '**/*Spec.kt'] diff --git a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/MultiRule.kt b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/MultiRule.kt index 8e9a3a46e0f..e3ea164af0c 100644 --- a/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/MultiRule.kt +++ b/detekt-api/src/main/kotlin/io/gitlab/arturbosch/detekt/api/MultiRule.kt @@ -8,6 +8,7 @@ import org.jetbrains.kotlin.psi.KtFile * scanning the source code line by line to increase performance. */ @Deprecated("multi rules are much more difficult to maintain and support will be removed in the future") +@Suppress("ViolatesTypeResolutionRequirements") abstract class MultiRule : BaseRule() { abstract val rules: List diff --git a/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/LongParameterList.kt b/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/LongParameterList.kt index 65e109d8483..6ebd13548c6 100644 --- a/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/LongParameterList.kt +++ b/detekt-rules-complexity/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/complexity/LongParameterList.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.psi.KtSecondaryConstructor /** * Reports functions and constructors which have more parameters than a certain threshold. */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.0.0") class LongParameterList(config: Config = Config.empty) : Rule(config) { override val issue = Issue( diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ImplicitDefaultLocale.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ImplicitDefaultLocale.kt index 01bb4f80ca8..c56a43f61d5 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ImplicitDefaultLocale.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/ImplicitDefaultLocale.kt @@ -42,6 +42,7 @@ import org.jetbrains.kotlin.resolve.calls.util.getType * str.toLowerCase(Locale.US) * */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.16.0") class ImplicitDefaultLocale(config: Config = Config.empty) : Rule(config) { diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/LateinitUsage.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/LateinitUsage.kt index 1dd7c13e1f8..4d4171b7180 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/LateinitUsage.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/LateinitUsage.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.psi.psiUtil.containingClass * } * */ +@Suppress("ViolatesTypeResolutionRequirements") class LateinitUsage(config: Config = Config.empty) : Rule(config) { override val issue = Issue( diff --git a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/MapGetWithNotNullAssertionOperator.kt b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/MapGetWithNotNullAssertionOperator.kt index 1378a463b53..6806dae363a 100644 --- a/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/MapGetWithNotNullAssertionOperator.kt +++ b/detekt-rules-errorprone/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/bugs/MapGetWithNotNullAssertionOperator.kt @@ -43,6 +43,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe * map.getOrElse("key", { "" }) * */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.21.0") class MapGetWithNotNullAssertionOperator(config: Config) : Rule(config) { diff --git a/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/InstanceOfCheckForException.kt b/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/InstanceOfCheckForException.kt index 38937a94c07..a3eae8a61a7 100644 --- a/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/InstanceOfCheckForException.kt +++ b/detekt-rules-exceptions/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/exceptions/InstanceOfCheckForException.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.types.typeUtil.isSubtypeOf * } * */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.21.0") class InstanceOfCheckForException(config: Config = Config.empty) : Rule(config) { diff --git a/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/MemberNameEqualsClassName.kt b/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/MemberNameEqualsClassName.kt index 67f5e457d90..19613740aeb 100644 --- a/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/MemberNameEqualsClassName.kt +++ b/detekt-rules-naming/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/naming/MemberNameEqualsClassName.kt @@ -52,6 +52,7 @@ import org.jetbrains.kotlin.resolve.BindingContext * } * */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.2.0") class MemberNameEqualsClassName(config: Config = Config.empty) : Rule(config) { diff --git a/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/SpreadOperator.kt b/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/SpreadOperator.kt index 2573aa96aa6..d01f640076c 100644 --- a/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/SpreadOperator.kt +++ b/detekt-rules-performance/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/performance/SpreadOperator.kt @@ -50,6 +50,7 @@ import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall * } * */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.0.0") class SpreadOperator(config: Config = Config.empty) : Rule(config) { diff --git a/detekt-rules-ruleauthors/build.gradle.kts b/detekt-rules-ruleauthors/build.gradle.kts index e0469ce857e..5450965954d 100644 --- a/detekt-rules-ruleauthors/build.gradle.kts +++ b/detekt-rules-ruleauthors/build.gradle.kts @@ -7,3 +7,7 @@ dependencies { testImplementation(projects.detektTest) testImplementation(libs.assertj) } + +tasks.withType { + kotlinOptions.freeCompilerArgs = listOf("-Xcontext-receivers") +} diff --git a/detekt-rules-ruleauthors/src/main/kotlin/io/gitlab/arturbosch/detekt/authors/RuleAuthorsProvider.kt b/detekt-rules-ruleauthors/src/main/kotlin/io/gitlab/arturbosch/detekt/authors/RuleAuthorsProvider.kt index 279a26f4cc5..707fa016e45 100644 --- a/detekt-rules-ruleauthors/src/main/kotlin/io/gitlab/arturbosch/detekt/authors/RuleAuthorsProvider.kt +++ b/detekt-rules-ruleauthors/src/main/kotlin/io/gitlab/arturbosch/detekt/authors/RuleAuthorsProvider.kt @@ -13,6 +13,10 @@ class RuleAuthorsProvider : RuleSetProvider { override val ruleSetId: String = "ruleauthors" - @Suppress("UseEmptyCounterpart") - override fun instance(config: Config) = RuleSet(ruleSetId, listOf()) + override fun instance(config: Config) = RuleSet( + ruleSetId, + listOf( + ViolatesTypeResolutionRequirements(config), + ) + ) } diff --git a/detekt-rules-ruleauthors/src/main/kotlin/io/gitlab/arturbosch/detekt/authors/ViolatesTypeResolutionRequirements.kt b/detekt-rules-ruleauthors/src/main/kotlin/io/gitlab/arturbosch/detekt/authors/ViolatesTypeResolutionRequirements.kt new file mode 100644 index 00000000000..ff15f0e897a --- /dev/null +++ b/detekt-rules-ruleauthors/src/main/kotlin/io/gitlab/arturbosch/detekt/authors/ViolatesTypeResolutionRequirements.kt @@ -0,0 +1,96 @@ +@file:Suppress("ForbiddenComment") + +package io.gitlab.arturbosch.detekt.authors + +import io.gitlab.arturbosch.detekt.api.BaseRule +import io.gitlab.arturbosch.detekt.api.CodeSmell +import io.gitlab.arturbosch.detekt.api.Config +import io.gitlab.arturbosch.detekt.api.Debt +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.internal.ActiveByDefault +import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution +import io.gitlab.arturbosch.detekt.rules.fqNameOrNull +import org.jetbrains.kotlin.psi.KtClass +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtNameReferenceExpression +import org.jetbrains.kotlin.psi.KtReferenceExpression +import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull +import org.jetbrains.kotlin.resolve.descriptorUtil.getAllSuperclassesWithoutAny +import kotlin.reflect.KClass + +/** + * If a rule uses the property [BaseRule.bindingContext] should be annotated with `@RequiresTypeResolution`. + * And if the rule doesn't use that property it shouldn't be annotated with it. + */ +@ActiveByDefault("1.22.0") +@RequiresTypeResolution +class ViolatesTypeResolutionRequirements(config: Config = Config.empty) : Rule(config) { + override val issue = Issue( + javaClass.simpleName, + Severity.Defect, + "`@RequiresTypeResolution` should be used if and only if the property `bindingContext` is used.", + Debt.FIVE_MINS + ) + + private val klasses: MutableList = mutableListOf() + private var usesBindingContext: Boolean = false + + override fun visitKtFile(file: KtFile) { + super.visitKtFile(file) + klasses.forEach { klass -> + val isAnnotatedWithRequiresTypeResolution = klass.isAnnotatedWith(RequiresTypeResolution::class) + if (usesBindingContext && !isAnnotatedWithRequiresTypeResolution) { + report( + CodeSmell( + issue, + Entity.atName(klass), + "`${klass.name}` uses `bindingContext` but is not annotated with `@RequiresTypeResolution`" + ) + ) + } else if (!usesBindingContext && isAnnotatedWithRequiresTypeResolution) { + report( + CodeSmell( + issue, + Entity.atName(klass), + "`${klass.name}` is annotated with `@RequiresTypeResolution` but doesn't use `bindingContext`" + ) + ) + } + } + klasses.clear() + usesBindingContext = false + } + + override fun visitClass(klass: KtClass) { + super.visitClass(klass) + + if (klass.extendsFrom(BaseRule::class)) { + klasses.add(klass) + } + } + + override fun visitReferenceExpression(expression: KtReferenceExpression) { + super.visitReferenceExpression(expression) + usesBindingContext = usesBindingContext || + (expression is KtNameReferenceExpression && expression.text == "bindingContext") + } +} + +context(BaseRule) private inline fun KtClass.extendsFrom(kClass: KClass): Boolean { + return bindingContext[BindingContext.CLASS, this] + ?.getAllSuperclassesWithoutAny() + .orEmpty() + .any { it.fqNameOrNull()?.toString() == checkNotNull(kClass.qualifiedName) } +} + +context(BaseRule) private inline fun KtClass.isAnnotatedWith(kClass: KClass): Boolean { + return annotationEntries + .asSequence() + .mapNotNull { it.typeReference } + .mapNotNull { bindingContext[BindingContext.TYPE, it] } + .any { it.fqNameOrNull()?.toString() == checkNotNull(kClass.qualifiedName) } +} diff --git a/detekt-rules-ruleauthors/src/main/resources/config/config.yml b/detekt-rules-ruleauthors/src/main/resources/config/config.yml index 80685d4c222..f56c2c0a4a3 100644 --- a/detekt-rules-ruleauthors/src/main/resources/config/config.yml +++ b/detekt-rules-ruleauthors/src/main/resources/config/config.yml @@ -1,2 +1,4 @@ ruleauthors: active: true + ViolatesTypeResolutionRequirements: + active: true diff --git a/detekt-rules-ruleauthors/src/test/kotlin/io/gitlab/arturbosch/detekt/authors/ViolatesTypeResolutionRequirementsSpec.kt b/detekt-rules-ruleauthors/src/test/kotlin/io/gitlab/arturbosch/detekt/authors/ViolatesTypeResolutionRequirementsSpec.kt new file mode 100644 index 00000000000..54c15057d5e --- /dev/null +++ b/detekt-rules-ruleauthors/src/test/kotlin/io/gitlab/arturbosch/detekt/authors/ViolatesTypeResolutionRequirementsSpec.kt @@ -0,0 +1,115 @@ +package io.gitlab.arturbosch.detekt.authors + +import io.gitlab.arturbosch.detekt.rules.KotlinCoreEnvironmentTest +import io.gitlab.arturbosch.detekt.test.compileAndLintWithContext +import org.assertj.core.api.Assertions.assertThat +import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment +import org.junit.jupiter.api.Test + +@KotlinCoreEnvironmentTest +internal class ViolatesTypeResolutionRequirementsSpec(private val env: KotlinCoreEnvironment) { + + private val rule = ViolatesTypeResolutionRequirements() + + @Test + fun `should not report classes that don't extend from BaseRule`() { + val code = """ + class A { + val issue: Int = error("bindingContext") + } + """.trimIndent() + val findings = rule.compileAndLintWithContext(env, code) + assertThat(findings).isEmpty() + } + + @Test + fun `should report Rules that use bindingContext and are not annotated`() { + val code = """ + import io.gitlab.arturbosch.detekt.api.Config + import io.gitlab.arturbosch.detekt.api.Rule + + class A(config: Config) : Rule(config) { + override val issue = error("I don't care") + + private fun asdf() { + bindingContext + } + } + """.trimIndent() + val findings = rule.compileAndLintWithContext(env, code) + assertThat(findings).hasSize(1) + } + + @Test + fun `should not report Rules that doesn't use bindingContext and are not annotated`() { + val code = """ + import io.gitlab.arturbosch.detekt.api.Config + import io.gitlab.arturbosch.detekt.api.Rule + + class A(config: Config) : Rule(config) { + override val issue = error("I don't care") + } + """.trimIndent() + val findings = rule.compileAndLintWithContext(env, code) + assertThat(findings).isEmpty() + } + + @Test + fun `should not report Rules that use bindingContext and are annotated`() { + val code = """ + import io.gitlab.arturbosch.detekt.api.Config + import io.gitlab.arturbosch.detekt.api.Rule + import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution + + @RequiresTypeResolution + class A(config: Config) : Rule(config) { + override val issue = error("I don't care") + + private fun asdf() { + bindingContext + } + } + """.trimIndent() + val findings = rule.compileAndLintWithContext(env, code) + assertThat(findings).isEmpty() + } + + @Test + fun `should report Rules that don't use bindingContext and are annotated`() { + val code = """ + import io.gitlab.arturbosch.detekt.api.Config + import io.gitlab.arturbosch.detekt.api.Rule + import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution + + @RequiresTypeResolution + class A(config: Config) : Rule(config) { + override val issue = error("I don't care") + } + """.trimIndent() + val findings = rule.compileAndLintWithContext(env, code) + assertThat(findings).hasSize(1) + } + + @Test + fun `should report Rules that use bindingContext outside class and are not annotated`() { + val code = """ + import io.gitlab.arturbosch.detekt.api.Config + import io.gitlab.arturbosch.detekt.api.Rule + + class A(config: Config) : Rule(config) { + override val issue = error("I don't care") + + private fun asdf() { + extension() + } + } + + inline fun Rule.extension(): Boolean { + bindingContext + return true + } + """.trimIndent() + val findings = rule.compileAndLintWithContext(env, code) + assertThat(findings).hasSize(1) + } +} 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 8b71fcb982b..f0b1538914f 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 @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.psi.psiUtil.containingClass * const val constantString = "1" * */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.2.0") class FunctionOnlyReturningConstant(config: Config = Config.empty) : Rule(config) { diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryAbstractClass.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryAbstractClass.kt index 95851efd42d..64fae1c8def 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryAbstractClass.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnnecessaryAbstractClass.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.types.typeUtil.isInterface * } * */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.2.0") class UnnecessaryAbstractClass(config: Config = Config.empty) : Rule(config) { diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedImports.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedImports.kt index 6da0c950529..9889d19edcd 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedImports.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedImports.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.getImportableDescriptor * Exempt from this rule are imports resulting from references to elements within KDoc and * from destructuring declarations (componentN imports). */ +@Suppress("ViolatesTypeResolutionRequirements") class UnusedImports(config: Config) : Rule(config) { override val issue = Issue( diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMember.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMember.kt index 81642b88994..7e0e454cb60 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMember.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UnusedPrivateMember.kt @@ -56,6 +56,7 @@ private const val ARRAY_GET_METHOD_NAME = "get" * If these private elements are unused they should be removed. Otherwise, this dead code * can lead to confusion and potential bugs. */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.16.0") class UnusedPrivateMember(config: Config = Config.empty) : Rule(config) { diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseCheckOrError.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseCheckOrError.kt index 213c5f095ce..de5d5401eda 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseCheckOrError.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseCheckOrError.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.psi.KtThrowExpression * } * */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.21.0") class UseCheckOrError(config: Config = Config.empty) : Rule(config) { diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseDataClass.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseDataClass.kt index defda0c037c..365cd0989e3 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseDataClass.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseDataClass.kt @@ -45,6 +45,7 @@ import org.jetbrains.kotlin.types.KotlinType * class A(val b: B) : I by b * */ +@Suppress("ViolatesTypeResolutionRequirements") class UseDataClass(config: Config = Config.empty) : Rule(config) { override val issue: Issue = Issue( diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseRequire.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseRequire.kt index 94bf1985ffe..69bf2183ef7 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseRequire.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/UseRequire.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.psi.KtThrowExpression * require(value >= 0) { "value is $value but should be at least 0" } * */ +@Suppress("ViolatesTypeResolutionRequirements") @ActiveByDefault(since = "1.21.0") class UseRequire(config: Config = Config.empty) : Rule(config) { diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/optional/OptionalUnit.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/optional/OptionalUnit.kt index b0d97930b72..13db4529801 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/optional/OptionalUnit.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/optional/OptionalUnit.kt @@ -50,6 +50,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull * override fun foo() = Unit * */ +@Suppress("ViolatesTypeResolutionRequirements") class OptionalUnit(config: Config = Config.empty) : Rule(config) { override val issue = Issue(