diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SuspiciousComparatorCompareInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SuspiciousComparatorCompareInspection.java index 80c6f9fd7834..da075877f24e 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SuspiciousComparatorCompareInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/SuspiciousComparatorCompareInspection.java @@ -24,6 +24,7 @@ import com.intellij.codeInspection.dataFlow.value.DfaVariableValue; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; +import com.intellij.util.ObjectUtils; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -96,6 +97,19 @@ public class SuspiciousComparatorCompareInspection extends BaseInspection { PsiStatement statement = ControlFlowUtils.getOnlyStatementInBlock((PsiCodeBlock)body); if (statement instanceof PsiReturnStatement && ExpressionUtils.isZero(((PsiReturnStatement)statement).getReturnValue())) return; } + PsiMethodCallExpression soleCall = ObjectUtils.tryCast(LambdaUtil.extractSingleExpressionFromBody(body), PsiMethodCallExpression.class); + if (soleCall != null) { + PsiMethod method = soleCall.resolveMethod(); + if (method != null) { + List contracts = ControlFlowAnalyzer.getMethodCallContracts(method, soleCall); + if (contracts.size() == 1) { + MethodContract contract = contracts.get(0); + if (contract.isTrivial() && contract.getReturnValue() == MethodContract.ValueConstraint.THROW_EXCEPTION) { + return; + } + } + } + } PsiParameter[] parameters = parameterList.getParameters(); checkParameterList(parameters, body); checkReflexivity(parameters, body); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/suspicious_comparator_compare/ComparatorIsNotReflexive.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/suspicious_comparator_compare/ComparatorIsNotReflexive.java index c6041a9b93fa..e1bc02b720b9 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/suspicious_comparator_compare/ComparatorIsNotReflexive.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/suspicious_comparator_compare/ComparatorIsNotReflexive.java @@ -27,4 +27,10 @@ class ComparatorIsNotReflexive implements Comparator { if(b1.length != b2.length) return 0; // typo: == was intended return b1.length > b2.length ? 1 : -1; }; + + Comparator cmp = (a,b) -> test(); + + static int test() { + throw new RuntimeException(); + } }