From df68af8efe939e0c31c84a5a67fbd1c75070ea04 Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 17 Jul 2014 21:03:26 +0200 Subject: [PATCH] require that notnull fields be initialized (IDEA-114889) --- .../nullable/NullableStuffInspectionBase.java | 12 +++++++++++- .../nullableProblems/GetterSetterProblems.java | 4 ++-- .../nullableProblems/NotNullFieldNotInitialized.java | 9 +++++++++ .../codeInspection/NullableStuffInspectionTest.java | 1 + 4 files changed, 23 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/inspection/nullableProblems/NotNullFieldNotInitialized.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 9486af61a559..47d32a03bf8f 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 @@ -154,7 +154,17 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo } } - for (PsiExpression rhs : DfaPsiUtil.findAllConstructorInitializers(field)) { + List initializers = DfaPsiUtil.findAllConstructorInitializers(field); + if (annotated.isDeclaredNotNull && initializers.isEmpty()) { + 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); + } + } + + for (PsiExpression rhs : initializers) { if (rhs instanceof PsiReferenceExpression) { PsiElement target = ((PsiReferenceExpression)rhs).resolve(); if (target instanceof PsiParameter) { diff --git a/java/java-tests/testData/inspection/nullableProblems/GetterSetterProblems.java b/java/java-tests/testData/inspection/nullableProblems/GetterSetterProblems.java index d49cd9ca6fd0..c8a5816ec741 100644 --- a/java/java-tests/testData/inspection/nullableProblems/GetterSetterProblems.java +++ b/java/java-tests/testData/inspection/nullableProblems/GetterSetterProblems.java @@ -2,7 +2,7 @@ import org.jetbrains.annotations.NotNull; class B { @NotNull - B b; + B b = new B(); public B getB() { return b; @@ -39,7 +39,7 @@ class C { this.c = c; } - @NotNull C c1; + @NotNull C c1 = new C(null); @org.jetbrains.annotations.Nullable public C getC1() { if (c1 != null) { diff --git a/java/java-tests/testData/inspection/nullableProblems/NotNullFieldNotInitialized.java b/java/java-tests/testData/inspection/nullableProblems/NotNullFieldNotInitialized.java new file mode 100644 index 000000000000..918d5db30fd2 --- /dev/null +++ b/java/java-tests/testData/inspection/nullableProblems/NotNullFieldNotInitialized.java @@ -0,0 +1,9 @@ +import org.jetbrains.annotations.*; + +class Test { + @NotNull Object member; + + private void accessMember() { + member = new Object(); + } +} \ 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 648794e3003b..e925dd49a8ea 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java @@ -31,6 +31,7 @@ public class NullableStuffInspectionTest extends LightCodeInsightFixtureTestCase public void testNullableFieldNotnullParam() throws Exception{ doTest(); } public void testNotNullFieldNullableParam() throws Exception{ doTest(); } public void testNotNullCustomException() throws Exception{ doTest(); } + public void testNotNullFieldNotInitialized() throws Exception{ doTest(); } public void testGetterSetterProblems() throws Exception{ doTest(); } public void testOverriddenMethods() throws Exception{