diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt index 6312a25e802..a2702306308 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt @@ -86,19 +86,14 @@ open class ConvertToStringTemplateIntention : SelfTargetingOffsetIndependentInte val bindingContext = expression.analyze(BodyResolveMode.PARTIAL) val type = bindingContext.getType(expression)!! - if (KotlinBuiltIns.isChar(type)) { - return expressionText - .removePrefix("'") - .removeSuffix("'") - .replace("\"", "\\\"") - .replace("\\'", "'") - .run { if (forceBraces) replace("$", "\\$") else this } - } - val constant = ConstantExpressionEvaluator.getConstant(expression, bindingContext) - val stringValue = constant?.getValue(type).toString() - if (stringValue == expressionText) { - return StringUtil.escapeStringCharacters(stringValue) + if (constant != null) { + val stringValue = constant.getValue(type).toString() + if (KotlinBuiltIns.isChar(type) || stringValue == expressionText) { + return buildString { + StringUtil.escapeStringCharacters(stringValue.length, stringValue, if (forceBraces) "\"$" else "\"", this) + } + } } } diff --git a/idea/testData/intentions/convertToStringTemplate/escapedQuote.kt b/idea/testData/intentions/convertToStringTemplate/escapedQuote.kt new file mode 100644 index 00000000000..40e5318356c --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/escapedQuote.kt @@ -0,0 +1,4 @@ +// IS_APPLICABLE: false +// SKIP_ERRORS_BEFORE +// SKIP_ERRORS_AFTER +val foo = '\"' + "foo" \ No newline at end of file diff --git a/idea/testData/intentions/convertToStringTemplate/escapedQuote2.kt b/idea/testData/intentions/convertToStringTemplate/escapedQuote2.kt new file mode 100644 index 00000000000..7b3444b92f5 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/escapedQuote2.kt @@ -0,0 +1 @@ +val foo = "foo" + '\"' \ No newline at end of file diff --git a/idea/testData/intentions/convertToStringTemplate/escapedQuote2.kt.after b/idea/testData/intentions/convertToStringTemplate/escapedQuote2.kt.after new file mode 100644 index 00000000000..37593eab67a --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/escapedQuote2.kt.after @@ -0,0 +1 @@ +val foo = "foo\"" \ No newline at end of file diff --git a/idea/testData/intentions/convertToStringTemplate/invalidChar.kt.after b/idea/testData/intentions/convertToStringTemplate/invalidChar.kt.after index afa3f51bf89..b611abdd656 100644 --- a/idea/testData/intentions/convertToStringTemplate/invalidChar.kt.after +++ b/idea/testData/intentions/convertToStringTemplate/invalidChar.kt.after @@ -1,2 +1,2 @@ // DISABLE-ERRORS -val foo = "foo \"bar \"\"" \ No newline at end of file +val foo = "foo${' "'}bar${' ""'}" \ No newline at end of file diff --git a/idea/testData/intentions/convertToStringTemplate/newLine.kt b/idea/testData/intentions/convertToStringTemplate/newLine.kt new file mode 100644 index 00000000000..2703e3730e5 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/newLine.kt @@ -0,0 +1 @@ +val foo = "\n\n" + '\n' \ No newline at end of file diff --git a/idea/testData/intentions/convertToStringTemplate/newLine.kt.after b/idea/testData/intentions/convertToStringTemplate/newLine.kt.after new file mode 100644 index 00000000000..53ad59495e1 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/newLine.kt.after @@ -0,0 +1 @@ +val foo = "\n\n\n" \ 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 1b520e60aab..c65698ef77d 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -7443,6 +7443,18 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("escapedQuote.kt") + public void testEscapedQuote() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/escapedQuote.kt"); + doTest(fileName); + } + + @TestMetadata("escapedQuote2.kt") + public void testEscapedQuote2() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/escapedQuote2.kt"); + doTest(fileName); + } + @TestMetadata("insertBracesForSimpleNamedExpression.kt") public void testInsertBracesForSimpleNamedExpression() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/insertBracesForSimpleNamedExpression.kt"); @@ -7539,6 +7551,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("newLine.kt") + public void testNewLine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/newLine.kt"); + doTest(fileName); + } + @TestMetadata("noBracesForLastSimpleExpression.kt") public void testNoBracesForLastSimpleExpression() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/noBracesForLastSimpleExpression.kt");