From 42969271abb43c6e14edf4a5e3202f187b5d9cb5 Mon Sep 17 00:00:00 2001 From: shiraji Date: Fri, 12 Aug 2016 20:26:46 +0300 Subject: [PATCH] Fix problem with appending literal to variable omitting braces #KT-13336 Fixed --- .../ConvertToStringTemplateIntention.kt | 17 ++++++++++++----- .../longTemplatePlusStringLiteral.kt | 4 ++++ .../longTemplatePlusStringLiteral.kt.after | 4 ++++ .../stringPlusStringLiteral.kt | 4 ++++ .../stringPlusStringLiteral.kt.after | 4 ++++ .../templatePlusStringLiteral.kt | 4 ++++ .../templatePlusStringLiteral.kt.after | 4 ++++ .../intentions/IntentionTestGenerated.java | 18 ++++++++++++++++++ 8 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 idea/testData/intentions/convertToStringTemplate/longTemplatePlusStringLiteral.kt create mode 100644 idea/testData/intentions/convertToStringTemplate/longTemplatePlusStringLiteral.kt.after create mode 100644 idea/testData/intentions/convertToStringTemplate/stringPlusStringLiteral.kt create mode 100644 idea/testData/intentions/convertToStringTemplate/stringPlusStringLiteral.kt.after create mode 100644 idea/testData/intentions/convertToStringTemplate/templatePlusStringLiteral.kt create mode 100644 idea/testData/intentions/convertToStringTemplate/templatePlusStringLiteral.kt.after 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");