From 81ea1450e1ae4ec677754cdde80aea4abda286b9 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 7 Nov 2017 11:02:52 +0700 Subject: [PATCH] IDEA-181754 Result of 'xyz()' not thrown: do not report on always failing methods --- .../ig/bugs/ThrowableNotThrownInspection.java | 13 +++++++++++-- .../ThrowableResultOfMethodCallIgnored.java | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) 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