blob: 5f79efefdac9a346a194b69268b971b574b02514 [file] [log] [blame]
package org.checkerframework.framework.testchecker.lubglb;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.util.Elements;
import org.checkerframework.common.basetype.BaseTypeChecker;
import org.checkerframework.common.basetype.BaseTypeVisitor;
import org.checkerframework.framework.testchecker.lubglb.quals.A;
import org.checkerframework.framework.testchecker.lubglb.quals.B;
import org.checkerframework.framework.testchecker.lubglb.quals.C;
import org.checkerframework.framework.testchecker.lubglb.quals.D;
import org.checkerframework.framework.testchecker.lubglb.quals.E;
import org.checkerframework.framework.testchecker.lubglb.quals.F;
import org.checkerframework.framework.testchecker.lubglb.quals.Poly;
import org.checkerframework.framework.type.QualifierHierarchy;
import org.checkerframework.javacutil.AnnotationBuilder;
import org.checkerframework.javacutil.AnnotationUtils;
// Type hierarchy:
// A <-- @DefaultQualifierInHierarchy
// / \
// B C
// \ / \
// D E
// \ /
// F
public class LubGlbChecker extends BaseTypeChecker {
private AnnotationMirror A, B, C, D, E, F, POLY;
@Override
public void initChecker() {
super.initChecker();
Elements elements = processingEnv.getElementUtils();
A = AnnotationBuilder.fromClass(elements, A.class);
B = AnnotationBuilder.fromClass(elements, B.class);
C = AnnotationBuilder.fromClass(elements, C.class);
D = AnnotationBuilder.fromClass(elements, D.class);
E = AnnotationBuilder.fromClass(elements, E.class);
F = AnnotationBuilder.fromClass(elements, F.class);
POLY = AnnotationBuilder.fromClass(elements, Poly.class);
QualifierHierarchy qh = ((BaseTypeVisitor<?>) visitor).getTypeFactory().getQualifierHierarchy();
// System.out.println("LUB of D and E: " + qh.leastUpperBound(D, E));
assert AnnotationUtils.areSame(qh.leastUpperBound(D, E), C) : "LUB of D and E is not C!";
// System.out.println("LUB of E and D: " + qh.leastUpperBound(E, D));
assert AnnotationUtils.areSame(qh.leastUpperBound(E, D), C) : "LUB of E and D is not C!";
// System.out.println("GLB of B and C: " + qh.greatestLowerBound(B, C));
assert AnnotationUtils.areSame(qh.greatestLowerBound(B, C), D) : "GLB of B and C is not D!";
// System.out.println("GLB of C and B: " + qh.greatestLowerBound(C, B));
assert AnnotationUtils.areSame(qh.greatestLowerBound(C, B), D) : "GLB of C and B is not D!";
assert AnnotationUtils.areSame(qh.greatestLowerBound(POLY, B), F)
: "GLB of POLY and B is not F!";
assert AnnotationUtils.areSame(qh.greatestLowerBound(POLY, F), F)
: "GLB of POLY and F is not F!";
assert AnnotationUtils.areSame(qh.greatestLowerBound(POLY, A), POLY)
: "GLB of POLY and A is not POLY!";
assert AnnotationUtils.areSame(qh.leastUpperBound(POLY, B), A) : "LUB of POLY and B is not A!";
assert AnnotationUtils.areSame(qh.leastUpperBound(POLY, F), POLY)
: "LUB of POLY and F is not POLY!";
assert AnnotationUtils.areSame(qh.leastUpperBound(POLY, A), A) : "LUB of POLY and A is not A!";
}
}