checkers.nullness
Class CollectionToArrayHeauristics
java.lang.Object
checkers.nullness.CollectionToArrayHeauristics
public class CollectionToArrayHeauristics
extends Object
Handles calls to Collection.toArray()
and determines
the appropriate nullness type of the returned value.
Collection.toArray()
and Collection#toArray(T[])
method
semantics cannot be captured by the regular type system.
Namely, the nullness of the returned array component depends on the
receiver type argument. So
Collection<@NonNull String> c1 = ...
c1.toArray(); // --> returns @NonNull Object []
Collection<@Nullable String> c2 = ...
c2.toArray(); // --> returns @Nullable Object []
In the case of Collection#toArray(T[])
, the type of the returned
array depends on the passed parameter as well and its size. In particular,
the returned array component would of type @NonNull
if the following
conditions hold:
- The receiver collection type argument is
NonNull
- The passed array size is less than the collection size
While checking for the second condition, requires a runtime check, we
provide heuristics to handle the most common cases of
Collection.toArray(T[])
, namely if the passed array is
- an empty array initializer, e.g.
c.toArray(new String[] { })
,
- array creation tree of size 0, e.g.
c.toArray(new String[0])
, or
- array creation tree of the collection size method invocation
c.toArray(new String[c.size()])
Note: The nullness of the returned array doesn't depend on the passed
array nullness.
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
CollectionToArrayHeauristics
public CollectionToArrayHeauristics(ProcessingEnvironment env,
NullnessAnnotatedTypeFactory factory)
handle
public void handle(MethodInvocationTree tree,
AnnotatedTypeMirror.AnnotatedExecutableType method)
- Apply the heuristics to the given method invocation and corresponding
Collection.toArray()
type.
If the method invocation is a call to toArray
, then it
manipulates the returned type of method
arg to contain the
appropriate nullness. Otherwise, it does nothing.
- Parameters:
tree
- method invocation treemethod
- invoked method type