diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/ThrowableNotThrownInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/ThrowableNotThrownInspection.java index 71fdb4c2efc3..343095d6c5de 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/ThrowableNotThrownInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/ThrowableNotThrownInspection.java @@ -15,6 +15,9 @@ */ package com.siyeh.ig.bugs; +import com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer; +import com.intellij.codeInspection.dataFlow.MethodContract; +import com.intellij.codeInspection.dataFlow.StandardMethodContract; import com.intellij.psi.*; import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.InheritanceUtil; @@ -28,6 +31,8 @@ import com.siyeh.ig.psiutils.ParenthesesUtils; import com.siyeh.ig.psiutils.TypeUtils; import org.jetbrains.annotations.NotNull; +import java.util.List; + public class ThrowableNotThrownInspection extends BaseInspection { @Override @@ -105,8 +110,12 @@ public class ThrowableNotThrownInspection extends BaseInspection { InheritanceUtil.isInheritor(containingClass, CommonClassNames.JAVA_LANG_THROWABLE)) { return; } - if ("propagate".equals(method.getName()) && "com.google.common.base.Throwables".equals(containingClass.getQualifiedName())) { - return; + List contracts = ControlFlowAnalyzer.getMethodContracts(method); + if (contracts.size() == 1) { + StandardMethodContract contract = contracts.get(0); + if (contract.isTrivial() && contract.getReturnValue() == MethodContract.ValueConstraint.THROW_EXCEPTION) { + return; + } } registerMethodCallError(expression, expression); } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/throwable_result_of_method_call_ignored/ThrowableResultOfMethodCallIgnored.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/throwable_result_of_method_call_ignored/ThrowableResultOfMethodCallIgnored.java index 8622f4025662..7c816e1c92b6 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/throwable_result_of_method_call_ignored/ThrowableResultOfMethodCallIgnored.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/bugs/throwable_result_of_method_call_ignored/ThrowableResultOfMethodCallIgnored.java @@ -126,4 +126,21 @@ class Throwables { String message = cause.getMessage(); System.out.println("message = " + message); } +} + +class FailTest { + static RuntimeException fail() { + throw new RuntimeException(); + } + + void testThrow(int x) { + if(x < 0) { + throw fail(); + } + } + void testNoThrow(int x) { + if(x < 0) { + fail(); + } + } } \ No newline at end of file