From e46d305cb07b54132f6d0cd12b33e68ab3c1691c Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 10 May 2017 11:02:51 +0700 Subject: [PATCH] DfaPsiUtil#getFunctionalParameterNullability: use known type nullability for SAM parameters --- .../intellij/codeInspection/dataFlow/DfaPsiUtil.java | 12 ++++++++++-- .../fixture/MethodReferenceConstantValue.java | 4 ++++ .../codeInspection/DataFlowInspection8Test.java | 2 +- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaPsiUtil.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaPsiUtil.java index 84df05bb76c9..7dad0ab29502 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaPsiUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaPsiUtil.java @@ -30,6 +30,7 @@ import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.*; import com.intellij.util.ArrayUtil; import com.intellij.util.NullableFunction; +import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.JBIterable; import com.intellij.util.containers.MultiMap; @@ -129,9 +130,16 @@ public class DfaPsiUtil { if(nullness != Nullness.UNKNOWN) { return nullness; } - PsiMethod sam = LambdaUtil.getFunctionalInterfaceMethod(function.getFunctionalInterfaceType()); + PsiClassType type = ObjectUtils.tryCast(function.getFunctionalInterfaceType(), PsiClassType.class); + PsiMethod sam = LambdaUtil.getFunctionalInterfaceMethod(type); if (sam != null && index < sam.getParameterList().getParametersCount()) { - return getElementNullability(null, sam.getParameterList().getParameters()[index]); + PsiParameter parameter = sam.getParameterList().getParameters()[index]; + nullness = getElementNullability(null, parameter); + if(nullness != Nullness.UNKNOWN) { + return nullness; + } + PsiType parameterType = type.resolveGenerics().getSubstitutor().substitute(parameter.getType()); + return getTypeNullability(parameterType); } return Nullness.UNKNOWN; } diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/MethodReferenceConstantValue.java b/java/java-tests/testData/inspection/dataFlow/fixture/MethodReferenceConstantValue.java index 9b6886e2ac71..c17573379883 100644 --- a/java/java-tests/testData/inspection/dataFlow/fixture/MethodReferenceConstantValue.java +++ b/java/java-tests/testData/inspection/dataFlow/fixture/MethodReferenceConstantValue.java @@ -28,6 +28,10 @@ public class MethodReferenceConstantValue { } } + public void test(List<@foo.NotNull String> list) { + list.removeIf(Objects::isNull); + } + interface X { boolean action(@Nullable MethodReferenceConstantValue a, @NotNull String b); } diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspection8Test.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspection8Test.java index cd4dec7f967c..650061ceded0 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspection8Test.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspection8Test.java @@ -60,7 +60,7 @@ public class DataFlowInspection8Test extends DataFlowInspectionTestCase { public void testNullableVoidLambda() { doTest(); } public void testNullableForeachVariable() { doTestWithCustomAnnotations(); } public void testGenericParameterNullity() { doTestWithCustomAnnotations(); } - public void testMethodReferenceConstantValue() { doTest(); } + public void testMethodReferenceConstantValue() { doTestWithCustomAnnotations(); } public void testOptionalOfNullable() { doTest(); } public void testOptionalOrElse() { doTest(); }