From f697eeaf1d59d8e41ce4ee3e96703afa0ad1026d Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 13 Feb 2026 11:58:33 +0100 Subject: [PATCH] =?UTF-8?q?IDEA-385863=20[java-inspections]=20False-positi?= =?UTF-8?q?ve=20=C2=ABredundant=20nullability=20annotation=C2=BB=20inspect?= =?UTF-8?q?ion=20warning=20on=20@lombok.NonNull?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit GitOrigin-RevId: ae53fba211152012ca2542ce32f23accd2d68d2f --- .../nullable/NullableStuffInspectionBase.java | 3 +++ .../NullableNotNullManagerImpl.java | 8 +++++++ .../AnnotationPackageSupport.java | 8 +++++++ .../codeInsight/NullableNotNullManager.java | 8 +++++++ .../provider/LombokAnnotationSupport.java | 5 +++++ .../LombokNullableStuffInspectionTest.java | 22 +++++++++++++++++++ .../diverse/NoRedundantUnderNullMarked.java | 4 ++++ 7 files changed, 58 insertions(+) create mode 100644 plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokNullableStuffInspectionTest.java create mode 100644 plugins/lombok/testData/inspection/diverse/NoRedundantUnderNullMarked.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 20da5cc2eeb5..2b4a5227b23a 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 @@ -449,6 +449,9 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection if (REPORT_REDUNDANT_NULLABILITY_ANNOTATION_IN_THE_SCOPE_OF_ANNOTATED_CONTAINER) { NullabilityAnnotationInfo containerInfo = wrapper.findContainerInfoForRedundantAnnotation(); if (containerInfo != null) { + if (containerInfo.getNullability() == Nullability.NOT_NULL && manager.isNonNullUsedForInstrumentation(wrapper.annotation())) { + return; + } reportRedundantInContainerScope(wrapper.annotation(), containerInfo); } } diff --git a/java/java-impl/src/com/intellij/codeInsight/NullableNotNullManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/NullableNotNullManagerImpl.java index d2cd2d7dc847..6f80e274d320 100644 --- a/java/java-impl/src/com/intellij/codeInsight/NullableNotNullManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/NullableNotNullManagerImpl.java @@ -555,6 +555,14 @@ public class NullableNotNullManagerImpl extends NullableNotNullManager implement }); } + @Override + public boolean isNonNullUsedForInstrumentation(@NotNull PsiAnnotation annotation) { + String qualifiedName = annotation.getQualifiedName(); + if (qualifiedName == null) return false; + AnnotationPackageSupport support = AnnotationPackageSupport.EP_NAME.findFirstSafe(e -> e.getNullabilityAnnotations(Nullability.NOT_NULL).contains(qualifiedName)); + return support != null && support.isNonNullUsedForInstrumentation(); + } + @Override public void dispose() { diff --git a/java/java-impl/src/com/intellij/codeInsight/annoPackages/AnnotationPackageSupport.java b/java/java-impl/src/com/intellij/codeInsight/annoPackages/AnnotationPackageSupport.java index b78b6ea1cb2f..c5d9fdb254c8 100644 --- a/java/java-impl/src/com/intellij/codeInsight/annoPackages/AnnotationPackageSupport.java +++ b/java/java-impl/src/com/intellij/codeInsight/annoPackages/AnnotationPackageSupport.java @@ -66,4 +66,12 @@ public interface AnnotationPackageSupport { default boolean canAnnotateLocals() { return true; } + + /** + * @return true if the non-null annotation reported by this support is used for the instrumentation or code generation. + * In this case, it won't be reported as redundant if it appears in the scope of container non-null annotation. + */ + default boolean isNonNullUsedForInstrumentation() { + return false; + } } diff --git a/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java b/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java index 8254c91b7967..76480f5834fc 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/NullableNotNullManager.java @@ -495,6 +495,14 @@ public abstract class NullableNotNullManager { .getNullability(annotation.getQualifiedName()) != null; } + /** + * @param annotation annotation to check + * @return true if the annotation is a non-null annotation, which is used for instrumentation or code generation. + */ + public boolean isNonNullUsedForInstrumentation(@NotNull PsiAnnotation annotation) { + return false; + } + protected interface NullabilityAnnotationDataHolder { /** * @return qualified names of all recognized annotations diff --git a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAnnotationSupport.java b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAnnotationSupport.java index b81131641043..1a3d5dee5de7 100644 --- a/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAnnotationSupport.java +++ b/plugins/lombok/src/main/java/de/plushnikov/intellij/plugin/provider/LombokAnnotationSupport.java @@ -16,4 +16,9 @@ final class LombokAnnotationSupport implements AnnotationPackageSupport { } return Collections.emptyList(); } + + @Override + public boolean isNonNullUsedForInstrumentation() { + return true; + } } diff --git a/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokNullableStuffInspectionTest.java b/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokNullableStuffInspectionTest.java new file mode 100644 index 000000000000..5ddee2ae5b54 --- /dev/null +++ b/plugins/lombok/src/test/java/de/plushnikov/intellij/plugin/inspection/LombokNullableStuffInspectionTest.java @@ -0,0 +1,22 @@ +package de.plushnikov.intellij.plugin.inspection; + +import com.intellij.codeInspection.InspectionProfileEntry; +import com.intellij.codeInspection.nullable.NullableStuffInspectionBase; + + +public class LombokNullableStuffInspectionTest extends LombokInspectionTest { + + @Override + protected String getBasePath() { + return super.getBasePath() + "/" + TEST_DATA_INSPECTION_DIRECTORY + "/diverse"; + } + + @Override + protected InspectionProfileEntry getInspection() { + return new NullableStuffInspectionBase(); + } + + public void testNoRedundantUnderNullMarked() { + doTest(); + } +} diff --git a/plugins/lombok/testData/inspection/diverse/NoRedundantUnderNullMarked.java b/plugins/lombok/testData/inspection/diverse/NoRedundantUnderNullMarked.java new file mode 100644 index 000000000000..d1aef6b793a5 --- /dev/null +++ b/plugins/lombok/testData/inspection/diverse/NoRedundantUnderNullMarked.java @@ -0,0 +1,4 @@ +@org.jetbrains.annotations.NotNullByDefault +class X { + @lombok.NonNull String myField; +} \ No newline at end of file