From bf3e739edffc24659f699dbaca9d1d7ccb9491f6 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 3 Mar 2020 18:01:00 +0900 Subject: [PATCH] Replace with string templates: add curly braces if needed #KT-37173 Fixed --- .../ReplaceStringFormatWithLiteralInspection.kt | 14 +++++++++++--- .../replaceStringFormatWithLiteral/curlyBraces.kt | 6 ++++++ .../curlyBraces.kt.after | 6 ++++++ .../inspections/LocalInspectionTestGenerated.java | 5 +++++ 4 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/curlyBraces.kt create mode 100644 idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/curlyBraces.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceStringFormatWithLiteralInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceStringFormatWithLiteralInspection.kt index 6681b2383e4..1e182f8bd86 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceStringFormatWithLiteralInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceStringFormatWithLiteralInspection.kt @@ -13,6 +13,9 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiElementVisitor import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.idea.core.canDropBraces +import org.jetbrains.kotlin.idea.core.dropBraces +import org.jetbrains.kotlin.idea.core.replaced import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.intentions.ConvertToStringTemplateIntention import org.jetbrains.kotlin.idea.intentions.callExpression @@ -76,10 +79,15 @@ class ReplaceStringFormatWithLiteralInspection : AbstractKotlinInspection() { val args = callExpression.valueArguments.mapNotNull { it.getArgumentExpression() } val format = args[0].text.removePrefix("\"").removeSuffix("\"") - val replaceArgs = args.asSequence().drop(1).mapTo(LinkedList()) { ConvertToStringTemplateIntention.buildText(it, false) } + val replaceArgs = args.asSequence().drop(1).mapTo(LinkedList()) { ConvertToStringTemplateIntention.buildText(it, true) } val stringLiteral = stringPlaceHolder.replace(format) { replaceArgs.pop() } - - (qualifiedExpression ?: callExpression).also { it.replace(KtPsiFactory(it).createStringTemplate(stringLiteral)) } + (qualifiedExpression ?: callExpression) + .let { it.replaced(KtPsiFactory(it).createStringTemplate(stringLiteral)) } + .entries + .forEach { + val blockEntry = (it as? KtBlockStringTemplateEntry) + if (blockEntry?.canDropBraces() == true) blockEntry.dropBraces() + } } } } diff --git a/idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/curlyBraces.kt b/idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/curlyBraces.kt new file mode 100644 index 00000000000..6a91c87c980 --- /dev/null +++ b/idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/curlyBraces.kt @@ -0,0 +1,6 @@ +// WITH_RUNTIME +fun main() { + val id = "abc" + val date = "123" + val s = String.format("%s_%s_%s", id, date, id) +} \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/curlyBraces.kt.after b/idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/curlyBraces.kt.after new file mode 100644 index 00000000000..2b635d547e6 --- /dev/null +++ b/idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/curlyBraces.kt.after @@ -0,0 +1,6 @@ +// WITH_RUNTIME +fun main() { + val id = "abc" + val date = "123" + val s = "${id}_${date}_$id" +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index eec3c2c8816..a84a4cefaa6 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -11162,6 +11162,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/inspectionsLocal/replaceStringFormatWithLiteral"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true); } + @TestMetadata("curlyBraces.kt") + public void testCurlyBraces() throws Exception { + runTest("idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/curlyBraces.kt"); + } + @TestMetadata("formattableArgs.kt") public void testFormattableArgs() throws Exception { runTest("idea/testData/inspectionsLocal/replaceStringFormatWithLiteral/formattableArgs.kt");