package org.checkerframework.common.util.debug;

import com.sun.source.util.TreePath;
import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
import com.sun.tools.javac.tree.Pretty;
import java.io.IOException;
import java.io.StringWriter;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.annotation.processing.SupportedSourceVersion;
import javax.lang.model.SourceVersion;
import javax.lang.model.element.TypeElement;
import org.checkerframework.javacutil.AbstractTypeProcessor;

/**
 * A utility class for pretty-printing the AST of a program.
 *
 * <p>The class is actually an annotation processor; in order to use it, invoke the compiler on the
 * source file(s) for which you wish to view the AST of the program. You may also wish to use the
 * {@code -proc:only} javac option to stop compilation after annotation processing. (But, in general
 * {@code -proc:only} causes type annotation processors not to be run.)
 *
 * <p>A simple main method is also provided. You can invoke this tool as:
 *
 * <p>java org.checkerframework.common.util.debug.TreePrinter *.java
 *
 * <p>The visitor simply uses the javac Pretty visitor to output a nicely formatted version of the
 * AST.
 *
 * <p>TODO: I couldn't find a way to display the result of Pretty, therefore I wrote this simple
 * class. If there already was a way, please let me know.
 *
 * <p>TODO: what I really want is something like SignaturePrinter, but for the whole source of the
 * program, that is, for each type in the program use the factory to determine the defaulted
 * annotations on the type.
 *
 * @see org.checkerframework.common.util.debug.TreeDebug
 */
@SupportedAnnotationTypes("*")
@SupportedSourceVersion(SourceVersion.RELEASE_8)
public class TreePrinter extends AbstractTypeProcessor {
  @Override
  public void typeProcess(TypeElement element, TreePath tree) {
    final StringWriter out = new StringWriter();
    final Pretty pretty = new Pretty(out, true);

    try {
      pretty.printUnit((JCCompilationUnit) tree.getCompilationUnit(), null);
    } catch (IOException e) {
      throw new Error(e);
    }
    System.out.println(out.toString());
  }

  public static void main(String[] args) throws Exception {
    String[] newArgs = new String[args.length + 3];
    newArgs[0] = "-processor";
    newArgs[1] = "org.checkerframework.common.util.debug.TreePrinter";
    newArgs[2] = "-proc:only";
    System.arraycopy(args, 0, newArgs, 3, args.length);
    com.sun.tools.javac.Main.compile(newArgs);
  }
}
