diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/equality/EqualityOperatorComparesObjectsInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/equality/EqualityOperatorComparesObjectsInspection.java index 39d789872eaf..aa684e632852 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/equality/EqualityOperatorComparesObjectsInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/equality/EqualityOperatorComparesObjectsInspection.java @@ -32,6 +32,7 @@ import com.siyeh.ig.psiutils.ParenthesesUtils; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class EqualityOperatorComparesObjectsInspection extends BaseInspection { @@ -211,13 +212,24 @@ public class EqualityOperatorComparesObjectsInspection extends BaseInspection { } if (lhs instanceof PsiThisExpression || rhs instanceof PsiThisExpression) { final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class); - if (method != null && "equals".equals(method.getName())) { - return; + if (method != null && "equals".equals(method.getName()) && method.getParameterList().getParametersCount() == 1) { + final PsiClass containingClass = method.getContainingClass(); + if (isThisQualifier(lhs, containingClass) || isThisQualifier(rhs, containingClass)) { + return; + } } } final String operationText = expression.getOperationSign().getText(); final String prefix = tokenType.equals(JavaTokenType.NE) ? "!" : ""; registerError(expression, operationText, prefix); } + + private static boolean isThisQualifier(@Nullable PsiExpression expression, @Nullable PsiClass psiClass) { + if (expression instanceof PsiThisExpression) { + final PsiJavaCodeReferenceElement qualifier = ((PsiThisExpression)expression).getQualifier(); + return qualifier == null || psiClass != null && qualifier.isReferenceTo(psiClass); + } + return false; + } } } \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareOtherQualifiedThisInEqualsMethod.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareOtherQualifiedThisInEqualsMethod.after.java new file mode 100644 index 000000000000..7e5d76daed71 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareOtherQualifiedThisInEqualsMethod.after.java @@ -0,0 +1,13 @@ +class Outer { + class Inner { + private Outer outer() { + return Outer.this; + } + + @Override + public boolean equals(Object obj) { + return (obj instanceof Inner) && + Outer.this.equals(((Inner) obj).outer()); + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareOtherQualifiedThisInEqualsMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareOtherQualifiedThisInEqualsMethod.java new file mode 100644 index 000000000000..8678daef8a14 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareOtherQualifiedThisInEqualsMethod.java @@ -0,0 +1,13 @@ +class Outer { + class Inner { + private Outer outer() { + return Outer.this; + } + + @Override + public boolean equals(Object obj) { + return (obj instanceof Inner) && + Outer.this == ((Inner) obj).outer(); + } + } +} \ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareSameQualifiedThisInEqualsMethod.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareSameQualifiedThisInEqualsMethod.java new file mode 100644 index 000000000000..463b10438fd6 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/equality/replace_equality_with_equals/CompareSameQualifiedThisInEqualsMethod.java @@ -0,0 +1,14 @@ +class Demo { + private Object field; + + @Override + public boolean equals(Object obj) { + if (Demo.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 b49cca0b7232..d5b9c068cde0 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/equality/EqualityOperatorComparesObjectsInspectionTestBase.java +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/equality/EqualityOperatorComparesObjectsInspectionTestBase.java @@ -31,6 +31,8 @@ public abstract class EqualityOperatorComparesObjectsInspectionTestBase extends public void testSimpleObjectComparison() { doTest(true, false); } public void testNegatedObjectComparison() { doTest(false, false); } public void testCompareThisInEqualsMethod() { assertQuickfixNotAvailable(); } + public void testCompareSameQualifiedThisInEqualsMethod() { assertQuickfixNotAvailable(); } + public void testCompareOtherQualifiedThisInEqualsMethod() { doTest(true, false); } public void testCompareFieldInEqualsMethod() { doTest(true, false); } @Override