in nullaway/src/main/java/com/uber/nullaway/generics/GenericsChecks.java [70:114]
public static void checkInstantiationForParameterizedTypedTree(
ParameterizedTypeTree tree,
VisitorState state,
NullAway analysis,
Config config,
Handler handler) {
if (!config.isJSpecifyMode()) {
return;
}
List<? extends Tree> typeArguments = tree.getTypeArguments();
if (typeArguments.isEmpty()) {
return;
}
Map<Integer, Tree> nullableTypeArguments = new HashMap<>();
for (int i = 0; i < typeArguments.size(); i++) {
Tree curTypeArg = typeArguments.get(i);
if (curTypeArg instanceof AnnotatedTypeTree) {
AnnotatedTypeTree annotatedType = (AnnotatedTypeTree) curTypeArg;
for (AnnotationTree annotation : annotatedType.getAnnotations()) {
Type annotationType = ASTHelpers.getType(annotation);
if (annotationType != null
&& Nullness.isNullableAnnotation(annotationType.toString(), config)) {
nullableTypeArguments.put(i, curTypeArg);
break;
}
}
}
}
// base type that is being instantiated
Type baseType = ASTHelpers.getType(tree);
if (baseType == null) {
return;
}
boolean[] typeParamsWithNullableUpperBound =
getTypeParamsWithNullableUpperBound(baseType, config, handler);
com.sun.tools.javac.util.List<Type> baseTypeArgs = baseType.tsym.type.getTypeArguments();
for (int i = 0; i < baseTypeArgs.size(); i++) {
if (nullableTypeArguments.containsKey(i) && !typeParamsWithNullableUpperBound[i]) {
// if base type variable does not have @Nullable upper bound then the instantiation is
// invalid
reportInvalidInstantiationError(
nullableTypeArguments.get(i), baseType, baseTypeArgs.get(i), state, analysis);
}
}
}