diff --git a/java/java-analysis-api/resources/messages/JavaAnalysisBundle.properties b/java/java-analysis-api/resources/messages/JavaAnalysisBundle.properties index 91c0d5dc90c1..972deeb2951c 100644 --- a/java/java-analysis-api/resources/messages/JavaAnalysisBundle.properties +++ b/java/java-analysis-api/resources/messages/JavaAnalysisBundle.properties @@ -243,6 +243,7 @@ inspection.nullable.problems.primitive.type.annotation=Primitive type members ca inspection.nullable.problems.nullable.instantiation.of.notnull=Not-null type parameter ''{0}'' cannot be instantiated with @{1} type inspection.nullable.problems.nullable.instantiation.of.notnull.container=Not-null type parameter ''{0}'' cannot be instantiated under @{1} inspection.nullable.problems.redundant.annotation.under.container=Redundant nullability annotation in the scope of @{0} +inspection.nullable.problems.redundant.annotation.inherited.notnull=Redundant nullability annotation: type parameter upper bound is already non-null inspection.nullable.problems.receiver.annotation=Receiver parameter is inherently not-null inspection.nullable.problems.applied.to.package=Annotation on fully-qualified name must be placed before the last component inspection.nullable.problems.outer.type=Outer type is inherently not-null 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 5133af0e6baf..d5995cc95907 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 @@ -255,6 +255,17 @@ public class NullableStuffInspectionBase extends AbstractBaseJavaLocalInspection if (context != null) { checkRedundantInContainerScope(annotation, manager.findDefaultTypeUseNullability(context), nullability); } + if (nullability == Nullability.NOT_NULL && PsiUtil.resolveClassInClassTypeOnly(type) instanceof PsiTypeParameter) { + PsiType notAnnotated = type.annotate(TypeAnnotationProvider.EMPTY); + TypeNullability notAnnotatedNullability = notAnnotated.getNullability(); + if (notAnnotatedNullability.nullability() == Nullability.NOT_NULL && + notAnnotatedNullability.source() instanceof NullabilitySource.ExtendsBound) { + reportProblem(holder, annotation, + new RemoveAnnotationQuickFix(annotation, null), + "inspection.nullable.problems.redundant.annotation.inherited.notnull"); + + } + } } if (type instanceof PsiPrimitiveType) { LocalQuickFix additionalFix = null; diff --git a/java/java-tests/testData/inspection/nullableProblems/RedundantNotNull2.java b/java/java-tests/testData/inspection/nullableProblems/RedundantNotNull2.java index 5bfea132af7b..ea2a7f8be55a 100644 --- a/java/java-tests/testData/inspection/nullableProblems/RedundantNotNull2.java +++ b/java/java-tests/testData/inspection/nullableProblems/RedundantNotNull2.java @@ -17,4 +17,21 @@ class Container { System.out.println(t.toString()); } } + + List<@NotNull L> get2() { + return null; + } +} + +class NoContainer { + List<@NotNull L> get() { + return null; + } + List<@NotNull L> get2() { + return null; + } + List<@NotNull L> get3() { + return null; + } + } \ No newline at end of file