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..8a6f0589c0 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,42 @@ 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;", + " }", + "}") + .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(); + } + private CompilationTestHelper makeHelper() { return makeTestHelperWithArgs( Arrays.asList(