/* * Copyright 2010 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.dev.jjs.impl; import com.google.gwt.dev.jjs.ast.JProgram; import com.google.gwt.dev.util.AbstractTextOutput; import com.google.gwt.dev.util.TextOutput; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintWriter; /** * A simple utility to dump a JProgram to a temp file, which can be called * sequentially during a compilation/optimization run, so intermediate steps can * be compared. * * It uses the system property "gwt.jjs.dumpAst" to determine the name (or * prefix) of the file to dump the AST to. * * TODO(jbrosenberg): Add proper logging and/or exception handling for the * potential IOException that might occur when writing the file. */ public class AstDumper { private static int autoVersionNumber = 0; /** * Appends a new version of the AST at the end of the file, each time it's * called. */ public static void maybeDumpAST(JProgram jprogram) { maybeDumpAST(jprogram, null, true); } /** * Writes the AST to the file with a versioned extension, using an * auto-incrementing version number (starting from 1), each time it's called. * Any previous contents of the file written to will be overwritten. */ public static void maybeDumpAST(JProgram jprogram, boolean autoIncrementVersion) { if (!autoIncrementVersion) { maybeDumpAST(jprogram); } else { maybeDumpAST(jprogram, autoVersionNumber++); } } /** * Writes the AST to the file with the provided version number extension. Any * previous contents of the file written to will be overwritten. */ public static void maybeDumpAST(JProgram jprogram, int versionNumber) { String fileExtension = "." + versionNumber; maybeDumpAST(jprogram, fileExtension, false); } /** * Writes the AST to the file with the provided version string extension. Any * previous contents of the file written to will be overwritten. */ public static void maybeDumpAST(JProgram jprogram, String versionString) { String fileExtension = "." + versionString; maybeDumpAST(jprogram, fileExtension, false); } private static void maybeDumpAST(JProgram jprogram, String fileExtension, boolean append) { String dumpFile = System.getProperty("gwt.jjs.dumpAst"); if (dumpFile != null) { if (fileExtension != null) { dumpFile += fileExtension; } try { FileOutputStream os = new FileOutputStream(dumpFile, append); final PrintWriter pw = new PrintWriter(os); TextOutput out = new AbstractTextOutput(false) { { setPrintWriter(pw); } }; SourceGenerationVisitor v = new SourceGenerationVisitor(out); v.accept(jprogram); pw.close(); } catch (IOException e) { System.out.println("Could not dump AST"); e.printStackTrace(); } } } }