From 475dc6541bc38bf4fe3e560027a9dd890b58b9f7 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 28 Jul 2016 11:56:59 +0300 Subject: [PATCH] Replace call with comparison inspection introduced #KT-11425 Fixed (cherry picked from commit 042fc0d) --- .../ReplaceCallWithComparison.html | 4 +++ idea/src/META-INF/plugin.xml | 8 +++++ .../ReplaceCallWithBinaryOperatorIntention.kt | 12 +++++++ .../inspectionData/expected.xml | 34 +++++++++++++++++++ .../inspectionData/inspections.test | 1 + .../replaceCallWithComparison/test.kt | 10 ++++++ .../codeInsight/InspectionTestGenerated.java | 6 ++++ 7 files changed, 75 insertions(+) create mode 100644 idea/resources/inspectionDescriptions/ReplaceCallWithComparison.html create mode 100644 idea/testData/inspections/replaceCallWithComparison/inspectionData/expected.xml create mode 100644 idea/testData/inspections/replaceCallWithComparison/inspectionData/inspections.test create mode 100644 idea/testData/inspections/replaceCallWithComparison/test.kt diff --git a/idea/resources/inspectionDescriptions/ReplaceCallWithComparison.html b/idea/resources/inspectionDescriptions/ReplaceCallWithComparison.html new file mode 100644 index 00000000000..1ed3a69bb52 --- /dev/null +++ b/idea/resources/inspectionDescriptions/ReplaceCallWithComparison.html @@ -0,0 +1,4 @@ + +This inspection reports equals() and compareTo() calls that can be replaced with binary comparison. +Example: 2.compareTo(1) > 0 can be replaced by 2 > 1. + \ No newline at end of file diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index 1c14dd95f11..81070fed4e0 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -1636,6 +1636,14 @@ language="kotlin" /> + + diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceCallWithBinaryOperatorIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceCallWithBinaryOperatorIntention.kt index 0bb229d2bae..b0c5654e5c9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceCallWithBinaryOperatorIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/conventionNameCalls/ReplaceCallWithBinaryOperatorIntention.kt @@ -20,6 +20,7 @@ import com.intellij.codeInsight.intention.HighPriorityAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.util.TextRange import com.intellij.psi.tree.IElementType +import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection import com.intellij.psi.PsiElement import org.jetbrains.kotlin.idea.intentions.* import org.jetbrains.kotlin.lexer.KtSingleValueToken @@ -33,6 +34,17 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.types.expressions.OperatorConventions import org.jetbrains.kotlin.util.OperatorNameConventions +class ReplaceCallWithComparisonInspection( + val intention: ReplaceCallWithBinaryOperatorIntention = ReplaceCallWithBinaryOperatorIntention() +) : IntentionBasedInspection( + intention, + { qualifiedExpression -> + val calleeExpression = qualifiedExpression.callExpression?.calleeExpression as? KtSimpleNameExpression + val identifier = calleeExpression?.getReferencedNameAsName() + identifier == OperatorNameConventions.EQUALS || identifier == OperatorNameConventions.COMPARE_TO + } +) + class ReplaceCallWithBinaryOperatorIntention : SelfTargetingRangeIntention( KtDotQualifiedExpression::class.java, "Replace call with binary operator" diff --git a/idea/testData/inspections/replaceCallWithComparison/inspectionData/expected.xml b/idea/testData/inspections/replaceCallWithComparison/inspectionData/expected.xml new file mode 100644 index 00000000000..2c2a9e18e94 --- /dev/null +++ b/idea/testData/inspections/replaceCallWithComparison/inspectionData/expected.xml @@ -0,0 +1,34 @@ + + + test.kt + 2 + light_idea_test_case + + Can be replaced with comparison + Replace with '==' operator + + + test.kt + 3 + light_idea_test_case + + Can be replaced with comparison + Replace with '==' operator + + + test.kt + 6 + light_idea_test_case + + Can be replaced with comparison + Replace with '>' operator + + + test.kt + 7 + light_idea_test_case + + Can be replaced with comparison + Replace with '<=' operator + + \ No newline at end of file diff --git a/idea/testData/inspections/replaceCallWithComparison/inspectionData/inspections.test b/idea/testData/inspections/replaceCallWithComparison/inspectionData/inspections.test new file mode 100644 index 00000000000..f8c25a1e1ba --- /dev/null +++ b/idea/testData/inspections/replaceCallWithComparison/inspectionData/inspections.test @@ -0,0 +1 @@ +// INSPECTION_CLASS: org.jetbrains.kotlin.idea.intentions.conventionNameCalls.ReplaceCallWithComparisonInspection diff --git a/idea/testData/inspections/replaceCallWithComparison/test.kt b/idea/testData/inspections/replaceCallWithComparison/test.kt new file mode 100644 index 00000000000..0b4f0e8af70 --- /dev/null +++ b/idea/testData/inspections/replaceCallWithComparison/test.kt @@ -0,0 +1,10 @@ +fun foo() { + 1.equals(1) // YES + !1.equals(2) // YES + 1.compareTo(1) // NO + 1.compareTo(1) == 0 // NO + 2.compareTo(1) > 0 // YES + 0 >= 1.compareTo(2) // YES + 2.plus(2) // NO + 2.times(2) // NO +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java index d13dda5117e..90aa94d37de 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/InspectionTestGenerated.java @@ -226,6 +226,12 @@ public class InspectionTestGenerated extends AbstractInspectionTest { doTest(fileName); } + @TestMetadata("replaceCallWithComparison/inspectionData/inspections.test") + public void testReplaceCallWithComparison_inspectionData_Inspections_test() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/replaceCallWithComparison/inspectionData/inspections.test"); + doTest(fileName); + } + @TestMetadata("spelling/inspectionData/inspections.test") public void testSpelling_inspectionData_Inspections_test() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/inspections/spelling/inspectionData/inspections.test");