package org.checkerframework.checker.fenum;
import java.lang.annotation.Annotation;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import javax.annotation.processing.SupportedOptions;
import org.checkerframework.common.basetype.BaseTypeChecker;
import org.checkerframework.common.basetype.BaseTypeVisitor;
import org.checkerframework.common.subtyping.SubtypingChecker;
import org.checkerframework.framework.qual.StubFiles;
/**
* The main checker class for the Fake Enum Checker.
*
* <p>There are two options to distinguish different enumerators:
*
* <ol>
* <li>{@code @Fenum("Name")}: introduces a fake enumerator with the name "Name". Enumerators with
* different names are distinct. The default name is empty, but you are encouraged to use a
* unique name for your purpose.
* <li>Alternatively, you can specify the annotation to use with the {@code -Aqual} command line
* argument.
* </ol>
*
* @author wmdietl
* @checker_framework.manual #fenum-checker Fake Enum Checker
*/
@StubFiles("jdnc.astub")
@SupportedOptions({"quals", "qualDirs"})
public class FenumChecker extends BaseTypeChecker {
/*
@Override
public void initChecker() {
super.initChecker();
}
*/
/**
* Copied from SubtypingChecker; cannot reuse it, because SubtypingChecker is final.
*
* @see SubtypingChecker#getSuppressWarningsKeys()
*/
@Override
public Collection<String> getSuppressWarningsKeys() {
Set<Class<? extends Annotation>> annos =
((BaseTypeVisitor<?>) visitor).getTypeFactory().getSupportedTypeQualifiers();
if (annos.isEmpty()) {
return super.getSuppressWarningsKeys();
}
Set<String> swKeys = new HashSet<>();
swKeys.add(SUPPRESS_ALL_KEY);
for (Class<? extends Annotation> anno : annos) {
swKeys.add(anno.getSimpleName().toLowerCase());
}
return swKeys;
}
}