From 44e727b75c70b3fbe9c78a4e02c505607c1346b2 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 --- ...emoveToStringInStringTemplateInspection.kt | 15 ++++++------- .../.inspection | 1 + .../caretInReceiver.kt | 7 +++++++ .../caretInSelector.kt | 5 +++++ .../caretInSelector.kt.after | 5 +++++ .../LocalInspectionTestGenerated.java | 21 +++++++++++++++++++ 6 files changed, 47 insertions(+), 7 deletions(-) create mode 100644 idea/testData/inspectionsLocal/removeToStringInStringTemplate/.inspection create mode 100644 idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInReceiver.kt create mode 100644 idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt create mode 100644 idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt index e402022ba5d..7fddd08dcfb 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/RemoveToStringInStringTemplateInspection.kt +++ b/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/idea/testData/inspectionsLocal/removeToStringInStringTemplate/.inspection b/idea/testData/inspectionsLocal/removeToStringInStringTemplate/.inspection new file mode 100644 index 00000000000..6ed01c9bc53 --- /dev/null +++ b/idea/testData/inspectionsLocal/removeToStringInStringTemplate/.inspection @@ -0,0 +1 @@ +org.jetbrains.kotlin.idea.inspections.RemoveToStringInStringTemplateInspection diff --git a/idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInReceiver.kt b/idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInReceiver.kt new file mode 100644 index 00000000000..f66e736455f --- /dev/null +++ b/idea/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/idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt b/idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt new file mode 100644 index 00000000000..a83e8c7d752 --- /dev/null +++ b/idea/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/idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt.after b/idea/testData/inspectionsLocal/removeToStringInStringTemplate/caretInSelector.kt.after new file mode 100644 index 00000000000..72da0f582fc --- /dev/null +++ b/idea/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 diff --git a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java index 457a7d3f87e..de450b941ea 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/inspections/LocalInspectionTestGenerated.java +++ b/idea/tests/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)