package org.checkerframework.common.reflection; import java.util.LinkedHashSet; import org.checkerframework.common.basetype.BaseTypeChecker; import org.checkerframework.common.basetype.BaseTypeVisitor; import org.checkerframework.common.value.ValueChecker; import org.checkerframework.framework.qual.StubFiles; /** * The ClassVal Checker provides a sound estimate of the binary name of Class objects. * * @checker_framework.manual #methodval-and-classval-checkers ClassVal Checker */ @StubFiles({"reflection.astub"}) public class ClassValChecker extends BaseTypeChecker { @Override protected BaseTypeVisitor<?> createSourceVisitor() { return new ClassValVisitor(this); } @Override protected LinkedHashSet<Class<? extends BaseTypeChecker>> getImmediateSubcheckerClasses() { // Don't call super otherwise MethodVal will be added as a subChecker // which creates a circular dependency. LinkedHashSet<Class<? extends BaseTypeChecker>> subCheckers = new LinkedHashSet<>(); subCheckers.add(ValueChecker.class); return subCheckers; } @Override public boolean shouldResolveReflection() { // Because this checker is a subchecker of MethodVal, // reflection can't be resolved. return false; } }