package org.checkerframework.framework.type.treeannotator;

import com.sun.source.tree.Tree;
import com.sun.source.tree.Tree.Kind;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.checkerframework.framework.type.AnnotatedTypeMirror;

/** A ListTreeAnnotator implementation that additionally outputs debugging information. */
public class DebugListTreeAnnotator extends ListTreeAnnotator {
  private final Set<Kind> kinds;

  public DebugListTreeAnnotator(TreeAnnotator... annotators) {
    super(annotators);
    kinds = Collections.emptySet();
  }

  public DebugListTreeAnnotator(Tree.Kind[] kinds, TreeAnnotator... annotators) {
    super(annotators);
    this.kinds = new HashSet<>(Arrays.asList(kinds));
  }

  @Override
  public Void defaultAction(Tree node, AnnotatedTypeMirror type) {
    if (kinds.contains(node.getKind())) {
      System.out.println("DebugListTreeAnnotator input tree: " + node);
      System.out.println("    Initial type: " + type);
      for (TreeAnnotator annotator : annotators) {
        System.out.println("    Running annotator: " + annotator.getClass());
        annotator.visit(node, type);
        System.out.println("    Current type: " + type);
      }
    } else {
      super.defaultAction(node, type);
    }

    return null;
  }
}
