diff --git a/platform/platform-resources-en/src/inspectionDescriptions/ObjectsEqualsCanBeSimplified.html b/platform/platform-resources-en/src/inspectionDescriptions/ObjectsEqualsCanBeSimplified.html index 6e85ed5d8fb5..7e5438f74bb0 100644 --- a/platform/platform-resources-en/src/inspectionDescriptions/ObjectsEqualsCanBeSimplified.html +++ b/platform/platform-resources-en/src/inspectionDescriptions/ObjectsEqualsCanBeSimplified.html @@ -1,7 +1,7 @@
Reports calls to Objects.equals(a, b) where the first argument is statically known to be non-null. - Such a call can be safely replaced with a.equals(b). + Such a call can be safely replaced with a.equals(b) or a == b if both arguments are primitives.New in 2018.3
diff --git a/platform/platform-resources-en/src/messages/InspectionsBundle.properties b/platform/platform-resources-en/src/messages/InspectionsBundle.properties index 72669a4eeada..ebffe7cef16f 100644 --- a/platform/platform-resources-en/src/messages/InspectionsBundle.properties +++ b/platform/platform-resources-en/src/messages/InspectionsBundle.properties @@ -1001,8 +1001,7 @@ inspection.class.getclass.fix.remove.name=Remove 'getClass()' call inspection.class.getclass.fix.replace.name=Replace with 'Class.class' redundant.backticks.around.raw.string.literal.display.name=Redundant backticks around raw string literal inspection.objects.equals.can.be.simplified.display.name=Objects.equals() can be replaced with equals() -inspection.objects.equals.can.be.simplified.message=Can be replaced with 'equals()' -inspection.objects.equals.can.be.simplified.fix.name=Replace 'Objects.equals()' with 'equals()' +inspection.objects.equals.can.be.simplified.message=Can be replaced with ''{0}'' inspection.duplicate.expressions.display.name=Multiple occurrences of the same expression inspection.duplicate.expressions.message=Multiple occurrences of#ref #loc
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/ObjectsEqualsCanBeSimplifiedInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/ObjectsEqualsCanBeSimplifiedInspection.java
index af20870af51d..e02428ee9ba5 100644
--- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/ObjectsEqualsCanBeSimplifiedInspection.java
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/ObjectsEqualsCanBeSimplifiedInspection.java
@@ -6,9 +6,9 @@ import com.intellij.codeInspection.*;
import com.intellij.codeInspection.dataFlow.NullabilityUtil;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
-import com.intellij.psi.util.PsiPrecedenceUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
+import com.intellij.psi.util.TypeConversionUtil;
import com.siyeh.ig.callMatcher.CallMatcher;
import com.siyeh.ig.psiutils.CommentTracker;
import com.siyeh.ig.psiutils.TypeUtils;
@@ -17,6 +17,9 @@ import org.jetbrains.annotations.NotNull;
import java.util.Objects;
+import static com.intellij.psi.util.PsiPrecedenceUtil.EQUALITY_PRECEDENCE;
+import static com.intellij.psi.util.PsiPrecedenceUtil.METHOD_CALL_PRECEDENCE;
+
public class ObjectsEqualsCanBeSimplifiedInspection extends AbstractBaseJavaLocalInspectionTool {
private static final CallMatcher OBJECTS_EQUALS = CallMatcher.staticCall(
CommonClassNames.JAVA_UTIL_OBJECTS, "equals").parameterCount(2);
@@ -31,7 +34,11 @@ public class ObjectsEqualsCanBeSimplifiedInspection extends AbstractBaseJavaLoca
@Override
public void visitMethodCallExpression(PsiMethodCallExpression call) {
if (!OBJECTS_EQUALS.test(call)) return;
- PsiExpression arg1 = call.getArgumentList().getExpressions()[0];
+ PsiExpression[] args = call.getArgumentList().getExpressions();
+ PsiExpression arg1 = args[0];
+ PsiExpression arg2 = args[1];
+ PsiElement nameElement = Objects.requireNonNull(call.getMethodExpression().getReferenceNameElement());
+ if (processPrimitives(nameElement, arg1, arg2)) return;
PsiClass argClass = PsiUtil.resolveClassInClassTypeOnly(arg1.getType());
if (argClass == null) return;
if (NullabilityUtil.getExpressionNullability(arg1, true) == Nullability.NOT_NULL) {
@@ -45,20 +52,36 @@ public class ObjectsEqualsCanBeSimplifiedInspection extends AbstractBaseJavaLoca
return;
}
}
- PsiElement nameElement = Objects.requireNonNull(call.getMethodExpression().getReferenceNameElement());
- holder.registerProblem(nameElement, InspectionsBundle.message("inspection.objects.equals.can.be.simplified.message"),
- new ReplaceWithEqualsFix());
+ holder.registerProblem(nameElement, InspectionsBundle.message("inspection.objects.equals.can.be.simplified.message", "equals()"),
+ new ReplaceWithEqualsFix(false));
}
}
+
+ private boolean processPrimitives(PsiElement nameElement, PsiExpression arg1, PsiExpression arg2) {
+ PsiType type1 = arg1.getType();
+ PsiType type2 = arg2.getType();
+ if (type1 instanceof PsiPrimitiveType && type1.equals(type2) && !TypeConversionUtil.isFloatOrDoubleType(type1)) {
+ holder.registerProblem(nameElement, InspectionsBundle.message("inspection.objects.equals.can.be.simplified.message", "=="),
+ new ReplaceWithEqualsFix(true));
+ return true;
+ }
+ return false;
+ }
};
}
private static class ReplaceWithEqualsFix implements LocalQuickFix {
+ final boolean myEquality;
+
+ private ReplaceWithEqualsFix(boolean equality) {
+ myEquality = equality;
+ }
+
@Nls(capitalization = Nls.Capitalization.Sentence)
@NotNull
@Override
public String getFamilyName() {
- return InspectionsBundle.message("inspection.objects.equals.can.be.simplified.fix.name");
+ return CommonQuickFixBundle.message("fix.replace.x.with.y", "Objects.equals()", myEquality ? "==" : "equals()");
}
@Override
@@ -68,7 +91,13 @@ public class ObjectsEqualsCanBeSimplifiedInspection extends AbstractBaseJavaLoca
PsiExpression[] args = call.getArgumentList().getExpressions();
if (args.length != 2) return;
CommentTracker ct = new CommentTracker();
- String replacement = ct.text(args[0], PsiPrecedenceUtil.METHOD_CALL_PRECEDENCE) + ".equals(" + ct.text(args[1]) + ")";
+ String replacement;
+ if (myEquality) {
+ replacement = ct.text(args[0], EQUALITY_PRECEDENCE) + "==" + ct.text(args[1], EQUALITY_PRECEDENCE);
+ }
+ else {
+ replacement = ct.text(args[0], METHOD_CALL_PRECEDENCE) + ".equals(" + ct.text(args[1]) + ")";
+ }
ct.replaceAndRestoreComments(call, replacement);
}
}
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/simplify_objects_equals/ObjectsEqualsCanBeSimplified.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/simplify_objects_equals/ObjectsEqualsCanBeSimplified.java
index 9cf4f9c9b718..3ae31701b40c 100644
--- a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/simplify_objects_equals/ObjectsEqualsCanBeSimplified.java
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/simplify_objects_equals/ObjectsEqualsCanBeSimplified.java
@@ -13,6 +13,15 @@ class Test {
if(arr1 != null && Objects.equals(arr1, arr2)) System.out.println();
}
+
+ void testPrimitives(int a, int b, long c, long d, double e, double f, boolean g, boolean h) {
+ if(Objects.