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");