package org.checkerframework.framework.testchecker.supportedquals;

import java.lang.annotation.Annotation;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import org.checkerframework.common.basetype.BaseAnnotatedTypeFactory;
import org.checkerframework.common.basetype.BaseTypeChecker;
import org.checkerframework.common.basetype.BaseTypeVisitor;
import org.checkerframework.framework.testchecker.supportedquals.qual.BottomQualifier;
import org.checkerframework.framework.testchecker.supportedquals.qual.Qualifier;

/**
 * Tests that annotations that have @Target(TYPE_USE, OTHER) (where OTHER is not TYPE_PARAMETER) may
 * be in the qual package so long as {@link BaseAnnotatedTypeFactory#createSupportedTypeQualifiers}
 * is overridden.
 */
public class SupportedQualsChecker extends BaseTypeChecker {
  @Override
  protected BaseTypeVisitor<?> createSourceVisitor() {
    return new BaseTypeVisitor<SupportedQualsAnnotatedTypeFactory>(this) {
      @Override
      protected SupportedQualsAnnotatedTypeFactory createTypeFactory() {
        return new SupportedQualsAnnotatedTypeFactory(checker);
      }
    };
  }

  class SupportedQualsAnnotatedTypeFactory extends BaseAnnotatedTypeFactory {
    public SupportedQualsAnnotatedTypeFactory(BaseTypeChecker checker) {
      super(checker);
      postInit();
    }

    @Override
    protected Set<Class<? extends Annotation>> createSupportedTypeQualifiers() {
      return new HashSet<Class<? extends Annotation>>(
          Arrays.asList(Qualifier.class, BottomQualifier.class));
    }
  }
}
