diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractValue.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractValue.java index cabde8c540fc..84b8aac05946 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractValue.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ContractValue.java @@ -36,7 +36,7 @@ public abstract class ContractValue { /** * @return true if this contract value represents a bounds-checking condition */ - boolean isBoundCheckingCondition() { + public boolean isBoundCheckingCondition() { return false; } @@ -168,7 +168,7 @@ public abstract class ContractValue { } @Override - boolean isBoundCheckingCondition() { + public boolean isBoundCheckingCondition() { switch (myRelationType) { case LE: case LT: diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java index 0ab517e3976b..073b248ba6c6 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/MethodContract.java @@ -71,7 +71,7 @@ public abstract class MethodContract { abstract String getArgumentsPresentation(); - abstract List getConditions(); + public abstract List getConditions(); @Override public String toString() { @@ -91,7 +91,7 @@ public abstract class MethodContract { } @Override - List getConditions() { + public List getConditions() { return Collections.emptyList(); } }; @@ -114,7 +114,7 @@ public abstract class MethodContract { } @Override - List getConditions() { + public List getConditions() { return Collections.singletonList(condition); } }; diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardMethodContract.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardMethodContract.java index d06bced480b6..e2c804d209e6 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardMethodContract.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StandardMethodContract.java @@ -81,7 +81,7 @@ public final class StandardMethodContract extends MethodContract { } @Override - protected List getConditions() { + public List getConditions() { return IntStreamEx.ofIndices(arguments).mapToObj(idx -> arguments[idx].getCondition(idx)).without(ContractValue.booleanValue(true)) .toList(); } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java index 76cee28138c1..5864af6433d9 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/SideEffectChecker.java @@ -209,8 +209,9 @@ public class SideEffectChecker { if (method.getName().startsWith("assert") || method.getName().startsWith("check")) { return true; } - return ControlFlowAnalyzer.getMethodContracts(method).stream() - .anyMatch(mc -> mc.returnValue == MethodContract.ValueConstraint.THROW_EXCEPTION); + return ControlFlowAnalyzer.getMethodCallContracts(method, null).stream() + .filter(mc -> mc.getConditions().stream().noneMatch(cv -> cv.isBoundCheckingCondition())) + .anyMatch(mc -> mc.getReturnValue() == MethodContract.ValueConstraint.THROW_EXCEPTION); } private static boolean isSideEffectFreeConstructor(@NotNull PsiNewExpression newExpression) { diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/IgnoreResultOfCallInspectionTest.groovy b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/IgnoreResultOfCallInspectionTest.groovy index d2868033373e..0fb7329888cf 100644 --- a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/IgnoreResultOfCallInspectionTest.groovy +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/bugs/IgnoreResultOfCallInspectionTest.groovy @@ -281,4 +281,16 @@ class Test { } """ } + + void testOptionalOrElseThrow() { + doTest """ +import java.util.Optional; + +@SuppressWarnings("OptionalUsedAsFieldOrParameterType") +class Test { + void test(Optional opt) { + opt.orElseThrow(RuntimeException::new); + } +}""" + } } \ No newline at end of file