Java inspection: Handle static fields in EqualsReplaceableByObjectsCallInspection (IDEA-161076)

This commit is contained in:
Pavel Dolgov
2016-09-29 14:51:03 +03:00
parent aff263f489
commit b5347c6a1d
8 changed files with 96 additions and 7 deletions
@@ -259,18 +259,30 @@ public class EqualsReplaceableByObjectsCallInspection extends BaseInspection {
if (expression instanceof PsiReferenceExpression) {
final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)expression;
final String referenceName = referenceExpression.getReferenceName();
if (referenceName != null && referenceExpression.resolve() instanceof PsiVariable) {
final PsiExpression qualifierExpression = ParenthesesUtils.stripParentheses(referenceExpression.getQualifierExpression());
if (qualifierExpression == null) {
return referenceName;
if (referenceName != null) {
final PsiElement resolved = referenceExpression.resolve();
if (resolved instanceof PsiVariable || resolved instanceof PsiClass) {
final PsiExpression qualifierExpression = ParenthesesUtils.stripParentheses(referenceExpression.getQualifierExpression());
if (qualifierExpression == null) {
return referenceName;
}
final String qualifierName = getQualifiedVariableName(qualifierExpression);
return qualifierName != null ? qualifierName + "." + referenceName : null;
}
final String qualifierName = getQualifiedVariableName(qualifierExpression);
return qualifierName != null ? qualifierName + "." + referenceName : null;
}
}
else if (expression instanceof PsiQualifiedExpression) {
final PsiJavaCodeReferenceElement qualifier = ((PsiQualifiedExpression)expression).getQualifier();
final String name = expression instanceof PsiThisExpression ? "this" : "super";
final String name;
if (expression instanceof PsiThisExpression) {
name = "this";
}
else if (expression instanceof PsiSuperExpression) {
name = "super";
}
else {
return null;
}
return qualifier != null ? qualifier.getQualifiedName() + "." + name : name;
}
return null;
@@ -0,0 +1,10 @@
import java.util.Objects;
class T {
static class A {
static String a;
}
static boolean same(String s) {
return Objects.equals(A.a, s);
}
}
@@ -0,0 +1,8 @@
class T {
static class A {
static String a;
}
static boolean same(String s) {
return A.a != null && A.a.<caret>equals(s);
}
}
@@ -0,0 +1,10 @@
import java.util.Objects;
class T {
static class A {
static String a;
}
static boolean dfferent(String s) {
return !Objects.equals(A.a, s);
}
}
@@ -0,0 +1,8 @@
class T {
static class A {
static String a;
}
static boolean dfferent(String s) {
return A.a != s && (A.a == null || !A.a.<caret>equals(s));
}
}
@@ -49,4 +49,23 @@ class EqualsReplaceableByObjectsCall {
return <warning descr="'t != this && (t == null || !t.equals(this))' replaceable by 'Objects.equals()' expression">t != this && (t == null || !t.equals(this))</warning>;
}
}
static class A {
static String b;
static class B {
static String c;
}
}
static boolean ab1(String s) {
return <warning descr="'A.b.equals(s)' replaceable by 'Objects.equals()' expression">A.b.equals(s)</warning>;
}
static boolean ab2(String s) {
return <warning descr="'A.b != null && A.b.equals(s)' replaceable by 'Objects.equals()' expression">A.b != null && A.b.equals(s)</warning>;
}
static boolean ab3(String s) {
return <warning descr="'A.b == s || A.b != null && A.b.equals(s)' replaceable by 'Objects.equals()' expression">A.b == s || A.b != null && A.b.equals(s)</warning>;
}
static boolean abc(String s) {
return <warning descr="'A.B.c == s || A.B.c != null && A.B.c.equals(s)' replaceable by 'Objects.equals()' expression">A.B.c == s || A.B.c != null && A.B.c.equals(s)</warning>;
}
}
@@ -49,4 +49,23 @@ class EqualsReplaceableByObjectsCall {
return <warning descr="'t != this && (t == null || !t.equals(this))' replaceable by 'Objects.equals()' expression">t != this && (t == null || !t.equals(this))</warning>;
}
}
static class A {
static String b;
static class B {
static String c;
}
}
static boolean ab1(String s) {
return A.b.equals(s);
}
static boolean ab2(String s) {
return <warning descr="'A.b != null && A.b.equals(s)' replaceable by 'Objects.equals()' expression">A.b != null && A.b.equals(s)</warning>;
}
static boolean ab3(String s) {
return <warning descr="'A.b == s || A.b != null && A.b.equals(s)' replaceable by 'Objects.equals()' expression">A.b == s || A.b != null && A.b.equals(s)</warning>;
}
static boolean abc(String s) {
return <warning descr="'A.B.c == s || A.B.c != null && A.B.c.equals(s)' replaceable by 'Objects.equals()' expression">A.B.c == s || A.B.c != null && A.B.c.equals(s)</warning>;
}
}
@@ -48,6 +48,9 @@ public class EqualsReplaceableByObjectsCallFixTest extends IGQuickFixesTestCase
public void testQualifiedThisNotEqual() { doTest(); }
public void testQualifiedSuperEqual() { doTest(); }
public void testStaticField() { doTest(); }
public void testStaticField2() { doTest(); }
@Override
protected void tuneFixture(JavaModuleFixtureBuilder builder) throws Exception {
builder.addJdk(IdeaTestUtil.getMockJdk18Path().getPath())