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 0de4e2f60848..e39c797a854f 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 @@ -279,16 +279,21 @@ public final class DfaPsiUtil { return Nullability.UNKNOWN; } + private static final CallMatcher OPTIONAL_FUNCTIONS = + CallMatcher.instanceCall(JAVA_UTIL_OPTIONAL, "map", "filter", "ifPresent", "flatMap", "ifPresentOrElse"); + private static final CallMatcher MAP_COMPUTE = + CallMatcher.instanceCall(JAVA_UTIL_MAP, "compute").parameterTypes("K", JAVA_UTIL_FUNCTION_BI_FUNCTION); + @NotNull private static Nullability getLambdaParameterNullability(@NotNull PsiMethod method, int parameterIndex, int lambdaParameterIndex) { - PsiClass type = method.getContainingClass(); - if(type != null) { - if(JAVA_UTIL_OPTIONAL.equals(type.getQualifiedName())) { - String methodName = method.getName(); - if((methodName.equals("map") || methodName.equals("filter") || methodName.equals("ifPresent") || methodName.equals("flatMap")) - && parameterIndex == 0 && lambdaParameterIndex == 0) { - return Nullability.NOT_NULL; - } + if (OPTIONAL_FUNCTIONS.methodMatches(method)) { + if (parameterIndex == 0 && lambdaParameterIndex == 0) { + return Nullability.NOT_NULL; + } + } + else if (MAP_COMPUTE.methodMatches(method)) { + if (parameterIndex == 1 && lambdaParameterIndex == 1) { + return Nullability.NULLABLE; } } return Nullability.UNKNOWN; diff --git a/java/java-tests/testData/inspection/nullableProblems/MapComputeLambdaAnnotation.java b/java/java-tests/testData/inspection/nullableProblems/MapComputeLambdaAnnotation.java new file mode 100644 index 000000000000..445da9c40885 --- /dev/null +++ b/java/java-tests/testData/inspection/nullableProblems/MapComputeLambdaAnnotation.java @@ -0,0 +1,17 @@ +import typeUse.NotNull; +import typeUse.Nullable; + +import java.util.HashMap; +import java.util.Map; + +public class MapComputeLambdaAnnotation { + public static void main(final String[] args) { + final Map test = new HashMap<>(); + + test.compute("first", (String a, @Nullable String b) -> { + assert b == null; + + return null; + }); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java index 33463b2a60cc..1927de17d9bc 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java @@ -405,4 +405,9 @@ public class NullableStuffInspectionTest extends LightJavaCodeInsightFixtureTest "}"); doTest(); } + + public void testMapComputeLambdaAnnotation() { + DataFlowInspection8Test.setupTypeUseAnnotations("typeUse", myFixture); + doTest(); + } } \ No newline at end of file