From 3fe6f9cad2a3525d432afe19b02b2ee8eee3ea31 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 4 Feb 2016 21:03:54 +0300 Subject: [PATCH] More correct convertation to string template when number literals involved --- .../ConvertToStringTemplateIntention.kt | 23 +++++++++++++------ .../interpolateStringWithFloat.kt.after | 2 +- .../convertToStringTemplate/numberLiterals.kt | 3 +++ .../numberLiterals.kt.after | 3 +++ .../intentions/IntentionTestGenerated.java | 6 +++++ 5 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 idea/testData/intentions/convertToStringTemplate/numberLiterals.kt create mode 100644 idea/testData/intentions/convertToStringTemplate/numberLiterals.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 117edd5206e..a8729c45852 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertToStringTemplateIntention.kt @@ -85,11 +85,20 @@ class ConvertToStringTemplateIntention : SelfTargetingOffsetIndependentIntention if (expr == null) return "" val expression = KtPsiUtil.safeDeparenthesize(expr) val expressionText = expression.text - return when (expression) { + when (expression) { is KtConstantExpression -> { val bindingContext = expression.analyze(BodyResolveMode.PARTIAL) + val type = bindingContext.getType(expression)!! + + if (KotlinBuiltIns.isChar(type)) { + return expressionText.removePrefix("'").removeSuffix("'") + } + val constant = ConstantExpressionEvaluator.getConstant(expression, bindingContext) - StringUtil.escapeStringCharacters(constant?.getValue(bindingContext.getType(expression)!!).toString()) + val stringValue = constant?.getValue(type).toString() + if (stringValue == expressionText) { + return StringUtil.escapeStringCharacters(stringValue) + } } is KtStringTemplateExpression -> { @@ -101,17 +110,17 @@ class ConvertToStringTemplateIntention : SelfTargetingOffsetIndependentIntention StringUtil.unquoteString(expressionText) } if (forceBraces && base.endsWith('$')) { - base.dropLast(1) + "\\$" + return base.dropLast(1) + "\\$" } else { - base + return base } } is KtNameReferenceExpression -> - "$" + (if (forceBraces) "{$expressionText}" else expressionText) - - else -> "\${" + expressionText.replace("\n+".toRegex(), " ") + "}" + return "$" + (if (forceBraces) "{$expressionText}" else expressionText) } + + return "\${" + expressionText.replace("\n+".toRegex(), " ") + "}" } } diff --git a/idea/testData/intentions/convertToStringTemplate/interpolateStringWithFloat.kt.after b/idea/testData/intentions/convertToStringTemplate/interpolateStringWithFloat.kt.after index 6c5c2412497..f6ba39c7ebd 100644 --- a/idea/testData/intentions/convertToStringTemplate/interpolateStringWithFloat.kt.after +++ b/idea/testData/intentions/convertToStringTemplate/interpolateStringWithFloat.kt.after @@ -1,3 +1,3 @@ fun main(args: Array){ - val x = "abc0.32" + val x = "abc${0.320}" } diff --git a/idea/testData/intentions/convertToStringTemplate/numberLiterals.kt b/idea/testData/intentions/convertToStringTemplate/numberLiterals.kt new file mode 100644 index 00000000000..0667c94d0d9 --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/numberLiterals.kt @@ -0,0 +1,3 @@ +fun foo(p1: Int, p2: Int, p3: Int) { + val v = "a" + 0xAAA + p1 + 123 + p2 + 1.25 + "b" +} diff --git a/idea/testData/intentions/convertToStringTemplate/numberLiterals.kt.after b/idea/testData/intentions/convertToStringTemplate/numberLiterals.kt.after new file mode 100644 index 00000000000..5f003c3e55f --- /dev/null +++ b/idea/testData/intentions/convertToStringTemplate/numberLiterals.kt.after @@ -0,0 +1,3 @@ +fun foo(p1: Int, p2: Int, p3: Int) { + val v = "a${0xAAA}${p1}123${p2}1.25b" +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 5d1461910d7..9381fcdf2a4 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4675,6 +4675,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("numberLiterals.kt") + public void testNumberLiterals() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/numberLiterals.kt"); + doTest(fileName); + } + @TestMetadata("onlyForConcat.kt") public void testOnlyForConcat() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertToStringTemplate/onlyForConcat.kt");