From 9f044ceb218f5981d6ccdf98332845763892087a Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 13 Jul 2023 14:55:57 +0200 Subject: [PATCH] [java-inspections] NullableStuffInspectionBase: fix order of type-use/non-type-use annotation processing IDEA-311124 @Nullable parameters are flagged as "not allowed to take null values" GitOrigin-RevId: b5440501a41f0e8c43a9d87ac60bc281708794d3 --- .../nullable/NullableStuffInspectionBase.java | 19 ++++++------ ...leCalledWithNullUnderNotNullByDefault.java | 30 +++++++++++++++++++ .../NullableStuffInspectionTest.java | 6 ++++ 3 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 java/java-tests/testData/inspection/nullableProblems/NullableCalledWithNullUnderNotNullByDefault.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java index b482527000d7..e80ed8d8366e 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java @@ -928,16 +928,17 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection PsiParameter parameter) { if (!REPORT_NULLS_PASSED_TO_NOT_NULL_PARAMETER || !holder.isOnTheFly()) return; - PsiElement elementToHighlight; - if (DfaPsiUtil.getTypeNullability(parameter.getType()) == Nullability.NOT_NULL) { - elementToHighlight = parameter.getNameIdentifier(); + PsiElement elementToHighlight = null; + NullabilityAnnotationInfo info = nullableManager.findOwnNullabilityInfo(parameter); + if (info != null && !info.isInferred()) { + if (info.getNullability() == Nullability.NOT_NULL) { + PsiAnnotation notNullAnnotation = info.getAnnotation(); + boolean physical = PsiTreeUtil.isAncestor(parameter, notNullAnnotation, true); + elementToHighlight = physical ? notNullAnnotation : parameter.getNameIdentifier(); + } } - else { - NullabilityAnnotationInfo info = nullableManager.findOwnNullabilityInfo(parameter); - if (info == null || info.getNullability() != Nullability.NOT_NULL || info.isInferred()) return; - PsiAnnotation notNullAnnotation = info.getAnnotation(); - boolean physical = PsiTreeUtil.isAncestor(parameter, notNullAnnotation, true); - elementToHighlight = physical ? notNullAnnotation : parameter.getNameIdentifier(); + else if (DfaPsiUtil.getTypeNullability(parameter.getType()) == Nullability.NOT_NULL) { + elementToHighlight = parameter.getNameIdentifier(); } if (elementToHighlight == null || !JavaNullMethodArgumentUtil.hasNullArgument(method, parameterIdx)) return; diff --git a/java/java-tests/testData/inspection/nullableProblems/NullableCalledWithNullUnderNotNullByDefault.java b/java/java-tests/testData/inspection/nullableProblems/NullableCalledWithNullUnderNotNullByDefault.java new file mode 100644 index 000000000000..6dc4aabcbae1 --- /dev/null +++ b/java/java-tests/testData/inspection/nullableProblems/NullableCalledWithNullUnderNotNullByDefault.java @@ -0,0 +1,30 @@ +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.meta.TypeQualifierDefault; +import java.lang.annotation.*; + +@NonNullImpl +class BugReproduction { + public static void main(String[] args) { + doSomething(null); + } + + public static void doSomething(@Nullable String string) { + System.out.printf("%b%n", string); + } +} + +@Documented +@Inherited +@Nonnull +@Retention(RetentionPolicy.RUNTIME) +@Target({ + ElementType.PACKAGE, + ElementType.TYPE, +}) +@TypeQualifierDefault({ + ElementType.FIELD, + ElementType.TYPE_USE, +}) +@interface NonNullImpl { +} 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 4c3d24ab7cc4..ddd6684819f6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java @@ -145,6 +145,12 @@ public class NullableStuffInspectionTest extends LightJavaCodeInsightFixtureTest DataFlowInspectionTest.addJavaxDefaultNullabilityAnnotations(myFixture); doTest(); } + + public void testNullableCalledWithNullUnderNotNullByDefault() { + DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); + DataFlowInspectionTest.addJavaxDefaultNullabilityAnnotations(myFixture); + doTest(); + } public void testNullableSiblingOverriding() { doTest(); }