diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt index 8e0a6969d82..b92ca0410ba 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt @@ -123,12 +123,19 @@ class ConvertToStringTemplateIntention : SelfTargetingOffsetIndependentIntention else { StringUtil.unquoteString(expressionText) } - if (forceBraces && base.endsWith('$')) { - return base.dropLast(1) + "\\$" - } - else { - return base + + if (forceBraces) { + if (base.endsWith('$')) { + return base.dropLast(1) + "\\$" + } + else { + val lastPart = expression.children.lastOrNull() + if (lastPart is KtSimpleNameStringTemplateEntry) { + return base.dropLast(lastPart.textLength) + "\${" + lastPart.text.drop(1) + "}" + } + } } + return base } is KtNameReferenceExpression -> diff --git a/idea/testData/intentions/convertToStringTemplate/longTemplatePlusStringLiteral.kt b/idea/testData/intentions/convertToStringTemplate/longTemplatePlusStringLiteral.kt new file mode 100644 index 00000000000..39b64e52765 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/longTemplatePlusStringLiteral.kt @@ -0,0 +1,4 @@ +fun foo() { + val nv1 = 1 + val nv2 = "prefix $nv1" + "postfix" +} diff --git a/idea/testData/intentions/convertToStringTemplate/longTemplatePlusStringLiteral.kt.after b/idea/testData/intentions/convertToStringTemplate/longTemplatePlusStringLiteral.kt.after new file mode 100644 index 00000000000..deb0a8b66f3 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/longTemplatePlusStringLiteral.kt.after @@ -0,0 +1,4 @@ +fun foo() { + val nv1 = 1 + val nv2 = "prefix ${nv1}postfix" +} diff --git a/idea/testData/intentions/convertToStringTemplate/stringPlusStringLiteral.kt b/idea/testData/intentions/convertToStringTemplate/stringPlusStringLiteral.kt new file mode 100644 index 00000000000..cb6bcc7c26a --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/stringPlusStringLiteral.kt @@ -0,0 +1,4 @@ +fun foo() { + val prefix = "prefix" + val nv2 = prefix + "postfix" +} diff --git a/idea/testData/intentions/convertToStringTemplate/stringPlusStringLiteral.kt.after b/idea/testData/intentions/convertToStringTemplate/stringPlusStringLiteral.kt.after new file mode 100644 index 00000000000..3178de85b54 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/stringPlusStringLiteral.kt.after @@ -0,0 +1,4 @@ +fun foo() { + val prefix = "prefix" + val nv2 = "${prefix}postfix" +} diff --git a/idea/testData/intentions/convertToStringTemplate/templatePlusStringLiteral.kt b/idea/testData/intentions/convertToStringTemplate/templatePlusStringLiteral.kt new file mode 100644 index 00000000000..cfb089d5f60 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/templatePlusStringLiteral.kt @@ -0,0 +1,4 @@ +fun foo() { + val nv1 = 1 + val nv2 = "$nv1" + "postfix" +} diff --git a/idea/testData/intentions/convertToStringTemplate/templatePlusStringLiteral.kt.after b/idea/testData/intentions/convertToStringTemplate/templatePlusStringLiteral.kt.after new file mode 100644 index 00000000000..aafa3fa2731 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/templatePlusStringLiteral.kt.after @@ -0,0 +1,4 @@ +fun foo() { + val nv1 = 1 + val nv2 = "${nv1}postfix" +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 2386618202f..3de253d4eb5 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -5254,6 +5254,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("longTemplatePlusStringLiteral.kt") + public void testLongTemplatePlusStringLiteral() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/longTemplatePlusStringLiteral.kt"); + doTest(fileName); + } + @TestMetadata("multilineString.kt") public void testMultilineString() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/multilineString.kt"); @@ -5320,6 +5326,18 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("stringPlusStringLiteral.kt") + public void testStringPlusStringLiteral() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/stringPlusStringLiteral.kt"); + doTest(fileName); + } + + @TestMetadata("templatePlusStringLiteral.kt") + public void testTemplatePlusStringLiteral() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/templatePlusStringLiteral.kt"); + doTest(fileName); + } + @TestMetadata("tricky.kt") public void testTricky() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/tricky.kt");