From ddf244085de9e820c355d0e94d879bfc99f01006 Mon Sep 17 00:00:00 2001 From: Manu Sridharan Date: Fri, 7 Feb 2025 15:02:52 -0800 Subject: [PATCH] formatting --- .../nullaway/generics/GenericsChecks.java | 34 ++++++----- .../nullaway/jspecify/GenericMethodTests.java | 58 ++++++++++--------- 2 files changed, 52 insertions(+), 40 deletions(-) diff --git a/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java b/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java index 68ceca9827..9aa24140ab 100644 --- a/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java +++ b/nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java @@ -2,7 +2,6 @@ import static com.google.common.base.Verify.verify; import static com.uber.nullaway.NullabilityUtil.castToNonNull; -import static com.uber.nullaway.NullabilityUtil.findEnclosingMethodOrLambdaOrInitializer; import com.google.errorprone.VisitorState; import com.google.errorprone.suppliers.Supplier; @@ -41,7 +40,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; import javax.lang.model.type.ExecutableType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeVariable; @@ -452,7 +450,7 @@ public void checkTypeParameterNullnessForAssignability( // method call has a return type of class type if (methodSymbol.getReturnType() instanceof Type.ClassType) { Type.ClassType returnType = (Type.ClassType) methodSymbol.getReturnType(); - List typeParam = methodSymbol.getTypeParameters(); + List typeParam = methodSymbol.getTypeParameters(); List returnTypeTypeArg = returnType.getTypeArguments(); // if generic type in return type @@ -460,8 +458,11 @@ public void checkTypeParameterNullnessForAssignability( Map genericNullness = new HashMap<>(); for (int i = 0; i < typeParam.size(); i++) { Type upperBound = typeParam.get(i).type.getUpperBound(); - if(getTypeNullness(upperBound, config) == Nullness.NULLABLE) { // generic has nullable upperbound - Type lhsInferredType = inferMethodTypeArgument(typeParam.get(i).type, lhsTypeArguments, returnTypeTypeArg, state); + if (getTypeNullness(upperBound, config) + == Nullness.NULLABLE) { // generic has nullable upperbound + Type lhsInferredType = + inferMethodTypeArgument( + typeParam.get(i).type, lhsTypeArguments, returnTypeTypeArg, state); if (lhsInferredType != null) { // && has a nullable upperbound genericNullness.put(typeParam.get(i).type, lhsInferredType); } @@ -523,22 +524,29 @@ public void checkTypeParameterNullnessForAssignability( } } - private Type inferMethodTypeArgument(Type typeParam, List lhsTypeArg, List typeArg, VisitorState state) { + private Type inferMethodTypeArgument( + Type typeParam, List lhsTypeArg, List typeArg, VisitorState state) { // base case - if(typeParam == null || lhsTypeArg == null || typeArg == null) { + if (typeParam == null || lhsTypeArg == null || typeArg == null) { return null; } // recursive case Type inferType = null; - for(int i=0; i maybe the base case makes it unnecessary - inferType = inferMethodTypeArgument(typeParam, ((ParameterizedTypeTree) lhsTypeArg.get(i)).getTypeArguments(), typeArg.get(i).getTypeArguments(), state); - if(inferType != null) { + } else if (!type.getTypeArguments().isEmpty()) { + // instanceof Type.ForAll TODO: check if the lhsTypeArg is a generic class? -> maybe + // the base case makes it unnecessary + inferType = + inferMethodTypeArgument( + typeParam, + ((ParameterizedTypeTree) lhsTypeArg.get(i)).getTypeArguments(), + typeArg.get(i).getTypeArguments(), + state); + if (inferType != null) { return inferType; } } diff --git a/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericMethodTests.java b/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericMethodTests.java index 27b030f098..cab5ff8b47 100644 --- a/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericMethodTests.java +++ b/nullaway/src/test/java/com/uber/nullaway/jspecify/GenericMethodTests.java @@ -179,15 +179,18 @@ public void genericInferenceOnAssignments() { " }", " }", " static void testLocalAssign() {", -// " // legal", -// " Foo<@Nullable Object> f1 = Foo.makeNull(null);", -// " // BUG: Diagnostic contains: passing @Nullable parameter 'null' where @NonNull is required", -// " Foo f2 = Foo.makeNull(null);", -// " // ILLEGAL: U does not have a @Nullable upper bound", -// " // BUG: Diagnostic contains: passing @Nullable parameter 'null' where @NonNull is required", -// " Foo<@Nullable Object> f3 = Foo.makeNonNull(null);", -// " // BUG: Diagnostic contains: passing @Nullable parameter 'null' where @NonNull is required", -// " Foo f4 = Foo.makeNonNull(null);", + // " // legal", + // " Foo<@Nullable Object> f1 = Foo.makeNull(null);", + // " // BUG: Diagnostic contains: passing @Nullable parameter 'null' + // where @NonNull is required", + // " Foo f2 = Foo.makeNull(null);", + // " // ILLEGAL: U does not have a @Nullable upper bound", + // " // BUG: Diagnostic contains: passing @Nullable parameter 'null' + // where @NonNull is required", + // " Foo<@Nullable Object> f3 = Foo.makeNonNull(null);", + // " // BUG: Diagnostic contains: passing @Nullable parameter 'null' + // where @NonNull is required", + // " Foo f4 = Foo.makeNonNull(null);", " Foo<@Nullable Object> f5 = Foo.makeNonNull(new Object());", " }", " }") @@ -247,24 +250,25 @@ public void genericInferenceOnAssignmentsMultipleParams() { @Test public void genericsUsedForGenericClasses() { makeHelper() - .addSourceLines( - "Test.java", - "package com.uber;", - "import org.jspecify.annotations.Nullable;", - "import java.util.ArrayList;", - "class Test {", - " abstract class Foo {", - " abstract Foo> nonNullTest();", - " abstract Foo> nullTest();", - " }", - " static void test(Foo f) {", - " Foo> fooNonNull_1 = f.nonNullTest();", - " Foo> fooNonNull_2 = f.nonNullTest();", // error message - " Foo> fooNull_1 = f.nullTest();", - " Foo> fooNull_2 = f.nullTest();", // error message - " }", - "}") - .doTest(); + .addSourceLines( + "Test.java", + "package com.uber;", + "import org.jspecify.annotations.Nullable;", + "import java.util.ArrayList;", + "class Test {", + " abstract class Foo {", + " abstract Foo> nonNullTest();", + " abstract Foo> nullTest();", + " }", + " static void test(Foo f) {", + " Foo> fooNonNull_1 = f.nonNullTest();", + " Foo> fooNonNull_2 = f.nonNullTest();", // error message + " Foo> fooNull_1 = f.nullTest();", + " Foo> fooNull_2 = f.nullTest();", // error + // message + " }", + "}") + .doTest(); } @Test