From 22fac7715b8eb77072252c87786d67c807765d8c Mon Sep 17 00:00:00 2001 From: Mikhail Pyltsin Date: Tue, 21 May 2024 19:10:18 +0200 Subject: [PATCH] [uast-inspections] KTIJ-29797 support escape symbols when string literal is created GitOrigin-RevId: a1dc2cf91d81991fac6442e57b2e5b65addeb987 --- .../StringTemplateAsArgumentFix.after.kt | 11 +++++++++++ .../StringTemplateAsArgumentFix.kt | 11 +++++++++++ .../generate/KotlinUastBaseCodeGenerationPlugin.kt | 8 +++++++- 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.after.kt b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.after.kt index 2df051761bd1..11af68cf9923 100644 --- a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.after.kt +++ b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.after.kt @@ -4,6 +4,17 @@ import java.lang.RuntimeException class StringTemplateAsArgumentFix { private val loggerSlf4J = LoggerFactory.getLogger() + + val x = 1 + val y = 2 + + fun testWithEscape() { + loggerSlf4J.debug("{}\n{}", x, y) + loggerSlf4J.debug("{}\t{}", x, y) + loggerSlf4J.debug("{}\"{}", x, y) + loggerSlf4J.debug("{}\${}", x, y) + } + fun testLoggerSlf4J() { val variable1 = "test" val variable2 = 1 diff --git a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.kt b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.kt index e99b03f423d7..5d7c228912a5 100644 --- a/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.kt +++ b/jvm/jvm-analysis-kotlin-tests/testData/codeInspection/logging/stringTemplateAsArgument/StringTemplateAsArgumentFix.kt @@ -4,6 +4,17 @@ import java.lang.RuntimeException class StringTemplateAsArgumentFix { private val loggerSlf4J = LoggerFactory.getLogger() + + val x = 1 + val y = 2 + + fun testWithEscape() { + loggerSlf4J.debug("$x\n$y") + loggerSlf4J.debug("$x\t$y") + loggerSlf4J.debug("$x\"$y") + loggerSlf4J.debug("$x$$y") + } + fun testLoggerSlf4J() { val variable1 = "test" val variable2 = 1 diff --git a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/generate/KotlinUastBaseCodeGenerationPlugin.kt b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/generate/KotlinUastBaseCodeGenerationPlugin.kt index 63eca5c6f748..c73c0d7189d5 100644 --- a/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/generate/KotlinUastBaseCodeGenerationPlugin.kt +++ b/plugins/kotlin/uast/uast-kotlin-base/src/org/jetbrains/uast/kotlin/generate/KotlinUastBaseCodeGenerationPlugin.kt @@ -274,10 +274,16 @@ abstract class KotlinUastElementFactory(project: Project) : UastElementFactory { } override fun createStringLiteralExpression(text: String, context: PsiElement?): UExpression { - val literal = psiFactory(context).createExpression(StringUtil.wrapWithDoubleQuote(text)) as KtStringTemplateExpression + val literal = psiFactory(context).createExpression(StringUtil.wrapWithDoubleQuote(text.escape())) as KtStringTemplateExpression return KotlinStringTemplateUPolyadicExpression(literal, null) } + private fun String.escape(): String { + val stringBuilder = StringBuilder() + StringUtil.escapeStringCharacters(this.length, this, "\"$", stringBuilder) + return stringBuilder.toString() + } + override fun createLongConstantExpression(long: Long, context: PsiElement?): UExpression? { return when (val literalExpr = psiFactory(context).createExpression(long.toString() + "L")) { is KtConstantExpression -> KotlinULiteralExpression(literalExpr, null)