From 0c27280f74a668a9abe98b9bbd97aa358fd3475a Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Sun, 9 Oct 2022 20:48:37 +0900 Subject: [PATCH] Fix false negative MultilineLambdaItParameter on complex multiline single statement --- .../rules/style/MultilineLambdaItParameter.kt | 6 ++++-- .../rules/style/MultilineLambdaItParameterSpec.kt | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameter.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameter.kt index 40d08f0131a..a493f2786e8 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameter.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameter.kt @@ -11,7 +11,9 @@ import io.gitlab.arturbosch.detekt.api.internal.RequiresTypeResolution import io.gitlab.arturbosch.detekt.rules.IT_LITERAL import io.gitlab.arturbosch.detekt.rules.hasImplicitParameterReference import io.gitlab.arturbosch.detekt.rules.implicitParameter +import org.jetbrains.kotlin.psi.KtBlockExpression import org.jetbrains.kotlin.psi.KtLambdaExpression +import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType /** * Lambda expressions are very useful in a lot of cases, and they often include very small chunks of @@ -74,8 +76,8 @@ class MultilineLambdaItParameter(val config: Config) : Rule(config) { override fun visitLambdaExpression(lambdaExpression: KtLambdaExpression) { super.visitLambdaExpression(lambdaExpression) - val size = lambdaExpression.bodyExpression?.statements?.size - if (size == null || size <= 1) return + val size = lambdaExpression.collectDescendantsOfType().flatMap { it.statements }.size + if (size <= 1) return val parameterNames = lambdaExpression.valueParameters.map { it.name } // Explicit `it` diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameterSpec.kt b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameterSpec.kt index f60ad833601..21cff6dbac6 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameterSpec.kt +++ b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/MultilineLambdaItParameterSpec.kt @@ -114,6 +114,21 @@ class MultilineLambdaItParameterSpec(val env: KotlinCoreEnvironment) { val findings = subject.compileAndLintWithContext(env, code) assertThat(findings).isEmpty() } + + @Test + fun `reports when statement is spanning multiple lines`() { + val code = """ + fun f() { + val digits = 1234.let { + check(it > 0) { + println(it) + } + } + } + """.trimIndent() + val findings = subject.compileAndLintWithContext(env, code) + assertThat(findings).hasSize(1) + } } @Nested