From 8c54e843412bd1c02a1af2be5a180f9cb1d396c8 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 2 Nov 2016 12:32:13 +0100 Subject: [PATCH] don't suggest to make parameters for field @NotNull if the parameters don't belong to a constructor --- .../nullable/NullableStuffInspectionBase.java | 10 +++++++- .../NotNullFieldInitializedInLambda.java | 24 +++++++++++++++++++ .../NullableStuffInspectionTest.java | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/nullableProblems/NotNullFieldInitializedInLambda.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 b6960f0a5e8e..1b057a829cb9 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 @@ -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 index 000000000000..c0065aa9415e --- /dev/null +++ b/java/java-tests/testData/inspection/nullableProblems/NotNullFieldInitializedInLambda.java @@ -0,0 +1,24 @@ +import org.jetbrains.annotations.*; + +class Test { + @NotNull Object member; + @NotNull 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 diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java index 1aa9ce489f96..fcfe18cf1bb8 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java @@ -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;