From b8fbc8e546b4689889240f1d0cbb4cad74f7dbe3 Mon Sep 17 00:00:00 2001 From: Joe Barnett Date: Sat, 20 Aug 2022 12:24:49 -0700 Subject: [PATCH] Allow secondary constructors to reference CoroutineDispatchers (#5227) Allow constructor delegation elements to refer to dispatchers directly, similar to how default parameters are allowed to. Fixes #5225 --- .../detekt/rules/coroutines/InjectDispatcher.kt | 4 +++- .../detekt/rules/coroutines/InjectDispatcherSpec.kt | 13 +++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcher.kt b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcher.kt index a3453a61c1f..48301c29675 100644 --- a/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcher.kt +++ b/detekt-rules-coroutines/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcher.kt @@ -13,6 +13,7 @@ import io.gitlab.arturbosch.detekt.api.internal.Configuration import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.fqNameOrNull import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.KtConstructorDelegationCall import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtSimpleNameExpression import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType @@ -60,7 +61,8 @@ class InjectDispatcher(config: Config) : Rule(config) { val type = expression.getType(bindingContext) ?: return val isCoroutineDispatcher = type.fqNameOrNull() == COROUTINE_DISPATCHER_FQCN || type.supertypes().any { it.fqNameOrNull() == COROUTINE_DISPATCHER_FQCN } - val isUsedAsParameter = expression.getStrictParentOfType() != null + val isUsedAsParameter = expression.getStrictParentOfType() != null || + expression.getStrictParentOfType() != null if (isCoroutineDispatcher && !isUsedAsParameter) { report( CodeSmell( diff --git a/detekt-rules-coroutines/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcherSpec.kt b/detekt-rules-coroutines/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcherSpec.kt index 3fcd827dd00..cfa749923cf 100644 --- a/detekt-rules-coroutines/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcherSpec.kt +++ b/detekt-rules-coroutines/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/coroutines/InjectDispatcherSpec.kt @@ -61,6 +61,19 @@ class InjectDispatcherSpec(val env: KotlinCoreEnvironment) { assertThat(subject.compileAndLintWithContext(env, code)).isEmpty() } + @Test + fun `does not report when dispatcher is used as a secondary constructor parameter`() { + val code = """ + import kotlinx.coroutines.CoroutineDispatcher + import kotlinx.coroutines.Dispatchers + + class MyRepository(dispatcher: CoroutineDispatcher) { + constructor() : this(Dispatchers.IO) + } + """ + assertThat(subject.compileAndLintWithContext(env, code)).isEmpty() + } + @Test fun `does not report when dispatcher is used as a property`() { val code = """