diff --git a/java/java-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspection.java b/java/java-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspection.java index 6530c36e7f55..bfd78c78ca48 100644 --- a/java/java-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspection.java +++ b/java/java-impl/src/com/intellij/codeInspection/nullable/NullableStuffInspection.java @@ -174,13 +174,25 @@ public class NullableStuffInspection extends BaseLocalInspectionTool { new AddAnnotationFix(anno, parameter, ArrayUtil.toStringArray(annoToRemove))); } else if (annotated.isDeclaredNullable && manager.isNotNull(parameter, false)) { - final PsiIdentifier nameIdentifier2 = parameter.getNameIdentifier(); - assert nameIdentifier2 != null : parameter; - holder.registerProblem(nameIdentifier2, InspectionsBundle.message( - "inspection.nullable.problems.annotated.field.constructor.parameter.conflict", StringUtil.getShortName(anno), - notNullSimpleName), - ProblemHighlightType.GENERIC_ERROR_OR_WARNING, - new AddAnnotationFix(anno, parameter, ArrayUtil.toStringArray(annoToRemove))); + boolean usedAsQualifier = !ReferencesSearch.search(parameter).forEach(new Processor() { + @Override + public boolean process(PsiReference reference) { + final PsiElement element = reference.getElement(); + if (element instanceof PsiReferenceExpression && element.getParent() instanceof PsiReferenceExpression) { + return false; + } + return true; + } + }); + if (!usedAsQualifier) { + final PsiIdentifier nameIdentifier2 = parameter.getNameIdentifier(); + assert nameIdentifier2 != null : parameter; + holder.registerProblem(nameIdentifier2, InspectionsBundle.message( + "inspection.nullable.problems.annotated.field.constructor.parameter.conflict", StringUtil.getShortName(anno), + notNullSimpleName), + ProblemHighlightType.GENERIC_ERROR_OR_WARNING, + new AddAnnotationFix(anno, parameter, ArrayUtil.toStringArray(annoToRemove))); + } } } diff --git a/java/java-tests/testData/inspection/nullableProblems/nullableFieldNotnullParam/expected.xml b/java/java-tests/testData/inspection/nullableProblems/nullableFieldNotnullParam/expected.xml new file mode 100644 index 000000000000..407582e86f53 --- /dev/null +++ b/java/java-tests/testData/inspection/nullableProblems/nullableFieldNotnullParam/expected.xml @@ -0,0 +1,9 @@ + + + + Test.java + 8 + Constructor parameter for @Nullable field is annotated @NotNull + + + diff --git a/java/java-tests/testData/inspection/nullableProblems/nullableFieldNotnullParam/src/Test.java b/java/java-tests/testData/inspection/nullableProblems/nullableFieldNotnullParam/src/Test.java new file mode 100644 index 000000000000..5cebab7f41c0 --- /dev/null +++ b/java/java-tests/testData/inspection/nullableProblems/nullableFieldNotnullParam/src/Test.java @@ -0,0 +1,21 @@ +import org.jetbrains.annotations.*; + +class Test { + @Nullable private final String baseFile; + @Nullable private final String baseFile1; + + + public Test(@NotNull String baseFile) { + this.baseFile = baseFile; + this.baseFile1 = null; + } + + public Test(@NotNull String baseFile1, boolean a) { + this.baseFile1 = baseFile1; + if (baseFile1.contains("foo")) { + this.baseFile = null; + } else { + this.baseFile = null; + } + } +} \ 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 cc843df1316e..7299acd8c8e2 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/NullableStuffInspectionTest.java @@ -43,6 +43,7 @@ public class NullableStuffInspectionTest extends InspectionTestCase { public void testProblems() throws Exception{ doTest(); } public void testProblems2() throws Exception{ doTest(); } + public void testNullableFieldNotnullParam() throws Exception{ doTest(); } public void testJdk14() throws Exception{ doTest14(); } public void testGetterSetterProblems() throws Exception{ doTest(); }