blob: 5ad5bab76c8fe12859e9c3990689c67636375219 [file] [log] [blame]
package org.checkerframework.framework.util;
import java.lang.annotation.Annotation;
import java.util.Set;
import org.checkerframework.checker.interning.qual.Interned;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.checkerframework.checker.signature.qual.CanonicalName;
import org.checkerframework.dataflow.qual.Pure;
import org.checkerframework.framework.qual.AnnotatedFor;
/**
* Represents a kind of qualifier, which is an annotation class. If two qualifiers use the same
* annotation class, then they have the same qualifier kind. Two qualifiers can have the same "kind"
* of qualifier but not be the same qualifier; an example is {@code @IndexFor("a")} and
* {@code @IndexFor("b")}.
*
* <p>A {@code QualifierKind} holds information about the relationship between itself and other
* {@link QualifierKind}s.
*
* <p>Exactly one qualifier kind is created for each annotation class.
*
* <p>The set of all QualifierKinds for a checker is like an enum. One QualifierKind is like an enum
* constant in that they are immutable after initialization and only a finite number exist per type
* system.
*/
@AnnotatedFor("nullness")
public @Interned interface QualifierKind extends Comparable<QualifierKind> {
/**
* Returns the canonical name of the annotation class of this.
*
* @return the canonical name of the annotation class of this
*/
@Interned @CanonicalName String getName();
/**
* Returns the annotation class for this.
*
* @return the annotation class for this
*/
Class<? extends Annotation> getAnnotationClass();
/**
* Returns the top qualifier kind of the hierarchy to which this qualifier kind belongs.
*
* @return the top qualifier kind of the hierarchy to which this qualifier kind belongs
*/
QualifierKind getTop();
/**
* Returns true if this is the top qualifier of its hierarchy.
*
* @return true if this is the top qualifier of its hierarchy
*/
boolean isTop();
/**
* Returns the bottom qualifier kind of the hierarchy to which this qualifier kind belongs.
*
* @return the bottom qualifier kind of the hierarchy to which this qualifier kind belongs
*/
QualifierKind getBottom();
/**
* Returns true if this is the bottom qualifier of its hierarchy.
*
* @return true if this is the bottom qualifier of its hierarchy
*/
boolean isBottom();
/**
* Returns the polymorphic qualifier kind of the hierarchy to which this qualifier kind belongs,
* or null if one does not exist.
*
* @return the polymorphic qualifier kind of the hierarchy to which this qualifier kind belongs,
* or null if one does not exist
*/
@Nullable QualifierKind getPolymorphic();
/**
* Returns true if this is polymorphic.
*
* @return true if this is polymorphic
*/
@Pure
boolean isPoly();
/**
* Returns true if the annotation class this qualifier kind represents has annotation
* elements/arguments.
*
* @return true if the annotation class this qualifier kind represents has elements/arguments
*/
boolean hasElements();
/**
* All the qualifier kinds that are a strict super qualifier of this qualifier. Does not include
* this qualifier kind itself.
*
* @return all the qualifier kinds that are a strict super qualifier of this qualifier
*/
Set<? extends QualifierKind> getStrictSuperTypes();
/**
* Returns true if this and {@code other} are in the same hierarchy.
*
* @param other a qualifier kind
* @return true if this and {@code other} are in the same hierarchy
*/
boolean isInSameHierarchyAs(QualifierKind other);
/**
* Returns true if this qualifier kind is a subtype of or equal to {@code superQualKind}.
*
* @param superQualKind other qualifier kind
* @return true if this qualifier kind is a subtype of or equal to {@code superQualKind}
*/
boolean isSubtypeOf(QualifierKind superQualKind);
@Override
default int compareTo(QualifierKind o) {
return this.getName().compareTo(o.getName());
}
}