From c1af7c47a6fd4a006d6a30204e91c7c74104205b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 8 Jun 2017 17:59:44 +0300 Subject: [PATCH] Redundant toString() in string template: highlight selector only And not the receiver. So #KT-18253 Fixed GitOrigin-RevId: 116d0b65b1cf2d483d0786e1946ac0b3a15e11c6 --- ...emoveToStringInStringTemplateInspection.kt | 15 ++++++------- .../LocalInspectionTestGenerated.java | 21 +++++++++++++++++++ .../.inspection | 1 + .../caretInReceiver.kt | 7 +++++++ .../caretInSelector.kt | 5 +++++ .../caretInSelector.kt.after | 5 +++++ 6 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/.inspection create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInReceiver.kt create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt create mode 100644 plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt.after diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt index e402022ba5d0..7fddd08dcfb6 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt @@ -19,7 +19,6 @@ package org.jetbrains.kotlin.idea.inspections import com.intellij.codeInsight.FileModificationService import com.intellij.codeInspection.* import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.idea.core.getDeepestSuperDeclarations import org.jetbrains.kotlin.idea.intentions.toResolvedCall @@ -31,13 +30,15 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode class RemoveToStringInStringTemplateInspection : AbstractKotlinInspection(), CleanupLocalInspectionTool { override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean, session: LocalInspectionToolSession) = object : KtVisitorVoid() { - override fun visitCallExpression(expression: KtCallExpression) { - val qualifiedExpression = expression.parent as? KtDotQualifiedExpression ?: return - if (qualifiedExpression.parent !is KtBlockStringTemplateEntry) return - if (qualifiedExpression.receiverExpression is KtSuperExpression) return - if (!qualifiedExpression.isToString()) return + override fun visitDotQualifiedExpression(expression: KtDotQualifiedExpression) { + super.visitDotQualifiedExpression(expression) - holder.registerProblem(expression, + if (expression.parent !is KtBlockStringTemplateEntry) return + if (expression.receiverExpression is KtSuperExpression) return + val selectorExpression = expression.selectorExpression ?: return + if (!expression.isToString()) return + + holder.registerProblem(selectorExpression, "Redundant 'toString()' call in string template", ProblemHighlightType.LIKE_UNUSED_SYMBOL, RemoveToStringFix()) diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 457a7d3f87ea..de450b941ea8 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java @@ -147,6 +147,27 @@ public class LocalInspectionTestGenerated extends AbstractLocalInspectionTest { } } + @TestMetadata("idea/testData/inspectionsLocal/removeToStringInStringTemplate") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class RemoveToStringInStringTemplate extends AbstractLocalInspectionTest { + public void testAllFilesPresentInRemoveToStringInStringTemplate() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/inspectionsLocal/removeToStringInStringTemplate"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), TargetBackend.ANY, true); + } + + @TestMetadata("caretInReceiver.kt") + public void testCaretInReceiver() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInReceiver.kt"); + doTest(fileName); + } + + @TestMetadata("caretInSelector.kt") + public void testCaretInSelector() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/inspectionsLocal/replaceArrayOfWithLiteral") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/.inspection b/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/.inspection new file mode 100644 index 000000000000..6ed01c9bc53a --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.inspections.RemoveToStringInStringTemplateInspection diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInReceiver.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInReceiver.kt new file mode 100644 index 000000000000..f66e736455fc --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInReceiver.kt @@ -0,0 +1,7 @@ +// PROBLEM: none + +fun foo(a: Int, b: Int) = a + b + +fun test(): String { + return "Foo: ${foo(0, 4).toString()}" +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt b/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt new file mode 100644 index 000000000000..a83e8c7d7527 --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt @@ -0,0 +1,5 @@ +fun foo(a: Int, b: Int) = a + b + +fun test(): String { + return "Foo: ${foo(0, 4).toString()}" +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt.after b/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt.after new file mode 100644 index 000000000000..72da0f582fce --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt.after @@ -0,0 +1,5 @@ +fun foo(a: Int, b: Int) = a + b + +fun test(): String { + return "Foo: ${foo(0, 4)}" +} \ No newline at end of file