diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java index af545fe854b1..5b30ad6941cc 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java @@ -67,7 +67,7 @@ public class InferredAnnotationsManagerImpl extends InferredAnnotationsManager { private PsiAnnotation getHardcodedContractAnnotation(PsiMethod method) { List contracts = HardcodedContracts.getHardcodedContracts(method, null); - return contracts.isEmpty() ? null : createContractAnnotation(contracts, !"java.lang.System.exit".equals(PsiUtil.getMemberQualifiedName(method))); + return contracts.isEmpty() ? null : createContractAnnotation(contracts, HardcodedContracts.isHardcodedPure(method)); } private static boolean ignoreBytecodeInference(PsiModifierListOwner owner, String annotationFQN) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java index 2baadb1f6a77..f9e58134c860 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/HardcodedContracts.java @@ -15,10 +15,8 @@ */ package com.intellij.codeInspection.dataFlow; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiExpression; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.PsiMethodCallExpression; +import com.intellij.psi.*; +import com.intellij.psi.util.PsiUtil; import com.siyeh.ig.psiutils.ExpressionUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -150,4 +148,20 @@ public class HardcodedContracts { } return Collections.emptyList(); } + + public static boolean isHardcodedPure(PsiMethod method) { + String qName = PsiUtil.getMemberQualifiedName(method); + if ("java.lang.System.exit".equals(qName)) { + return false; + } + + if ("java.util.Objects.requireNonNull".equals(qName)) { + PsiParameter[] parameters = method.getParameterList().getParameters(); + if (parameters.length == 2 && parameters[1].getType().getCanonicalText().contains("Supplier")) { + return false; + } + } + + return true; + } }