From 0cb6e48c042496895e1ac5b1ab93e2d63f3112e9 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Fri, 4 Jul 2025 11:17:29 +0200 Subject: [PATCH] [java-analysis] IDEA-375470 Type parameter with nullable bound within NullMarked scope should be nullable GitOrigin-RevId: c8c264ab40180c7982ac8d5d886841323578348b --- .../src/com/intellij/codeInsight/TypeNullability.java | 6 +++++- .../nullableProblems/NullableExtendsNullable.java | 11 +++++++++++ .../codeInspection/NullableStuffInspectionTest.java | 6 ++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/inspection/nullableProblems/NullableExtendsNullable.java diff --git a/java/java-psi-api/src/com/intellij/codeInsight/TypeNullability.java b/java/java-psi-api/src/com/intellij/codeInsight/TypeNullability.java index 20302f625dfa..4d62bb505f92 100644 --- a/java/java-psi-api/src/com/intellij/codeInsight/TypeNullability.java +++ b/java/java-psi-api/src/com/intellij/codeInsight/TypeNullability.java @@ -115,6 +115,10 @@ public final class TypeNullability { } public static @NotNull TypeNullability ofTypeParameter(@NotNull PsiTypeParameter parameter) { + TypeNullability nullability = intersect(ContainerUtil.map(parameter.getSuperTypes(), PsiType::getNullability)).inherited(); + if (!nullability.equals(UNKNOWN)) { + return nullability; + } NullableNotNullManager manager = NullableNotNullManager.getInstance(parameter.getProject()); if (manager != null) { NullabilityAnnotationInfo typeUseNullability = manager.findDefaultTypeUseNullability(parameter); @@ -122,7 +126,7 @@ public final class TypeNullability { return typeUseNullability.toTypeNullability(); } } - return intersect(ContainerUtil.map(parameter.getSuperTypes(), PsiType::getNullability)).inherited(); + return UNKNOWN; } /** diff --git a/java/java-tests/testData/inspection/nullableProblems/NullableExtendsNullable.java b/java/java-tests/testData/inspection/nullableProblems/NullableExtendsNullable.java new file mode 100644 index 000000000000..4f77a39160dd --- /dev/null +++ b/java/java-tests/testData/inspection/nullableProblems/NullableExtendsNullable.java @@ -0,0 +1,11 @@ +import org.jspecify.annotations.*; + +@NullMarked +class Test2 { + void call(Test a) {} + +} +class Base {} + +@NullMarked +class Test {} \ 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 329ba71c895f..e2759a2b3498 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/NullableStuffInspectionTest.java @@ -483,4 +483,10 @@ public class NullableStuffInspectionTest extends LightJavaCodeInsightFixtureTest setupTypeUseAnnotations("org.jspecify.annotations", myFixture); doTest(); } + + public void testNullableExtendsNullable() { + addJSpecifyNullMarked(myFixture); + setupTypeUseAnnotations("org.jspecify.annotations", myFixture); + doTest(); + } } \ No newline at end of file