Skip to content

Commit

Permalink
TrimMultilineRawString: fix false positive with not a raw string (#5438)
Browse files Browse the repository at this point in the history
  • Loading branch information
t-kameyama committed Oct 18, 2022
1 parent 2b78298 commit 59449a8
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 10 deletions.
Expand Up @@ -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()`.
Expand Down Expand Up @@ -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,
Expand All @@ -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<KtLiteralStringTemplateEntry>()?.text
literalText != null && "\n" in literalText
}

val nextCall = getQualifiedExpressionForSelectorOrThis()
.getQualifiedExpressionForReceiver()
fun KtStringTemplateExpression.isTrimmed(): Boolean {
val nextCall = getQualifiedExpressionForReceiver()
?.selectorExpression
?.asKtCallExpression()
?.safeAs<KtCallExpression>()
?.calleeExpression
?.text

Expand Down
Expand Up @@ -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 = "\"\"\""

0 comments on commit 59449a8

Please sign in to comment.