diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/ComparatorCombinatorsInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/ComparatorCombinatorsInspection.java index 81020c7b5fc8..c858041509cb 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/ComparatorCombinatorsInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/ComparatorCombinatorsInspection.java @@ -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; diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConvertCompareToToEqualsIntention.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConvertCompareToToEqualsIntention.java index f81bfcd5684f..a6f4fbb0f0e1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConvertCompareToToEqualsIntention.java +++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/ConvertCompareToToEqualsIntention.java @@ -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; } diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiMethodUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiMethodUtil.java index 5082112471fa..ccef1757f954 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiMethodUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiMethodUtil.java @@ -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; - } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/CompareToUsesNonFinalVariableInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/CompareToUsesNonFinalVariableInspection.java index 13d8d409ed42..db8ecee9b919 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/CompareToUsesNonFinalVariableInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/CompareToUsesNonFinalVariableInspection.java @@ -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); } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SubtractionInCompareToInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SubtractionInCompareToInspectionBase.java index 046366768228..6dc6a4f9c306 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SubtractionInCompareToInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SubtractionInCompareToInspectionBase.java @@ -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); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/internationalization/StringCompareToInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/internationalization/StringCompareToInspection.java index f440199743bd..b149a722b7e8 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/internationalization/StringCompareToInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/internationalization/StringCompareToInspection.java @@ -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; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/MethodUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/MethodUtils.java index f6214cc30f7c..68d5bb85e3e3 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/MethodUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/MethodUtils.java @@ -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); + } }