diff --git a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrimMultilineRawString.kt b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrimMultilineRawString.kt index fbd0f0278b0..91e984038fc 100644 --- a/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrimMultilineRawString.kt +++ b/detekt-rules-style/src/main/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrimMultilineRawString.kt @@ -7,11 +7,11 @@ 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.rules.safeAs import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry import org.jetbrains.kotlin.psi.KtStringTemplateExpression import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver -import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelectorOrThis /** * All the Raw strings that have more than one line should be followed by `trimMargin()` or `trimIndent()`. @@ -48,9 +48,7 @@ class TrimMultilineRawString(val config: Config) : Rule(config) { override fun visitStringTemplateExpression(expression: KtStringTemplateExpression) { super.visitStringTemplateExpression(expression) - if (expression.text.lines().count() <= 1) return - - if (!expression.isTrimmed()) { + if (expression.isRawStringWithLineBreak() && !expression.isTrimmed()) { report( CodeSmell( issue, @@ -62,13 +60,16 @@ class TrimMultilineRawString(val config: Config) : Rule(config) { } } -fun KtStringTemplateExpression.isTrimmed(): Boolean { - fun KtExpression.asKtCallExpression(): KtCallExpression? = this as? KtCallExpression +fun KtStringTemplateExpression.isRawStringWithLineBreak(): Boolean = + text.startsWith("\"\"\"") && entries.any { + val literalText = it.safeAs()?.text + literalText != null && "\n" in literalText + } - val nextCall = getQualifiedExpressionForSelectorOrThis() - .getQualifiedExpressionForReceiver() +fun KtStringTemplateExpression.isTrimmed(): Boolean { + val nextCall = getQualifiedExpressionForReceiver() ?.selectorExpression - ?.asKtCallExpression() + ?.safeAs() ?.calleeExpression ?.text diff --git a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrimMultilineRawStringSpec.kt b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrimMultilineRawStringSpec.kt index 8c3618a1fe1..ff747715306 100644 --- a/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrimMultilineRawStringSpec.kt +++ b/detekt-rules-style/src/test/kotlin/io/gitlab/arturbosch/detekt/rules/style/TrimMultilineRawStringSpec.kt @@ -82,6 +82,17 @@ class TrimMultilineRawStringSpec { subject.compileAndLint(code) assertThat(subject.findings).isEmpty() } + + @Test + fun `doesn't raise if it is not a raw string - multiline`() { + val code = """ + val a = "Hello ${'$'}{ + "cruel" + } world!" + """.trimIndent() + subject.compileAndLint(code) + assertThat(subject.findings).isEmpty() + } } private const val TQ = "\"\"\""