From b16d922304d4725390c68804a805be12e7acc39e Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 7 Nov 2017 10:40:40 +0700 Subject: [PATCH] IDEA-181080 Result of expression is ignored for Optional.orElseThrow --- .../codeInspection/dataFlow/ContractValue.java | 4 ++-- .../codeInspection/dataFlow/MethodContract.java | 6 +++--- .../dataFlow/StandardMethodContract.java | 2 +- .../src/com/siyeh/ig/psiutils/SideEffectChecker.java | 5 +++-- .../ig/bugs/IgnoreResultOfCallInspectionTest.groovy | 12 ++++++++++++ 5 files changed, 21 insertions(+), 8 deletions(-) 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