diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLine.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLine.kt index 3013bdaae021..519e42e662b4 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLine.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLine.kt @@ -10,6 +10,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 org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.PackageViewDescriptor import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtDotQualifiedExpression @@ -73,7 +74,7 @@ class MaxChainedCallsOnSameLine(config: Config = Config.empty) : Rule(config) { private fun KtExpression.countChainedCalls(): Int { return when (this) { is KtQualifiedExpression -> when { - receiverExpression.isReferenceToPackage() || callOnNewLine() -> 0 + receiverExpression.isReferenceToPackageOrClass() || callOnNewLine() -> 0 else -> receiverExpression.countChainedCalls() + 1 } is KtUnaryExpression -> baseExpression?.countChainedCalls() ?: 0 @@ -81,10 +82,11 @@ class MaxChainedCallsOnSameLine(config: Config = Config.empty) : Rule(config) { } } - private fun KtExpression.isReferenceToPackage(): Boolean { + private fun KtExpression.isReferenceToPackageOrClass(): Boolean { val selectorOrThis = (this as? KtQualifiedExpression)?.selectorExpression ?: this if (selectorOrThis !is KtReferenceExpression) return false - return bindingContext[BindingContext.REFERENCE_TARGET, selectorOrThis] is PackageViewDescriptor + val descriptor = bindingContext[BindingContext.REFERENCE_TARGET, selectorOrThis] + return descriptor is PackageViewDescriptor || descriptor is ClassDescriptor } private fun KtQualifiedExpression.callOnNewLine(): Boolean { diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLineSpec.kt b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLineSpec.kt index b195ca0abce1..44c5603adeba 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLineSpec.kt +++ b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/MaxChainedCallsOnSameLineSpec.kt @@ -153,6 +153,25 @@ class MaxChainedCallsOnSameLineSpec(private val env: KotlinCoreEnvironment) { assertThat(rule.compileAndLintWithContext(env, code)).isEmpty() } + @Test + fun `does not count class references as chained calls`() { + val code = """ + sealed class Nav { + object List : Nav { + sealed interface Params { + object Groups : Params { + enum class Source { + Profiles + } + } + } + } + } + val x = Nav.List.Params.Groups.Source.Profiles + """.trimIndent() + assertThat(rule.compileAndLintWithContext(env, code)).isEmpty() + } + @Test fun `does not count package references as chained calls`() { val code = """