package qual; import javax.annotation.processing.ProcessingEnvironment; import javax.lang.model.element.AnnotationMirror; import javax.lang.model.util.Elements; import org.checkerframework.checker.units.UnitsRelations; import org.checkerframework.checker.units.UnitsRelationsTools; import org.checkerframework.checker.units.qual.Prefix; import org.checkerframework.checker.units.qual.s; import org.checkerframework.framework.type.AnnotatedTypeMirror; /*>>> import org.checkerframework.checker.nullness.qual.Nullable; */ /** Relations among units of frequency. */ public class FrequencyRelations implements UnitsRelations { protected AnnotationMirror hertz, kilohertz, second, millisecond; protected Elements elements; public UnitsRelations init(ProcessingEnvironment env) { elements = env.getElementUtils(); // create Annotation Mirrors, each representing a particular Unit's Annotation hertz = UnitsRelationsTools.buildAnnoMirrorWithDefaultPrefix(env, Hz.class); kilohertz = UnitsRelationsTools.buildAnnoMirrorWithSpecificPrefix(env, Hz.class, Prefix.kilo); second = UnitsRelationsTools.buildAnnoMirrorWithDefaultPrefix(env, s.class); millisecond = UnitsRelationsTools.buildAnnoMirrorWithSpecificPrefix(env, s.class, Prefix.milli); return this; } /** No multiplications yield Hertz. */ public /*@Nullable*/ AnnotationMirror multiplication( AnnotatedTypeMirror lht, AnnotatedTypeMirror rht) { // return null so the default units relations can process multiplcations of other units return null; } /** * Division of a scalar by seconds yields Hertz. Division of a scalar by milliseconds yields * Kilohertz. Other divisions yield an unannotated value. */ public /*@Nullable*/ AnnotationMirror division( AnnotatedTypeMirror lht, AnnotatedTypeMirror rht) { if (UnitsRelationsTools.hasNoUnits(lht)) { // scalar / millisecond => kilohertz if (UnitsRelationsTools.hasSpecificUnit(rht, millisecond)) { return kilohertz; } // scalar / second => hertz else if (UnitsRelationsTools.hasSpecificUnit(rht, second)) { return hertz; } } return null; } }