don't suggest to make parameters for field @NotNull if the parameters don't belong...
authorpeter <peter@jetbrains.com>
Wed, 2 Nov 2016 11:32:13 +0000 (12:32 +0100)
committerpeter <peter@jetbrains.com>
Wed, 2 Nov 2016 15:50:35 +0000 (16:50 +0100)
java/java-analysis-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspectionBase.java
java/java-tests/testData/inspection/nullableProblems/NotNullFieldInitializedInLambda.java [new file with mode: 0644]
java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java

index b6960f0a5e8e7c985b25e98888dfa5567689e23b..1b057a829cb9be6924feed9bac4e1cd34eec13a1 100644 (file)
@@ -38,12 +38,16 @@ import com.intellij.util.ArrayUtil;
 import com.intellij.util.containers.ContainerUtil;
 import org.jdom.Element;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import javax.swing.*;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 
+import static com.intellij.patterns.PsiJavaPatterns.psiElement;
+import static com.intellij.patterns.PsiJavaPatterns.psiMethod;
+
 public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionTool {
   // deprecated fields remain to minimize changes to users inspection profiles (which are often located in version control).
   @Deprecated @SuppressWarnings({"WeakerAccess"}) public boolean REPORT_NULLABLE_METHOD_OVERRIDES_NOTNULL = true;
@@ -283,7 +287,7 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
     for (PsiExpression rhs : initializers) {
       if (rhs instanceof PsiReferenceExpression) {
         PsiElement target = ((PsiReferenceExpression)rhs).resolve();
-        if (target instanceof PsiParameter && target.isPhysical()) {
+        if (isConstructorParameter(target) && target.isPhysical()) {
           PsiParameter parameter = (PsiParameter)target;
           if (REPORT_NOT_ANNOTATED_GETTER && !manager.hasNullability(parameter) && !TypeConversionUtil.isPrimitiveAndNotNull(parameter.getType())) {
             final PsiIdentifier nameIdentifier = parameter.getNameIdentifier();
@@ -318,6 +322,10 @@ public class NullableStuffInspectionBase extends BaseJavaBatchLocalInspectionToo
     }
   }
 
+  private static boolean isConstructorParameter(@Nullable PsiElement parameter) {
+    return parameter instanceof PsiParameter && psiElement(PsiParameterList.class).withParent(psiMethod().constructor(true)).accepts(parameter.getParent());
+  }
+
   @NotNull
   private static String getPresentableAnnoName(@NotNull PsiModifierListOwner owner) {
     NullableNotNullManager manager = NullableNotNullManager.getInstance(owner.getProject());
diff --git a/java/java-tests/testData/inspection/nullableProblems/NotNullFieldInitializedInLambda.java b/java/java-tests/testData/inspection/nullableProblems/NotNullFieldInitializedInLambda.java
new file mode 100644 (file)
index 0000000..c0065aa
--- /dev/null
@@ -0,0 +1,24 @@
+import org.jetbrains.annotations.*;
+
+class Test {
+  <warning descr="Not-null fields must be initialized">@NotNull</warning> Object member;
+  <warning descr="Not-null fields must be initialized">@NotNull</warning> Object member2;
+
+  public Test(Object p) {
+    I i = param -> {
+      member = param;
+    };
+    I i2 = new I() {
+      @Override
+      public void foo(Object param) {
+        member2 = param;
+      }
+    };
+    i.foo(p);
+    i2.foo(p);
+  }
+}
+
+interface I {
+  void foo(Object param);
+}
\ No newline at end of file
index 1aa9ce489f966d9a12a6ccb30abe9ae4d935bba0..fcfe18cf1bb849faa9eb49a1f84d27c2367d2589 100644 (file)
@@ -69,6 +69,7 @@ public class NullableStuffInspectionTest extends LightCodeInsightFixtureTestCase
   public void testNotNullCustomException() throws Exception{ doTest(); }
 
   public void testNotNullFieldNotInitialized() throws Exception{ doTest(); }
+  public void testNotNullFieldInitializedInLambda() { doTest(); }
   public void testNotNullFieldNotInitializedInOneConstructor() { doTest(); }
   public void testNotNullFieldNotInitializedSetting() {
     myInspection.REQUIRE_NOTNULL_FIELDS_INITIALIZED = false;