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;

/**
 * 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> {

  /**
   * 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(AnnotatedTypeMirror type1, 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);
  }
}
