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 0d95a08575b8..9b944910847e 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 @@ -70,10 +70,9 @@ public class DfaPsiUtil { @NotNull public static Nullness getElementNullability(@Nullable PsiType resultType, @Nullable PsiModifierListOwner owner) { - Nullness x = getTypeNullability(resultType); - if (x != Nullness.UNKNOWN) return x; + if (owner == null) return getTypeNullability(resultType); - if (owner == null || resultType instanceof PsiPrimitiveType) { + if (resultType instanceof PsiPrimitiveType) { return Nullness.UNKNOWN; } @@ -91,6 +90,9 @@ public class DfaPsiUtil { return Nullness.NOT_NULL; } + Nullness fromType = getTypeNullability(resultType); + if (fromType != Nullness.UNKNOWN) return fromType; + if (PsiJavaPatterns.psiParameter().withParents(PsiParameterList.class, PsiLambdaExpression.class).accepts(owner)) { PsiLambdaExpression lambda = (PsiLambdaExpression)owner.getParent().getParent(); int index = lambda.getParameterList().getParameterIndex((PsiParameter)owner); diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/MethodVsExpressionTypeAnnotationConflict.java b/java/java-tests/testData/inspection/dataFlow/fixture/MethodVsExpressionTypeAnnotationConflict.java new file mode 100644 index 000000000000..fa3331bbe79e --- /dev/null +++ b/java/java-tests/testData/inspection/dataFlow/fixture/MethodVsExpressionTypeAnnotationConflict.java @@ -0,0 +1,17 @@ +import withTypeUse.NotNull; +import withTypeUse.Nullable; +import java.util.NavigableSet; + +interface Foo { + @Nullable T get(); + T get2(); +} + +class Bar { + + public void test(Foo<@NotNull String> f, NavigableSet<@NotNull String> set) { + if (f.get() == null) return; + if (f.get2() == null) return; + if (set.pollFirst() == null) return; + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java index cee5d8aff3ce..44249b44e796 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/DataFlowInspection8Test.java @@ -160,4 +160,9 @@ public class DataFlowInspection8Test extends DataFlowInspectionTestCase { doTest(); } + public void testMethodVsExpressionTypeAnnotationConflict() { + setupCustomAnnotations("withTypeUse", "{ElementType.METHOD, ElementType.TYPE_USE}", myFixture); + doTest(); + } + } \ No newline at end of file diff --git a/java/jdkAnnotations/java/util/annotations.xml b/java/jdkAnnotations/java/util/annotations.xml index 5ff984020169..cae8f755253f 100644 --- a/java/jdkAnnotations/java/util/annotations.xml +++ b/java/jdkAnnotations/java/util/annotations.xml @@ -1082,9 +1082,30 @@ + + + + + + + + + + + + + + + + + + + + + @@ -1097,6 +1118,15 @@ + + + + + + + + +