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 db8e62a1ea52..897eed80e468 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 @@ -105,12 +105,12 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo checkAccessors(field, annotated, project, manager, anno, annoToRemove, holder); - if (REQUIRE_NOTNULL_FIELDS_INITIALIZED) { - checkNotNullFieldsInitialized(field, annotated, manager, holder); - } - checkConstructorParameters(field, annotated, manager, anno, annoToRemove, holder); } + + if (REQUIRE_NOTNULL_FIELDS_INITIALIZED && !annotated.isDeclaredNullable) { + checkNotNullFieldsInitialized(field, manager, holder); + } } @Override @@ -259,17 +259,14 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo LOG.assertTrue(parameter.isPhysical(), setter.getText()); } - private static void checkNotNullFieldsInitialized(PsiField field, - Annotated annotated, - NullableNotNullManager manager, @NotNull ProblemsHolder holder) { - if (annotated.isDeclaredNotNull && !HighlightControlFlowUtil.isFieldInitializedAfterObjectConstruction(field)) { - final PsiAnnotation annotation = AnnotationUtil.findAnnotation(field, manager.getNotNulls()); - if (annotation != null) { - holder.registerProblem(annotation.isPhysical() ? annotation : field.getNameIdentifier(), - "Not-null fields must be initialized", - ProblemHighlightType.GENERIC_ERROR_OR_WARNING); - } - } + private static void checkNotNullFieldsInitialized(PsiField field, NullableNotNullManager manager, @NotNull ProblemsHolder holder) { + PsiAnnotation annotation = manager.getNotNullAnnotation(field, false); + if (annotation == null || HighlightControlFlowUtil.isFieldInitializedAfterObjectConstruction(field)) return; + + boolean byDefault = manager.isContainerAnnotation(annotation); + PsiJavaCodeReferenceElement name = annotation.getNameReferenceElement(); + holder.registerProblem(annotation.isPhysical() && !byDefault ? annotation : field.getNameIdentifier(), + (byDefault && name != null ? "@" + name.getReferenceName() : "Not-null") + " fields must be initialized"); } private void checkConstructorParameters(PsiField field, diff --git a/java/java-tests/testData/inspection/nullableProblems/NotNullByDefaultFieldNotInitialized.java b/java/java-tests/testData/inspection/nullableProblems/NotNullByDefaultFieldNotInitialized.java new file mode 100644 index 000000000000..07427362783f --- /dev/null +++ b/java/java-tests/testData/inspection/nullableProblems/NotNullByDefaultFieldNotInitialized.java @@ -0,0 +1,15 @@ +import javax.annotation.*; + +@NonnullByDefault +class Test { + Object member; + + private void accessMember() { + member = new Object(); + } +} + + +@Nonnull +@javax.annotation.meta.TypeQualifierDefault(java.lang.annotation.ElementType.FIELD) +@interface NonnullByDefault {} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java index e0c38a3913f4..4a27815e27d2 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java @@ -59,6 +59,11 @@ public class NullableStuffInspectionTest extends LightCodeInsightFixtureTestCase doTest(); } + public void testNotNullByDefaultFieldNotInitialized() { + DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); + doTest(); + } + public void testNotNullAnnotationChecksInChildClassMethods() { doTest(); } public void testGetterSetterProblems() throws Exception{ doTest(); }