package org.checkerframework.checker.guieffect;
import java.lang.annotation.Annotation;
import org.checkerframework.checker.guieffect.qual.PolyUIEffect;
import org.checkerframework.checker.guieffect.qual.SafeEffect;
import org.checkerframework.checker.guieffect.qual.UIEffect;
import org.checkerframework.dataflow.qual.Pure;
import org.checkerframework.dataflow.qual.SideEffectFree;
public final class Effect {
// Colin hates Java's comparable interface, so he's not using it
private final Class<? extends Annotation> annotClass;
public Effect(Class<? extends Annotation> cls) {
assert (cls.equals(UIEffect.class)
|| cls.equals(PolyUIEffect.class)
|| cls.equals(SafeEffect.class));
annotClass = cls;
}
public static boolean LE(Effect left, Effect right) {
assert (left != null && right != null);
boolean leftBottom = left.annotClass.equals(SafeEffect.class);
boolean rightTop = right.annotClass.equals(UIEffect.class);
return leftBottom || rightTop || left.annotClass.equals(right.annotClass);
}
public static Effect min(Effect l, Effect r) {
if (LE(l, r)) {
return l;
} else {
return r;
}
}
public static final class EffectRange {
public final Effect min, max;
public EffectRange(Effect min, Effect max) {
assert (min != null || max != null);
// If one is null, fill in with the other
this.min = (min != null ? min : max);
this.max = (max != null ? max : min);
}
}
public boolean isSafe() {
return annotClass.equals(SafeEffect.class);
}
public boolean isUI() {
return annotClass.equals(UIEffect.class);
}
public boolean isPoly() {
return annotClass.equals(PolyUIEffect.class);
}
public Class<? extends Annotation> getAnnot() {
return annotClass;
}
@SideEffectFree
@Override
public String toString() {
return annotClass.getSimpleName();
}
public boolean equals(Effect e) {
return annotClass.equals(e.annotClass);
}
@Override
public boolean equals(Object o) {
if (o instanceof Effect) {
return this.equals((Effect) o);
} else {
return super.equals(o);
}
}
@Pure
@Override
public int hashCode() {
return 31 + annotClass.hashCode();
}
}