From 61edbbade18796b669c1b35077525b51c0d1f3a1 Mon Sep 17 00:00:00 2001 From: Pavel Dolgov Date: Thu, 17 Nov 2016 13:28:57 +0300 Subject: [PATCH] Java: Don't cause endless recursive calls of the equals() method in the inspection "Objects compared with '=='" (IDEA-164038) --- .../EqualityOperatorComparesObjectsInspection.java | 7 +++++++ .../CompareFieldInEqualsMethod.after.java | 14 ++++++++++++++ .../CompareFieldInEqualsMethod.java | 14 ++++++++++++++ .../CompareThisInEqualsMethod.java | 14 ++++++++++++++ ...yOperatorComparesObjectsInspectionTestBase.java | 2 ++ 5 files changed, 51 insertions(+) create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareFieldInEqualsMethod.after.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareFieldInEqualsMethod.java create mode 100644 plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareThisInEqualsMethod.java diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/equality/EqualityOperatorComparesObjectsInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/equality/EqualityOperatorComparesObjectsInspection.java index 57d00fc9dcfb..39d789872eaf 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/equality/EqualityOperatorComparesObjectsInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/equality/EqualityOperatorComparesObjectsInspection.java @@ -19,6 +19,7 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; +import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.psi.util.TypeConversionUtil; import com.siyeh.InspectionGadgetsBundle; @@ -208,6 +209,12 @@ public class EqualityOperatorComparesObjectsInspection extends BaseInspection { if (rhsType == null || rhsType instanceof PsiPrimitiveType || TypeConversionUtil.isEnumType(rhsType)) { return; } + if (lhs instanceof PsiThisExpression || rhs instanceof PsiThisExpression) { + final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class); + if (method != null && "equals".equals(method.getName())) { + return; + } + } final String operationText = expression.getOperationSign().getText(); final String prefix = tokenType.equals(JavaTokenType.NE) ? "!" : ""; registerError(expression, operationText, prefix); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareFieldInEqualsMethod.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareFieldInEqualsMethod.after.java new file mode 100644 index 000000000000..c3f00c5d834f --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareFieldInEqualsMethod.after.java @@ -0,0 +1,14 @@ +class Demo { + private Object field; + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + else { + Demo other = (Demo)obj; + return field.equals(other.field); + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareFieldInEqualsMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareFieldInEqualsMethod.java new file mode 100644 index 000000000000..28f947454dcd --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareFieldInEqualsMethod.java @@ -0,0 +1,14 @@ +class Demo { + private Object field; + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + else { + Demo other = (Demo)obj; + return field == other.field; + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareThisInEqualsMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareThisInEqualsMethod.java new file mode 100644 index 000000000000..f2a9bfbe301b --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareThisInEqualsMethod.java @@ -0,0 +1,14 @@ +class Demo { + private Object field; + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + else { + Demo other = (Demo)obj; + return field == other.field; + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/equality/EqualityOperatorComparesObjectsInspectionTestBase.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/equality/EqualityOperatorComparesObjectsInspectionTestBase.java index be5f15a96be7..b49cca0b7232 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/equality/EqualityOperatorComparesObjectsInspectionTestBase.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/equality/EqualityOperatorComparesObjectsInspectionTestBase.java @@ -30,6 +30,8 @@ public abstract class EqualityOperatorComparesObjectsInspectionTestBase extends public void testPrimitiveComparison() { assertQuickfixNotAvailable(); } public void testSimpleObjectComparison() { doTest(true, false); } public void testNegatedObjectComparison() { doTest(false, false); } + public void testCompareThisInEqualsMethod() { assertQuickfixNotAvailable(); } + public void testCompareFieldInEqualsMethod() { doTest(true, false); } @Override protected void setUp() throws Exception { -- 2.23.3