package org.checkerframework.framework.type.typeannotator;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.checkerframework.framework.type.AnnotatedTypeMirror;

/**
 * ListTypeAnnotator is a TypeAnnotator that executes a list of {@link TypeAnnotator} for each type
 * visited.
 *
 * <p>Checkers should not extend ListTypeAnnotator; they should instead pass a custom TypeAnnotator
 * to the constructor.
 *
 * @see DefaultForTypeAnnotator
 * @see org.checkerframework.framework.type.typeannotator.PropagationTypeAnnotator
 */
public final class ListTypeAnnotator extends TypeAnnotator {

  /**
   * The annotators that will be executed for each type scanned by this TypeAnnotator. They are
   * executed in order.
   */
  final List<TypeAnnotator> annotators;

  /**
   * Create a new ListTypeAnnotator.
   *
   * @param annotators the annotators that will be executed for each type scanned by this
   *     TypeAnnotator. They are executed in the order passed in.
   */
  public ListTypeAnnotator(TypeAnnotator... annotators) {
    this(Arrays.asList(annotators));
  }

  /**
   * @param annotators the annotators that will be executed for each type scanned by this
   *     TypeAnnotator. They are executed in the order passed in.
   */
  public ListTypeAnnotator(List<TypeAnnotator> annotators) {
    super(null);
    List<TypeAnnotator> annotatorList = new ArrayList<>(annotators.size());
    for (TypeAnnotator annotator : annotators) {
      if (annotator instanceof ListTypeAnnotator) {
        annotatorList.addAll(((ListTypeAnnotator) annotator).annotators);
      } else {
        annotatorList.add(annotator);
      }
    }
    this.annotators = Collections.unmodifiableList(annotatorList);
  }

  @Override
  protected Void scan(AnnotatedTypeMirror type, Void aVoid) {
    for (TypeAnnotator annotator : annotators) {
      annotator.visit(type, aVoid);
    }

    return null;
  }

  @Override
  public String toString() {
    return "ListTypeAnnotator" + annotators;
  }
}
