IDEA-CR-13704 PsiMethodUtil::isCompareToCall moved to MethodUtils; code reused from MethodUtils::isCompareTo; redundant null checks removed

This commit is contained in:
Tagir Valeev
2016-09-13 10:54:42 +07:00
parent 77e155245f
commit 256823f66a
7 changed files with 31 additions and 47 deletions
@@ -20,7 +20,7 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.intellij.psi.codeStyle.JavaCodeStyleManager;
import com.intellij.psi.util.PsiMethodUtil;
import com.siyeh.ig.psiutils.MethodUtils;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
@@ -37,7 +37,7 @@ public class ComparatorCombinatorsInspection extends BaseJavaBatchLocalInspectio
PsiElement body = lambda.getBody();
if(body instanceof PsiMethodCallExpression) {
PsiMethodCallExpression methodCall = (PsiMethodCallExpression)body;
if(PsiMethodUtil.isCompareToCall(methodCall)) {
if(MethodUtils.isCompareToCall(methodCall)) {
PsiExpression left = methodCall.getMethodExpression().getQualifierExpression();
PsiExpression right = methodCall.getArgumentList().getExpressions()[0];
if(left instanceof PsiMethodCallExpression && right instanceof PsiMethodCallExpression) {
@@ -95,7 +95,7 @@ public class ComparatorCombinatorsInspection extends BaseJavaBatchLocalInspectio
PsiElement body = lambda.getBody();
if (!(body instanceof PsiMethodCallExpression)) return;
PsiMethodCallExpression methodCall = (PsiMethodCallExpression)body;
if (!PsiMethodUtil.isCompareToCall(methodCall)) return;
if (!MethodUtils.isCompareToCall(methodCall)) return;
PsiExpression qualifier = methodCall.getMethodExpression().getQualifierExpression();
if (!(qualifier instanceof PsiMethodCallExpression)) return;
PsiMethodCallExpression call = (PsiMethodCallExpression)qualifier;
@@ -22,9 +22,9 @@ import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiMethodUtil;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.ig.psiutils.MethodUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -80,7 +80,7 @@ public class ConvertCompareToToEqualsIntention extends BaseElementAtCaretIntenti
PsiMethodCallExpression compareToExpression = null;
boolean hasZero = false;
for (PsiExpression psiExpression : binaryExpression.getOperands()) {
if (compareToExpression == null && PsiMethodUtil.isCompareToCall(psiExpression)) {
if (compareToExpression == null && MethodUtils.isCompareToCall(psiExpression)) {
compareToExpression = (PsiMethodCallExpression)psiExpression;
continue;
}
@@ -19,8 +19,6 @@ import com.intellij.codeInsight.runner.JavaMainMethodProvider;
import com.intellij.openapi.extensions.Extensions;
import com.intellij.openapi.util.Condition;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
@@ -91,35 +89,4 @@ public class PsiMethodUtil {
}
return findMainMethod(aClass);
}
public static boolean isCompareToCall(final @NotNull PsiExpression expression) {
if (!(expression instanceof PsiMethodCallExpression)) {
return false;
}
final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expression;
if (methodCallExpression.getMethodExpression().getQualifierExpression() == null) {
return false;
}
final PsiMethod psiMethod = methodCallExpression.resolveMethod();
if (psiMethod == null || !"compareTo".equals(psiMethod.getName()) || psiMethod.getParameterList().getParametersCount() != 1) {
return false;
}
if (methodCallExpression.getArgumentList().getExpressions().length != 1) {
return false;
}
final PsiClass containingClass = psiMethod.getContainingClass();
if (containingClass == null) {
return false;
}
final PsiClass javaLangComparable = JavaPsiFacade.getInstance(expression.getProject()).findClass(CommonClassNames.JAVA_LANG_COMPARABLE, GlobalSearchScope
.allScope(
expression.getProject()));
if (javaLangComparable == null) {
return false;
}
if (!containingClass.isInheritor(javaLangComparable, true)) {
return false;
}
return true;
}
}
@@ -15,8 +15,8 @@
*/
package com.siyeh.ig.bugs;
import com.intellij.psi.*;
import com.intellij.psi.util.InheritanceUtil;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiMethod;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
@@ -57,8 +57,7 @@ public class CompareToUsesNonFinalVariableInspection extends BaseInspection {
private static class CompareToUsesNonFinalVariableVisitor extends NonFinalFieldsVisitor {
@Override
public void visitMethod(@NotNull PsiMethod method) {
if (MethodUtils.isCompareTo(method) &&
InheritanceUtil.isInheritor(method.getContainingClass(), false, CommonClassNames.JAVA_LANG_COMPARABLE)) {
if (MethodUtils.isCompareTo(method)) {
checkUsedNonFinalFields(method);
}
}
@@ -91,7 +91,7 @@ public class SubtractionInCompareToInspectionBase extends BaseInspection {
}
}
final PsiMethod method = PsiTreeUtil.getParentOfType(expression, PsiMethod.class, true, PsiClass.class, PsiLambdaExpression.class);
if (method == null || !MethodUtils.isCompareTo(method) && !MethodUtils.isComparatorCompare(method)) {
if (!MethodUtils.isCompareTo(method) && !MethodUtils.isComparatorCompare(method)) {
return;
}
registerError(expression);
@@ -125,9 +125,6 @@ public class StringCompareToInspection extends BaseInspection {
return false;
}
final PsiMethod method = expression.resolveMethod();
if (method == null) {
return false;
}
if (!MethodUtils.isCompareTo(method)) {
return false;
}
@@ -26,6 +26,7 @@ import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.Query;
import com.siyeh.HardcodedMethodConstants;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -37,22 +38,28 @@ public class MethodUtils {
private MethodUtils() {}
@Contract("null -> false")
public static boolean isComparatorCompare(@Nullable PsiMethod method) {
return method != null && methodMatches(method, CommonClassNames.JAVA_UTIL_COMPARATOR, PsiType.INT, "compare", null, null);
}
@Contract("null -> false")
public static boolean isCompareTo(@Nullable PsiMethod method) {
return method != null && methodMatches(method, null, PsiType.INT, HardcodedMethodConstants.COMPARE_TO, PsiType.NULL);
return method != null && !methodMatches(method, null, PsiType.INT, HardcodedMethodConstants.COMPARE_TO, PsiType.NULL)
&& InheritanceUtil.isInheritor(method.getContainingClass(), CommonClassNames.JAVA_LANG_COMPARABLE);
}
@Contract("null -> false")
public static boolean isHashCode(@Nullable PsiMethod method) {
return method != null && methodMatches(method, null, PsiType.INT, HardcodedMethodConstants.HASH_CODE);
}
@Contract("null -> false")
public static boolean isFinalize(@Nullable PsiMethod method) {
return method != null && methodMatches(method, null, PsiType.VOID, HardcodedMethodConstants.FINALIZE);
}
@Contract("null -> false")
public static boolean isToString(@Nullable PsiMethod method) {
if (method == null) {
return false;
@@ -61,6 +68,7 @@ public class MethodUtils {
return methodMatches(method, null, stringType, HardcodedMethodConstants.TO_STRING);
}
@Contract("null -> false")
public static boolean isEquals(@Nullable PsiMethod method) {
if (method == null) {
return false;
@@ -355,4 +363,17 @@ public class MethodUtils {
final PsiExpression returnValue = returnStatement.getReturnValue();
return returnValue instanceof PsiThisExpression;
}
@Contract("null -> false")
public static boolean isCompareToCall(final @Nullable PsiExpression expression) {
if (!(expression instanceof PsiMethodCallExpression)) {
return false;
}
final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)expression;
if (methodCallExpression.getMethodExpression().getQualifierExpression() == null) {
return false;
}
final PsiMethod psiMethod = methodCallExpression.resolveMethod();
return isCompareTo(psiMethod);
}
}