diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java index 4078b8982a80..516bf94065af 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/InferredAnnotationsManagerImpl.java @@ -134,15 +134,9 @@ public class InferredAnnotationsManagerImpl extends InferredAnnotationsManager { @Nullable private PsiAnnotation getInferredNullabilityAnnotation(PsiMethodImpl method) { - NullableNotNullManager manager = NullableNotNullManager.getInstance(myProject); - if (findAnnotation(method, manager.getNotNulls(), true) != null || findAnnotation(method, manager.getNullables(), true) != null) { + if (hasExplicitNullability(method)) { return null; } - - if (manager.findNullityDefaultInHierarchy(method) != null) { - return null; - } - Nullability nullability = JavaSourceInference.inferNullability(method); if (nullability == Nullability.NOT_NULL) { return ProjectBytecodeAnalysis.getInstance(myProject).getNotNullAnnotation(); @@ -153,10 +147,16 @@ public class InferredAnnotationsManagerImpl extends InferredAnnotationsManager { return null; } + private boolean hasExplicitNullability(PsiModifierListOwner owner) { + NullableNotNullManager manager = NullableNotNullManager.getInstance(myProject); + return findAnnotation(owner, manager.getNotNulls(), true) != null || + findAnnotation(owner, manager.getNullables(), true) != null || + manager.findNullityDefaultInHierarchy(owner) != null; + } + @Nullable private PsiAnnotation getInferredNullabilityAnnotation(PsiParameter parameter) { - NullableNotNullManager manager = NullableNotNullManager.getInstance(myProject); - if (findAnnotation(parameter, manager.getNotNulls(), true) != null || findAnnotation(parameter, manager.getNullables(), true) != null) { + if (hasExplicitNullability(parameter)) { return null; } PsiElement parent = parameter.getParent(); diff --git a/java/java-tests/testData/inspection/nullableProblems/OverriddenMethodsWithDefaults.java b/java/java-tests/testData/inspection/nullableProblems/OverriddenMethodsWithDefaults.java new file mode 100644 index 000000000000..15e59ba28246 --- /dev/null +++ b/java/java-tests/testData/inspection/nullableProblems/OverriddenMethodsWithDefaults.java @@ -0,0 +1,11 @@ +@javax.annotation.ParametersAreNonnullByDefault +interface I { + void foo(Object o); +} + +@javax.annotation.ParametersAreNonnullByDefault +final class A implements I { + public void foo(Object o) { + o.toString(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java index 0fd76ecf0be5..b142d9cf4d0d 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java @@ -105,6 +105,13 @@ public class NullableStuffInspectionTest extends LightCodeInsightFixtureTestCase doTest(); } + public void testOverriddenMethodsWithDefaults() { + DataFlowInspectionTest.addJavaxNullabilityAnnotations(myFixture); + DataFlowInspectionTest.addJavaxDefaultNullabilityAnnotations(myFixture); + myInspection.REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS = true; + doTest(); + } + public void testOverriddenMethodsInGeneratedCode() { Registry.get("idea.report.nullity.missing.in.generated.overriders").setValue(false, getTestRootDisposable()); myInspection.REPORT_ANNOTATION_NOT_PROPAGATED_TO_OVERRIDERS = true;