From 90af1de6af7c65eeea0b08d9e62d8cf3d28b0a15 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 28 Apr 2017 15:38:29 +0700 Subject: [PATCH] IgnoreResultOfCallInspectionBase: use getMethodCallContracts (IDEA-CR-20686) --- .../dataFlow/ControlFlowAnalyzer.java | 4 +-- .../IgnoreResultOfCallInspectionBase.java | 29 +++++++------------ 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java index 1b5ea66f287d..07da5c3f994a 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/ControlFlowAnalyzer.java @@ -1376,8 +1376,8 @@ public class ControlFlowAnalyzer extends JavaElementVisitor { finishElement(expression); } - static List getMethodCallContracts(@NotNull final PsiMethod method, - @Nullable PsiMethodCallExpression call) { + public static List getMethodCallContracts(@NotNull final PsiMethod method, + @Nullable PsiMethodCallExpression call) { List contracts = HardcodedContracts.getHardcodedContracts(method, call); return !contracts.isEmpty() ? contracts : getMethodContracts(method); } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/IgnoreResultOfCallInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/IgnoreResultOfCallInspectionBase.java index 565366c2fecb..5947408d99f6 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/IgnoreResultOfCallInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/IgnoreResultOfCallInspectionBase.java @@ -18,7 +18,6 @@ package com.siyeh.ig.bugs; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer; import com.intellij.codeInspection.dataFlow.MethodContract; -import com.intellij.codeInspection.dataFlow.StandardMethodContract; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.openapi.util.registry.Registry; @@ -170,23 +169,7 @@ public class IgnoreResultOfCallInspectionBase extends BaseInspection { return; } - final PsiAnnotation anno = ControlFlowAnalyzer.findContractAnnotation(method); - final boolean honorInferred = Registry.is("ide.ignore.call.result.inspection.honor.inferred.pure"); - if (anno != null && - (honorInferred || !AnnotationUtil.isInferredAnnotation(anno)) && - Boolean.TRUE.equals(AnnotationUtil.getBooleanAttributeValue(anno, "pure"))) { - String text = AnnotationUtil.getStringAttributeValue(anno, null); - if (text != null) { - try { - if (StandardMethodContract.parseContract(text).stream() - .anyMatch(c -> c.getReturnValue() == MethodContract.ValueConstraint.THROW_EXCEPTION)) { - return; - } - } - catch (StandardMethodContract.ParseException ignored) { - } - } - + if (isPureMethod(method)) { registerMethodCallOrRefError(call, aClass); return; } @@ -204,6 +187,16 @@ public class IgnoreResultOfCallInspectionBase extends BaseInspection { registerMethodCallOrRefError(call, aClass); } + private boolean isPureMethod(PsiMethod method) { + final PsiAnnotation anno = ControlFlowAnalyzer.findContractAnnotation(method); + if (anno == null) return false; + final boolean honorInferred = Registry.is("ide.ignore.call.result.inspection.honor.inferred.pure"); + if (!honorInferred && AnnotationUtil.isInferredAnnotation(anno)) return false; + return Boolean.TRUE.equals(AnnotationUtil.getBooleanAttributeValue(anno, "pure")) && + ControlFlowAnalyzer.getMethodCallContracts(method, null).stream() + .noneMatch(c -> c.getReturnValue() == MethodContract.ValueConstraint.THROW_EXCEPTION); + } + private void registerMethodCallOrRefError(PsiExpression call, PsiClass aClass) { if (call instanceof PsiMethodCallExpression) { registerMethodCallError((PsiMethodCallExpression)call, aClass);