From 2f62d789aed298f7678814a0e6e82e81e67b4c1d Mon Sep 17 00:00:00 2001 From: haewiful Date: Fri, 14 Jun 2024 18:52:45 -0700 Subject: [PATCH] Don't report @Nullable type argument errors for unmarked classes (#958) Co-authored-by: Manu Sridharan --- .../main/java/com/uber/nullaway/NullAway.java | 9 ++++-- .../uber/nullaway/jspecify/GenericsTests.java | 28 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/nullaway/src/main/java/com/uber/nullaway/NullAway.java b/nullaway/src/main/java/com/uber/nullaway/NullAway.java index f5bff29c74..67c070dd7f 100644 --- a/nullaway/src/main/java/com/uber/nullaway/NullAway.java +++ b/nullaway/src/main/java/com/uber/nullaway/NullAway.java @@ -712,8 +712,13 @@ public Description matchParameterizedType(ParameterizedTypeTree tree, VisitorSta return Description.NO_MATCH; } if (config.isJSpecifyMode()) { - GenericsChecks.checkInstantiationForParameterizedTypedTree( - tree, state, this, config, handler); + Symbol baseClass = ASTHelpers.getSymbol(tree); + boolean isNullUnmarked = + baseClass != null && codeAnnotationInfo.isSymbolUnannotated(baseClass, config, handler); + if (!isNullUnmarked) { + GenericsChecks.checkInstantiationForParameterizedTypedTree( + tree, state, this, config, handler); + } } return Description.NO_MATCH; } diff --git a/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java b/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java index 1fac4d03a0..e1294b460f 100644 --- a/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java +++ b/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java @@ -1737,6 +1737,34 @@ public void testRawTypeReceiverCast() { .doTest(); } + @Test + public void testUseOfUnannotatedCode() { + makeHelper() + .addSourceLines( + "Test.java", + "package com.uber;", + "import org.jspecify.annotations.NullMarked;", + "import org.jspecify.annotations.NullUnmarked;", + "import org.jspecify.annotations.Nullable;", + "class Test {", + " @NullUnmarked", + " static class NullUnmarkedClass {", + " }", + " @NullMarked", + " static class MarkedClass {", + " static void testInstantiation() {", + " // NullUnmarkedClass is marked @NullUnmarked, so we get no error", + " // even though the type variable does not have a @Nullable upper bound", + " new NullUnmarkedClass<@Nullable String>();", + " }", + " static void testAssignment() {", + " NullUnmarkedClass<@Nullable Integer> var = null;", + " }", + " }", + "}") + .doTest(); + } + public void boxInteger() { makeHelper() .addSourceLines(