From 61e60da04a81c551528a23f0a9dab9f39c28db2e Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Wed, 29 Jan 2025 17:27:04 -0800 Subject: [PATCH 1/2] Skip some checks involving wildcards --- .../CheckIdenticalNullabilityVisitor.java | 5 +++++ .../uber/nullaway/jspecify/GenericsTests.java | 18 ++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/nullaway/src/main/java/com/uber/nullaway/generics/CheckIdenticalNullabilityVisitor.java b/nullaway/src/main/java/com/uber/nullaway/generics/CheckIdenticalNullabilityVisitor.java index d567c2e028..0e1edae67b 100644 --- a/nullaway/src/main/java/com/uber/nullaway/generics/CheckIdenticalNullabilityVisitor.java +++ b/nullaway/src/main/java/com/uber/nullaway/generics/CheckIdenticalNullabilityVisitor.java @@ -55,6 +55,11 @@ public Boolean visitClassType(Type.ClassType lhsType, Type rhsType) { for (int i = 0; i < lhsTypeArguments.size(); i++) { Type lhsTypeArgument = lhsTypeArguments.get(i); Type rhsTypeArgument = rhsTypeArguments.get(i); + if (lhsTypeArgument.getKind().equals(TypeKind.WILDCARD) + || rhsTypeArgument.getKind().equals(TypeKind.WILDCARD)) { + // TODO Handle wildcard types + continue; + } boolean isLHSNullableAnnotated = GenericsChecks.isNullableAnnotated(lhsTypeArgument, state); boolean isRHSNullableAnnotated = GenericsChecks.isNullableAnnotated(rhsTypeArgument, state); if (isLHSNullableAnnotated != isRHSNullableAnnotated) { 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 ac749a7afc..6d79d4b0b0 100644 --- a/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java +++ b/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java @@ -2069,6 +2069,24 @@ public void nullUnmarkedGenericField() { .doTest(); } + @Test + public void issue1126() { + makeHelper() + .addSourceLines( + "Test.java", + "package com.uber;", + "import org.jspecify.annotations.Nullable;", + "import java.util.function.Supplier;", + "public class Test {", + " static class K {}", + " void foo(K<@Nullable Object> k) {", + " K k2 = k;", + " Supplier s = () -> null;", + " }", + "}") + .doTest(); + } + private CompilationTestHelper makeHelper() { return makeTestHelperWithArgs( Arrays.asList( From 6fa9e4bc74577b75a7e99a4c1d12884d69340d19 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Thu, 30 Jan 2025 10:43:59 -0800 Subject: [PATCH 2/2] another test --- .../uber/nullaway/jspecify/GenericsTests.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) 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 6d79d4b0b0..8a6f0589c0 100644 --- a/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java +++ b/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericsTests.java @@ -2084,6 +2084,24 @@ public void issue1126() { " Supplier s = () -> null;", " }", "}") + .addSourceLines( + "Test2.java", + "package com.uber;", + "import java.util.HashMap;", + "import java.util.Map;", + "import org.jspecify.annotations.Nullable;", + "import org.jetbrains.annotations.Contract;", + "public class Test2 {", + " @Contract(\"null -> true\")", + " public static boolean isEmpty(@Nullable Map map) {", + " return (map == null || map.isEmpty());", + " }", + " static void foo() {", + " Map variables = new HashMap<>();", + " if (isEmpty(variables)) { /* do nothing */ }", + " variables.toString();", + " }", + "}") .doTest(); }