From d4e4a4c3e7c2f39ecb0b47f99879bb86660bb72a Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 22 Aug 2019 19:33:08 +0900 Subject: [PATCH] To ordinary string literal: remove 'trimIndent()' if string is single line #KT-32616 Fixed --- .../ToOrdinaryStringLiteralIntention.kt | 69 +++++++++++++++---- .../toOrdinaryStringLiteral/trimIndent1.kt | 4 ++ .../trimIndent1.kt.after | 2 + .../toOrdinaryStringLiteral/trimIndent2.kt | 3 + .../trimIndent2.kt.after | 2 + .../toOrdinaryStringLiteral/trimIndent3.kt | 3 + .../trimIndent3.kt.after | 2 + .../toOrdinaryStringLiteral/trimIndent4.kt | 2 + .../trimIndent4.kt.after | 2 + .../toOrdinaryStringLiteral/trimIndent5.kt | 2 + .../trimIndent5.kt.after | 2 + .../toOrdinaryStringLiteral/trimIndent6.kt | 3 + .../trimIndent6.kt.after | 2 + .../toOrdinaryStringLiteral/trimIndent7.kt | 4 ++ .../trimIndent7.kt.after | 2 + .../toOrdinaryStringLiteral/trimIndent8.kt | 5 ++ .../trimIndent8.kt.after | 2 + .../toOrdinaryStringLiteral/trimIndent9.kt | 5 ++ .../trimIndent9.kt.after | 2 + .../toOrdinaryStringLiteral/trimMargin1.kt | 4 ++ .../trimMargin1.kt.after | 2 + .../toOrdinaryStringLiteral/trimMargin2.kt | 5 ++ .../trimMargin2.kt.after | 2 + .../toOrdinaryStringLiteral/trimMargin3.kt | 5 ++ .../trimMargin3.kt.after | 2 + .../toOrdinaryStringLiteral/trimMargin4.kt | 6 ++ .../trimMargin4.kt.after | 3 + .../intentions/IntentionTestGenerated.java | 65 +++++++++++++++++ 28 files changed, 197 insertions(+), 15 deletions(-) create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent1.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent1.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent2.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent2.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent3.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent3.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent4.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent4.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent5.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent5.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent6.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent6.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent7.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent7.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent8.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent8.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent9.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimIndent9.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimMargin1.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimMargin1.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimMargin2.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimMargin2.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimMargin3.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimMargin3.kt.after create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimMargin4.kt create mode 100644 idea/testData/intentions/toOrdinaryStringLiteral/trimMargin4.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ToOrdinaryStringLiteralIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ToOrdinaryStringLiteralIntention.kt index 01b3e03f05f..6b57e852a36 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ToOrdinaryStringLiteralIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ToOrdinaryStringLiteralIntention.kt @@ -20,16 +20,21 @@ import com.intellij.codeInsight.intention.LowPriorityAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.util.text.StringUtil import org.jetbrains.kotlin.idea.core.replaced -import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry -import org.jetbrains.kotlin.psi.KtPsiFactory -import org.jetbrains.kotlin.psi.KtStringTemplateExpression +import org.jetbrains.kotlin.idea.inspections.collections.isCalling +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.endOffset +import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForReceiver import org.jetbrains.kotlin.psi.psiUtil.startOffset class ToOrdinaryStringLiteralIntention : SelfTargetingOffsetIndependentIntention( KtStringTemplateExpression::class.java, "To ordinary string literal" ), LowPriorityAction { + companion object { + private val TRIM_INDENT_FUNCTIONS = listOf(FqName("kotlin.text.trimIndent"), FqName("kotlin.text.trimMargin")) + } + override fun isApplicableTo(element: KtStringTemplateExpression): Boolean { return element.text.startsWith("\"\"\"") } @@ -39,24 +44,20 @@ class ToOrdinaryStringLiteralIntention : SelfTargetingOffsetIndependentIntention val endOffset = element.endOffset val currentOffset = editor?.caretModel?.currentCaret?.offset ?: startOffset + val entries = element.entries + val trimIndentCall = getTrimIndentCall(element, entries) val text = buildString { append("\"") - - for (entry in element.entries) { - if (entry is KtLiteralStringTemplateEntry) { - var text = entry.text - text = text.replace("\\", "\\\\") - text = text.replace("\"", "\\\"") - text = StringUtil.convertLineSeparators(text, "\\n") - append(text) - } else { - append(entry.text) + if (trimIndentCall != null) { + append(trimIndentCall.stringTemplateText) + } else { + entries.joinTo(buffer = this, separator = "") { + if (it is KtLiteralStringTemplateEntry) it.text.escape() else it.text } } - append("\"") } - val replaced = element.replaced(KtPsiFactory(element).createExpression(text)) + val replaced = (trimIndentCall?.qualifiedExpression ?: element).replaced(KtPsiFactory(element).createExpression(text)) val offset = when { currentOffset - startOffset < 2 -> startOffset @@ -65,4 +66,42 @@ class ToOrdinaryStringLiteralIntention : SelfTargetingOffsetIndependentIntention } editor?.caretModel?.moveToOffset(offset) } + + private fun String.escape(): String { + var text = this + text = text.replace("\\", "\\\\") + text = text.replace("\"", "\\\"") + return StringUtil.convertLineSeparators(text, "\\n") + } + + private fun getTrimIndentCall( + element: KtStringTemplateExpression, + entries: Array + ): TrimIndentCall? { + val qualifiedExpression = element.getQualifiedExpressionForReceiver()?.takeIf { + it.callExpression?.isCalling(TRIM_INDENT_FUNCTIONS) == true + } ?: return null + + val marginPrefix = if (qualifiedExpression.calleeName == "trimMargin") { + when (val arg = qualifiedExpression.callExpression?.valueArguments?.singleOrNull()?.getArgumentExpression()) { + null -> "|" + is KtStringTemplateExpression -> arg.entries.singleOrNull()?.takeIf { it is KtLiteralStringTemplateEntry }?.text + else -> null + } ?: return null + } else { + null + } + + val stringTemplateText = entries + .joinToString(separator = "") { it.text } + .let { if (marginPrefix != null) it.trimMargin(marginPrefix) else it.trimIndent() } + .escape() + + return TrimIndentCall(qualifiedExpression, stringTemplateText) + } + + private data class TrimIndentCall( + val qualifiedExpression: KtQualifiedExpression, + val stringTemplateText: String + ) } \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent1.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent1.kt new file mode 100644 index 00000000000..d3edab64a2a --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent1.kt @@ -0,0 +1,4 @@ +// WITH_RUNTIME +val s = """ + foo +""".trimIndent() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent1.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent1.kt.after new file mode 100644 index 00000000000..136ef3a11df --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent1.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "foo" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent2.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent2.kt new file mode 100644 index 00000000000..ff84a4de832 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent2.kt @@ -0,0 +1,3 @@ +// WITH_RUNTIME +val s = """foo +""".trimIndent() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent2.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent2.kt.after new file mode 100644 index 00000000000..136ef3a11df --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent2.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "foo" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent3.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent3.kt new file mode 100644 index 00000000000..3443dbd9c46 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent3.kt @@ -0,0 +1,3 @@ +// WITH_RUNTIME +val s = """ + foo""".trimIndent() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent3.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent3.kt.after new file mode 100644 index 00000000000..136ef3a11df --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent3.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "foo" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent4.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent4.kt new file mode 100644 index 00000000000..ff78075b9b0 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent4.kt @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = """foo""".trimIndent() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent4.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent4.kt.after new file mode 100644 index 00000000000..136ef3a11df --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent4.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "foo" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent5.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent5.kt new file mode 100644 index 00000000000..0d23ac95a8b --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent5.kt @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = """""".trimIndent() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent5.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent5.kt.after new file mode 100644 index 00000000000..31824cfed09 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent5.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent6.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent6.kt new file mode 100644 index 00000000000..ed3e1d842e3 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent6.kt @@ -0,0 +1,3 @@ +// WITH_RUNTIME +val s = """ +""".trimIndent() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent6.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent6.kt.after new file mode 100644 index 00000000000..31824cfed09 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent6.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent7.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent7.kt new file mode 100644 index 00000000000..4b9c050aaf3 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent7.kt @@ -0,0 +1,4 @@ +// WITH_RUNTIME +val s = """ + +""".trimIndent() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent7.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent7.kt.after new file mode 100644 index 00000000000..8afadf643aa --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent7.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = " " \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent8.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent8.kt new file mode 100644 index 00000000000..dd5a9279668 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent8.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME +val s = """ + foo + bar +""".trimIndent() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent8.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent8.kt.after new file mode 100644 index 00000000000..c8177b62c36 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent8.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "foo\nbar" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent9.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent9.kt new file mode 100644 index 00000000000..bb6d101b6ac --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent9.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME +val s = """ + \foo + \\bar +""".trimIndent() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent9.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent9.kt.after new file mode 100644 index 00000000000..51ce407ba6e --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimIndent9.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "\\foo\n \\\\bar" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin1.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin1.kt new file mode 100644 index 00000000000..927b634a4af --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin1.kt @@ -0,0 +1,4 @@ +// WITH_RUNTIME +val s = """ + |foo +""".trimMargin() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin1.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin1.kt.after new file mode 100644 index 00000000000..136ef3a11df --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin1.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "foo" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin2.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin2.kt new file mode 100644 index 00000000000..e2f51adc27e --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin2.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME +val s = """ + _foo + _bar +""".trimMargin("_") \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin2.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin2.kt.after new file mode 100644 index 00000000000..c8177b62c36 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin2.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "foo\nbar" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin3.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin3.kt new file mode 100644 index 00000000000..bfb70197998 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin3.kt @@ -0,0 +1,5 @@ +// WITH_RUNTIME +val s = """ + |\foo + | \\bar +""".trimMargin() \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin3.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin3.kt.after new file mode 100644 index 00000000000..318b2b4bbeb --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin3.kt.after @@ -0,0 +1,2 @@ +// WITH_RUNTIME +val s = "\\foo\n \\\\bar" \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin4.kt b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin4.kt new file mode 100644 index 00000000000..d831e2a2313 --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin4.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +val prefix = "|" +val s = """ + |foo + |bar +""".trimMargin(prefix) \ No newline at end of file diff --git a/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin4.kt.after b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin4.kt.after new file mode 100644 index 00000000000..411951ba8ef --- /dev/null +++ b/idea/testData/intentions/toOrdinaryStringLiteral/trimMargin4.kt.after @@ -0,0 +1,3 @@ +// WITH_RUNTIME +val prefix = "|" +val s = "\n |foo\n |bar\n".trimMargin(prefix) \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index c8940cd6868..9b625179740 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -15761,6 +15761,71 @@ public class IntentionTestGenerated extends AbstractIntentionTest { public void testSimple() throws Exception { runTest("idea/testData/intentions/toOrdinaryStringLiteral/simple.kt"); } + + @TestMetadata("trimIndent1.kt") + public void testTrimIndent1() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimIndent1.kt"); + } + + @TestMetadata("trimIndent2.kt") + public void testTrimIndent2() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimIndent2.kt"); + } + + @TestMetadata("trimIndent3.kt") + public void testTrimIndent3() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimIndent3.kt"); + } + + @TestMetadata("trimIndent4.kt") + public void testTrimIndent4() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimIndent4.kt"); + } + + @TestMetadata("trimIndent5.kt") + public void testTrimIndent5() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimIndent5.kt"); + } + + @TestMetadata("trimIndent6.kt") + public void testTrimIndent6() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimIndent6.kt"); + } + + @TestMetadata("trimIndent7.kt") + public void testTrimIndent7() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimIndent7.kt"); + } + + @TestMetadata("trimIndent8.kt") + public void testTrimIndent8() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimIndent8.kt"); + } + + @TestMetadata("trimIndent9.kt") + public void testTrimIndent9() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimIndent9.kt"); + } + + @TestMetadata("trimMargin1.kt") + public void testTrimMargin1() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimMargin1.kt"); + } + + @TestMetadata("trimMargin2.kt") + public void testTrimMargin2() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimMargin2.kt"); + } + + @TestMetadata("trimMargin3.kt") + public void testTrimMargin3() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimMargin3.kt"); + } + + @TestMetadata("trimMargin4.kt") + public void testTrimMargin4() throws Exception { + runTest("idea/testData/intentions/toOrdinaryStringLiteral/trimMargin4.kt"); + } } @TestMetadata("idea/testData/intentions/toRawStringLiteral")