From ef1e54eda975b7c5b6992fadb4e042b6bc1b9fea Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Tue, 18 Feb 2020 01:20:24 +0900 Subject: [PATCH] ReplaceToStringWithStringTemplateInspection: insert curly braces if needed #KT-36735 Fixed --- .../ReplaceToStringWithStringTemplateInspection.kt | 11 ++++++----- .../callExpression.kt | 3 +++ .../callExpression.kt.after | 3 +++ .../inspections/LocalInspectionTestGenerated.java | 5 +++++ 4 files changed, 17 insertions(+), 5 deletions(-) create mode 100644 idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/callExpression.kt create mode 100644 idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/callExpression.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceToStringWithStringTemplateInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceToStringWithStringTemplateInspection.kt index 837a6b44246..0d13b241487 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceToStringWithStringTemplateInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/ReplaceToStringWithStringTemplateInspection.kt @@ -7,11 +7,10 @@ package org.jetbrains.kotlin.idea.inspections import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.idea.core.canDropBraces +import org.jetbrains.kotlin.idea.core.dropBraces import org.jetbrains.kotlin.idea.intentions.isToString -import org.jetbrains.kotlin.psi.KtBlockStringTemplateEntry -import org.jetbrains.kotlin.psi.KtDotQualifiedExpression -import org.jetbrains.kotlin.psi.KtPsiFactory -import org.jetbrains.kotlin.psi.KtReferenceExpression +import org.jetbrains.kotlin.psi.* class ReplaceToStringWithStringTemplateInspection : AbstractApplicabilityBasedInspection( KtDotQualifiedExpression::class.java @@ -24,7 +23,9 @@ class ReplaceToStringWithStringTemplateInspection : AbstractApplicabilityBasedIn override fun applyTo(element: KtDotQualifiedExpression, project: Project, editor: Editor?) { val variable = element.receiverExpression.text - element.replace(KtPsiFactory(element).createExpression("\"$$variable\"")) + val replaced = element.replace(KtPsiFactory(element).createExpression("\"\${$variable}\"")) + val blockStringTemplateEntry = (replaced as? KtStringTemplateExpression)?.entries?.firstOrNull() as? KtBlockStringTemplateEntry + if (blockStringTemplateEntry?.canDropBraces() == true) blockStringTemplateEntry.dropBraces() } override fun inspectionText(element: KtDotQualifiedExpression) = "Call of 'toString' could be replaced with string template" diff --git a/idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/callExpression.kt b/idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/callExpression.kt new file mode 100644 index 00000000000..92e827842c8 --- /dev/null +++ b/idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/callExpression.kt @@ -0,0 +1,3 @@ +data class Num(val x: Int) + +fun demo(x: Int) = Num(x).toString() \ No newline at end of file diff --git a/idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/callExpression.kt.after b/idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/callExpression.kt.after new file mode 100644 index 00000000000..1487d4cdaa6 --- /dev/null +++ b/idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/callExpression.kt.after @@ -0,0 +1,3 @@ +data class Num(val x: Int) + +fun demo(x: Int) = "${Num(x)}" \ 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 73e800c2ac1..51084291353 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -11001,6 +11001,11 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/inspectionsLocal/replaceToStringWithStringTemplate"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true); } + @TestMetadata("callExpression.kt") + public void testCallExpression() throws Exception { + runTest("idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/callExpression.kt"); + } + @TestMetadata("nonReference.kt") public void testNonReference() throws Exception { runTest("idea/testData/inspectionsLocal/replaceToStringWithStringTemplate/nonReference.kt");