Class AccumulationAnnotatedTypeFactory.AccumulationQualifierHierarchy
java.lang.Object
org.checkerframework.framework.type.ElementQualifierHierarchy
org.checkerframework.common.accumulation.AccumulationAnnotatedTypeFactory.AccumulationQualifierHierarchy
- All Implemented Interfaces:
QualifierHierarchy
- Enclosing class:
- AccumulationAnnotatedTypeFactory
protected class AccumulationAnnotatedTypeFactory.AccumulationQualifierHierarchy
extends ElementQualifierHierarchy
All accumulation analyses share a similar type hierarchy. This class implements the subtyping,
LUB, and GLB for that hierarchy. The lattice looks like:
acc() / \ acc(x) acc(y) ... \ / acc(x,y) ... | bottomPredicate subtyping is defined as follows:
- An accumulator is a subtype of a predicate if substitution from the accumulator to the
predicate makes the predicate true. For example,
Acc(A)
is a subtype ofAccPred("A || B")
, because when A is replaced withtrue
and B is replaced withfalse
, the resulting boolean formula evaluates to true. - A predicate P is a subtype of an accumulator iff after converting the accumulator into a predicate representing the conjunction of its elements, P is a subtype of that predicate according to the rule for subtyping between two predicates defined below.
- A predicate P is a subtype of another predicate Q iff P and Q are equal. An extension
point (
AccumulationAnnotatedTypeFactory.isPredicateSubtype(String, String)
) is provided to allow more complex subtyping behavior between predicates. (The "correct" subtyping rule is that P is a subtype of Q iff P implies Q. That rule would require an SMT solver in the general case, which is undesirable because it would require an external dependency. A user can overrideAccumulationAnnotatedTypeFactory.isPredicateSubtype(String, String)
if they require more precise subtyping; the check described here is overly conservative (and therefore sound), but not very precise.)
-
Field Summary
Fields inherited from class org.checkerframework.framework.type.ElementQualifierHierarchy
bottoms, bottomsMap, kindToElementlessQualifier, qualifierKindHierarchy, tops, topsMap
-
Constructor Summary
ModifierConstructorDescriptionprotected
AccumulationQualifierHierarchy
(Collection<Class<? extends Annotation>> qualifierClasses, Elements elements) Creates a ElementQualifierHierarchy from the given classes. -
Method Summary
Modifier and TypeMethodDescriptionGLB in this type system is set union of the arguments of the two annotations, unless one of them is bottom, in which case the result is also bottom.boolean
isSubtype
(AnnotationMirror subAnno, AnnotationMirror superAnno) isSubtype in this type system is subset.LUB in this type system is set intersection of the arguments of the two annotations, unless one of them is bottom, in which case the result is the other annotation.Methods inherited from class org.checkerframework.framework.type.ElementQualifierHierarchy
createBottomsMap, createElementlessQualifierMap, createQualifierKindHierarchy, createTopsMap, findAnnotationInHierarchy, findAnnotationInSameHierarchy, getBottomAnnotation, getBottomAnnotations, getPolymorphicAnnotation, getQualifierKind, getQualifierKind, getTopAnnotation, getTopAnnotations, isPolymorphicQualifier, isValid
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface org.checkerframework.framework.type.QualifierHierarchy
getWidth, greatestLowerBounds, isSubtype, leastUpperBounds, numberOfIterationsBeforeWidening, updateMappingToMutableSet, widenedUpperBound
-
Constructor Details
-
AccumulationQualifierHierarchy
protected AccumulationQualifierHierarchy(Collection<Class<? extends Annotation>> qualifierClasses, Elements elements) Creates a ElementQualifierHierarchy from the given classes.- Parameters:
qualifierClasses
- classes of annotations that are the qualifiers for this hierarchyelements
- element utils
-
-
Method Details
-
greatestLowerBound
GLB in this type system is set union of the arguments of the two annotations, unless one of them is bottom, in which case the result is also bottom.- Parameters:
a1
- first qualifiera2
- second qualifier- Returns:
- greatest lower bound of the two annotations or null if the two annotations are not from the same hierarchy
-
leastUpperBound
LUB in this type system is set intersection of the arguments of the two annotations, unless one of them is bottom, in which case the result is the other annotation.- Parameters:
a1
- the first qualifier; may not be in the same hierarchy asqualifier2
a2
- the second qualifier; may not be in the same hierarchy asqualifier1
- Returns:
- the least upper bound of the qualifiers, or
null
if the qualifiers are from different hierarchies
-
isSubtype
isSubtype in this type system is subset.- Parameters:
subAnno
- possible subqualifier ofsuperQualifier
superAnno
- possible superqualifier ofsubQualifier
- Returns:
- true iff
subQualifier
is a subqualifier of, or equal to,superQualifier
-