blob: d2cbae41394117503860b1490270c6f695d425cc [file] [log] [blame]
package org.checkerframework.common.subtyping;
import java.lang.annotation.Annotation;
import java.util.Set;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.annotation.processing.SupportedOptions;
import org.checkerframework.common.basetype.BaseTypeChecker;
import org.checkerframework.common.basetype.BaseTypeVisitor;
import org.checkerframework.framework.source.SourceVisitor;
/**
* A checker for type qualifier systems that only checks subtyping relationships.
*
* <p>The annotation(s) are specified on the command line, using an annotation processor argument:
*
* <ul>
* <li>{@code -Aquals}: specifies the annotations in the qualifier hierarchy (as a comma-separated
* list of fully-qualified annotation names with no spaces in between). Only the annotations
* for one qualified subtype hierarchy can be passed.
* </ul>
*
* @checker_framework.manual #subtyping-checker Subtying Checker
*/
@SupportedOptions({"quals", "qualDirs"})
public final class SubtypingChecker extends BaseTypeChecker {
/**
* Compute SuppressWarnings prefixes, based on the names of all the qualifiers.
*
* <p>Provided for the convenience of checkers that do not subclass {@code SubtypingChecker}
* (because it is final). Clients should call it like:
*
* <pre>{@code
* SubtypingChecker.getSuppressWarningsPrefixes(this.visitor, super.getSuppressWarningsPrefixes());
* }</pre>
*
* @param visitor the visitor
* @param superSupportedTypeQualifiers the result of super.getSuppressWarningsPrefixes(), as
* executed by checker
* @return SuppressWarnings prefixes, based on the names of all the qualifiers
*/
public static SortedSet<String> getSuppressWarningsPrefixes(
SourceVisitor<?, ?> visitor, SortedSet<String> superSupportedTypeQualifiers) {
TreeSet<String> result = new TreeSet<>(superSupportedTypeQualifiers);
// visitor can be null if there was an error when calling the visitor class's constructor --
// that is, when there is a bug in a checker implementation.
if (visitor != null) {
Set<Class<? extends Annotation>> annos =
((BaseTypeVisitor<?>) visitor).getTypeFactory().getSupportedTypeQualifiers();
for (Class<? extends Annotation> anno : annos) {
result.add(anno.getSimpleName().toLowerCase());
}
}
return result;
}
@Override
public SortedSet<String> getSuppressWarningsPrefixes() {
return getSuppressWarningsPrefixes(this.visitor, super.getSuppressWarningsPrefixes());
}
}