package org.checkerframework.framework.type.visitor;

import org.checkerframework.framework.type.AnnotatedTypeMirror;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedArrayType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedDeclaredType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedExecutableType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedIntersectionType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedNoType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedNullType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedPrimitiveType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedTypeVariable;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedUnionType;
import org.checkerframework.framework.type.AnnotatedTypeMirror.AnnotatedWildcardType;
import org.checkerframework.framework.util.AtmCombo;
import org.checkerframework.javacutil.BugInCF;

/**
 * Implements all methods from AtmComboVisitor. By default all methods throw an exception. Implement
 * only those methods you expect to be called on your subclass.
 *
 * <p>This class does no traversal.
 */
public abstract class AbstractAtmComboVisitor<RETURN_TYPE, PARAM>
    implements AtmComboVisitor<RETURN_TYPE, PARAM> {

  /**
   * Formats type1, type2 and param into an error message used by all methods of
   * AbstractAtmComboVisitor that are not overridden. Normally, this method should indicate that the
   * given method (and therefore the given pair of type mirror classes) is not supported by this
   * class.
   *
   * @param type1 the first AnnotatedTypeMirror parameter to the visit method called
   * @param type2 the second AnnotatedTypeMirror parameter to the visit method called
   * @param param subtype specific parameter passed to every visit method
   * @return an error message
   */
  protected abstract String defaultErrorMessage(
      AnnotatedTypeMirror type1, AnnotatedTypeMirror type2, PARAM param);

  /**
   * Called by the default implementation of every AbstractAtmComboVisitor visit method. This
   * methodnS issues a runtime exception by default. In general, it should handle the case where a
   * visit method has been called with a pair of type mirrors that should never be passed to this
   * particular visitor.
   *
   * @param type1 the first AnnotatedTypeMirror parameter to the visit method called
   * @param type2 the second AnnotatedTypeMirror parameter to the visit method called
   * @param param subtype specific parameter passed to every visit method
   */
  protected RETURN_TYPE defaultAction(
      AnnotatedTypeMirror type1, AnnotatedTypeMirror type2, PARAM param) {
    throw new BugInCF(defaultErrorMessage(type1, type2, param));
  }

  /**
   * Dispatches to a more specific {@code visit*} method.
   *
   * @param type1 the first type to visit
   * @param type2 the second type to visit
   * @param param a value passed to every visit method
   * @return the result of calling the more specific {@code visit*} method
   */
  public RETURN_TYPE visit(
      final AnnotatedTypeMirror type1, final AnnotatedTypeMirror type2, PARAM param) {
    return AtmCombo.accept(type1, type2, param, this);
  }

  @Override
  public RETURN_TYPE visitArray_Array(
      AnnotatedArrayType type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitArray_Declared(
      AnnotatedArrayType type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitArray_Executable(
      AnnotatedArrayType type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitArray_Intersection(
      AnnotatedArrayType type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitArray_None(AnnotatedArrayType type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitArray_Null(
      AnnotatedArrayType type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitArray_Primitive(
      AnnotatedArrayType type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitArray_Typevar(
      AnnotatedArrayType type1, AnnotatedTypeVariable type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitArray_Union(
      AnnotatedArrayType type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitArray_Wildcard(
      AnnotatedArrayType type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_Array(
      AnnotatedDeclaredType type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_Declared(
      AnnotatedDeclaredType type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_Executable(
      AnnotatedDeclaredType type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_Intersection(
      AnnotatedDeclaredType type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_None(
      AnnotatedDeclaredType type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_Null(
      AnnotatedDeclaredType type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_Primitive(
      AnnotatedDeclaredType type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_Typevar(
      AnnotatedDeclaredType type1, AnnotatedTypeVariable type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_Union(
      AnnotatedDeclaredType type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitDeclared_Wildcard(
      AnnotatedDeclaredType type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_Array(
      AnnotatedExecutableType type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_Declared(
      AnnotatedExecutableType type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_Executable(
      AnnotatedExecutableType type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_Intersection(
      AnnotatedExecutableType type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_None(
      AnnotatedExecutableType type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_Null(
      AnnotatedExecutableType type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_Primitive(
      AnnotatedExecutableType type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_Typevar(
      AnnotatedExecutableType type1, AnnotatedTypeVariable type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_Union(
      AnnotatedExecutableType type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitExecutable_Wildcard(
      AnnotatedExecutableType type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_Array(
      AnnotatedIntersectionType type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_Declared(
      AnnotatedIntersectionType type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_Executable(
      AnnotatedIntersectionType type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_Intersection(
      AnnotatedIntersectionType type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_None(
      AnnotatedIntersectionType type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_Null(
      AnnotatedIntersectionType type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_Primitive(
      AnnotatedIntersectionType type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_Typevar(
      AnnotatedIntersectionType type1, AnnotatedTypeVariable type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_Union(
      AnnotatedIntersectionType type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitIntersection_Wildcard(
      AnnotatedIntersectionType type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNone_Array(AnnotatedNoType type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNone_Declared(
      AnnotatedNoType type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNone_Executable(
      AnnotatedNoType type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNone_Intersection(
      AnnotatedNoType type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNone_None(AnnotatedNoType type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNone_Null(AnnotatedNoType type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNone_Primitive(
      AnnotatedNoType type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNone_Union(AnnotatedNoType type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNone_Wildcard(
      AnnotatedNoType type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_Array(
      AnnotatedNullType type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_Declared(
      AnnotatedNullType type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_Executable(
      AnnotatedNullType type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_Intersection(
      AnnotatedNullType type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_None(AnnotatedNullType type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_Null(AnnotatedNullType type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_Primitive(
      AnnotatedNullType type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_Typevar(
      AnnotatedNullType type1, AnnotatedTypeVariable type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_Union(
      AnnotatedNullType type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitNull_Wildcard(
      AnnotatedNullType type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_Array(
      AnnotatedPrimitiveType type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_Declared(
      AnnotatedPrimitiveType type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_Executable(
      AnnotatedPrimitiveType type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_Intersection(
      AnnotatedPrimitiveType type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_None(
      AnnotatedPrimitiveType type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_Null(
      AnnotatedPrimitiveType type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_Primitive(
      AnnotatedPrimitiveType type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_Typevar(
      AnnotatedPrimitiveType type1, AnnotatedTypeVariable type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_Union(
      AnnotatedPrimitiveType type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitPrimitive_Wildcard(
      AnnotatedPrimitiveType type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_Array(
      AnnotatedUnionType type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_Declared(
      AnnotatedUnionType type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_Executable(
      AnnotatedUnionType type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_Intersection(
      AnnotatedUnionType type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_None(AnnotatedUnionType type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_Null(
      AnnotatedUnionType type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_Primitive(
      AnnotatedUnionType type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_Typevar(
      AnnotatedUnionType type1, AnnotatedTypeVariable type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_Union(
      AnnotatedUnionType type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitUnion_Wildcard(
      AnnotatedUnionType type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_Array(
      AnnotatedTypeVariable type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_Declared(
      AnnotatedTypeVariable type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_Executable(
      AnnotatedTypeVariable type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_Intersection(
      AnnotatedTypeVariable type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_None(
      AnnotatedTypeVariable type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_Null(
      AnnotatedTypeVariable type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_Primitive(
      AnnotatedTypeVariable type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_Typevar(
      AnnotatedTypeVariable type1, AnnotatedTypeVariable type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_Union(
      AnnotatedTypeVariable type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitTypevar_Wildcard(
      AnnotatedTypeVariable type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_Array(
      AnnotatedWildcardType type1, AnnotatedArrayType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_Declared(
      AnnotatedWildcardType type1, AnnotatedDeclaredType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_Executable(
      AnnotatedWildcardType type1, AnnotatedExecutableType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_Intersection(
      AnnotatedWildcardType type1, AnnotatedIntersectionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_None(
      AnnotatedWildcardType type1, AnnotatedNoType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_Null(
      AnnotatedWildcardType type1, AnnotatedNullType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_Primitive(
      AnnotatedWildcardType type1, AnnotatedPrimitiveType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_Typevar(
      AnnotatedWildcardType type1, AnnotatedTypeVariable type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_Union(
      AnnotatedWildcardType type1, AnnotatedUnionType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }

  @Override
  public RETURN_TYPE visitWildcard_Wildcard(
      AnnotatedWildcardType type1, AnnotatedWildcardType type2, PARAM param) {
    return defaultAction(type1, type2, param);
  }
}
