checkers.types
Class QualifierHierarchy

java.lang.Object
  extended by checkers.types.QualifierHierarchy
Direct Known Subclasses:
GraphQualifierHierarchy

public abstract class QualifierHierarchy
extends Object

Represents a type qualifiers hierarchy. All method parameter annotations need to be type qualifiers recognized within this hierarchy. This assumes that any particular annotated type in a program is annotated with at most one qualifier from the hierarchy.


Constructor Summary
QualifierHierarchy()
           
 
Method Summary
protected  Set<AnnotationMirror> difference(Collection<AnnotationMirror> as1, Collection<AnnotationMirror> as2)
           
abstract  AnnotationMirror getRootAnnotation()
           
abstract  Set<Name> getTypeQualifiers()
          Returns the names of all type qualifiers in this type qualifier hierarchy
protected  Set<AnnotationMirror> intersect(Collection<AnnotationMirror> as1, Collection<AnnotationMirror> as2)
           
abstract  boolean isSubtype(AnnotationMirror anno1, AnnotationMirror anno2)
          Tests whether anno1 is a super qualifier anno2, according to the type qualifiers hierarchy.
 boolean isSubtype(Collection<AnnotationMirror> rhs, Collection<AnnotationMirror> lhs)
          Tests whether there is any annotation in lhs that is a super qualifier of some annotation in rhs.
abstract  AnnotationMirror leastUpperBound(AnnotationMirror a1, AnnotationMirror a2)
          Returns the least upper bound for a1 and a2 qualifiers.
 Set<AnnotationMirror> leastUpperBound(Collection<AnnotationMirror> annos1, Collection<AnnotationMirror> annos2)
          Returns the type qualifiers that are the least upper bound of the qualifiers in annos1 and annos2.
 AnnotationMirror validQualifier(Collection<AnnotationMirror> annos)
          Deprecated. 
 List<AnnotationMirror> validQualifiers(Collection<AnnotationMirror> annos)
          Deprecated. 
protected  Collection<AnnotationMirror> wrapCollection(Collection<AnnotationMirror> annos)
          null is treated as unqualified type, so it returns a collection with null if annos is empty.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

QualifierHierarchy

public QualifierHierarchy()
Method Detail

getRootAnnotation

public abstract AnnotationMirror getRootAnnotation()
Returns:
the root (ultimate super) type qualifier in the hierarchy

getTypeQualifiers

public abstract Set<Name> getTypeQualifiers()
Returns the names of all type qualifiers in this type qualifier hierarchy

Returns:
the fully qualified name represented in this hierarchy

isSubtype

public abstract boolean isSubtype(AnnotationMirror anno1,
                                  AnnotationMirror anno2)
Tests whether anno1 is a super qualifier anno2, according to the type qualifiers hierarchy.

Returns:
true iff anno1 is a sub qualifier of anno2

isSubtype

public boolean isSubtype(Collection<AnnotationMirror> rhs,
                         Collection<AnnotationMirror> lhs)
Tests whether there is any annotation in lhs that is a super qualifier of some annotation in rhs.

Returns:
true iff an annotation in lhs is a super of one in rhs

leastUpperBound

public abstract AnnotationMirror leastUpperBound(AnnotationMirror a1,
                                                 AnnotationMirror a2)
Returns the least upper bound for a1 and a2 qualifiers. Examples: For NonNull, leastUpperBound('Nullable', 'NonNull') ==> Nullable For IGJ, leastUpperBound('Immutable', 'Mutable') ==> ReadOnly

Returns:
the least restrictive qualifiers for both types

leastUpperBound

public Set<AnnotationMirror> leastUpperBound(Collection<AnnotationMirror> annos1,
                                             Collection<AnnotationMirror> annos2)
Returns the type qualifiers that are the least upper bound of the qualifiers in annos1 and annos2. The current implementation returns the intersection of annos1 and annos2 along with the qualifier that is the least upper bound of all other annotations.

Returns:
the least upper bound of annos1 annos2

validQualifiers

@Deprecated
public List<AnnotationMirror> validQualifiers(Collection<AnnotationMirror> annos)
Deprecated. 

Returns a subset of the input that contains any qualifiers in this hierarchy

Annotated types only contain the supported qualifiers by the hierarchy currently. There is no need to call this method.

Returns:
the qualifiers in annos within this hierarchy

validQualifier

@Deprecated
public AnnotationMirror validQualifier(Collection<AnnotationMirror> annos)
Deprecated. 

Finds the first type qualifiers in this hierarchy in the given list of qualifiers.

Annotated types only contain the supported qualifiers by the hierarchy currently. There is no need to call this method.

Returns:
the qualifiers in annos in this hierarchy

wrapCollection

protected Collection<AnnotationMirror> wrapCollection(Collection<AnnotationMirror> annos)
null is treated as unqualified type, so it returns a collection with null if annos is empty. Internally, null represent unqualified annotation.

Returns:
annos if not empty, otherwise a singleton of null

intersect

protected Set<AnnotationMirror> intersect(Collection<AnnotationMirror> as1,
                                          Collection<AnnotationMirror> as2)
Returns:
the intersection set of as1 and as2

difference

protected Set<AnnotationMirror> difference(Collection<AnnotationMirror> as1,
                                           Collection<AnnotationMirror> as2)
Returns:
the elements belonging to exactly one of as1 or as2