| Index: compiler/java/com/google/dart/compiler/ast/viz/BaseASTWriter.java
|
| ===================================================================
|
| --- compiler/java/com/google/dart/compiler/ast/viz/BaseASTWriter.java (revision 0)
|
| +++ compiler/java/com/google/dart/compiler/ast/viz/BaseASTWriter.java (revision 0)
|
| @@ -0,0 +1,651 @@
|
| +// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +package com.google.dart.compiler.ast.viz;
|
| +
|
| +import java.io.File;
|
| +import java.util.List;
|
| +
|
| +import com.google.dart.compiler.ast.DartArrayAccess;
|
| +import com.google.dart.compiler.ast.DartArrayLiteral;
|
| +import com.google.dart.compiler.ast.DartAssertion;
|
| +import com.google.dart.compiler.ast.DartBinaryExpression;
|
| +import com.google.dart.compiler.ast.DartBlock;
|
| +import com.google.dart.compiler.ast.DartBooleanLiteral;
|
| +import com.google.dart.compiler.ast.DartBreakStatement;
|
| +import com.google.dart.compiler.ast.DartCase;
|
| +import com.google.dart.compiler.ast.DartCatchBlock;
|
| +import com.google.dart.compiler.ast.DartClass;
|
| +import com.google.dart.compiler.ast.DartConditional;
|
| +import com.google.dart.compiler.ast.DartContinueStatement;
|
| +import com.google.dart.compiler.ast.DartDefault;
|
| +import com.google.dart.compiler.ast.DartDoWhileStatement;
|
| +import com.google.dart.compiler.ast.DartDoubleLiteral;
|
| +import com.google.dart.compiler.ast.DartEmptyStatement;
|
| +import com.google.dart.compiler.ast.DartExprStmt;
|
| +import com.google.dart.compiler.ast.DartField;
|
| +import com.google.dart.compiler.ast.DartFieldDefinition;
|
| +import com.google.dart.compiler.ast.DartForInStatement;
|
| +import com.google.dart.compiler.ast.DartForStatement;
|
| +import com.google.dart.compiler.ast.DartFunction;
|
| +import com.google.dart.compiler.ast.DartFunctionExpression;
|
| +import com.google.dart.compiler.ast.DartFunctionObjectInvocation;
|
| +import com.google.dart.compiler.ast.DartFunctionTypeAlias;
|
| +import com.google.dart.compiler.ast.DartIdentifier;
|
| +import com.google.dart.compiler.ast.DartIfStatement;
|
| +import com.google.dart.compiler.ast.DartImportDirective;
|
| +import com.google.dart.compiler.ast.DartInitializer;
|
| +import com.google.dart.compiler.ast.DartIntegerLiteral;
|
| +import com.google.dart.compiler.ast.DartLabel;
|
| +import com.google.dart.compiler.ast.DartLibraryDirective;
|
| +import com.google.dart.compiler.ast.DartMapLiteral;
|
| +import com.google.dart.compiler.ast.DartMapLiteralEntry;
|
| +import com.google.dart.compiler.ast.DartMethodDefinition;
|
| +import com.google.dart.compiler.ast.DartMethodInvocation;
|
| +import com.google.dart.compiler.ast.DartNamedExpression;
|
| +import com.google.dart.compiler.ast.DartNativeBlock;
|
| +import com.google.dart.compiler.ast.DartNativeDirective;
|
| +import com.google.dart.compiler.ast.DartNewExpression;
|
| +import com.google.dart.compiler.ast.DartNode;
|
| +import com.google.dart.compiler.ast.DartNodeTraverser;
|
| +import com.google.dart.compiler.ast.DartNullLiteral;
|
| +import com.google.dart.compiler.ast.DartParameter;
|
| +import com.google.dart.compiler.ast.DartParameterizedNode;
|
| +import com.google.dart.compiler.ast.DartParenthesizedExpression;
|
| +import com.google.dart.compiler.ast.DartPropertyAccess;
|
| +import com.google.dart.compiler.ast.DartRedirectConstructorInvocation;
|
| +import com.google.dart.compiler.ast.DartResourceDirective;
|
| +import com.google.dart.compiler.ast.DartReturnStatement;
|
| +import com.google.dart.compiler.ast.DartSourceDirective;
|
| +import com.google.dart.compiler.ast.DartStringInterpolation;
|
| +import com.google.dart.compiler.ast.DartStringLiteral;
|
| +import com.google.dart.compiler.ast.DartSuperConstructorInvocation;
|
| +import com.google.dart.compiler.ast.DartSuperExpression;
|
| +import com.google.dart.compiler.ast.DartSwitchStatement;
|
| +import com.google.dart.compiler.ast.DartSyntheticErrorExpression;
|
| +import com.google.dart.compiler.ast.DartSyntheticErrorStatement;
|
| +import com.google.dart.compiler.ast.DartThisExpression;
|
| +import com.google.dart.compiler.ast.DartThrowStatement;
|
| +import com.google.dart.compiler.ast.DartTryStatement;
|
| +import com.google.dart.compiler.ast.DartTypeExpression;
|
| +import com.google.dart.compiler.ast.DartTypeNode;
|
| +import com.google.dart.compiler.ast.DartTypeParameter;
|
| +import com.google.dart.compiler.ast.DartUnaryExpression;
|
| +import com.google.dart.compiler.ast.DartUnit;
|
| +import com.google.dart.compiler.ast.DartUnqualifiedInvocation;
|
| +import com.google.dart.compiler.ast.DartVariable;
|
| +import com.google.dart.compiler.ast.DartVariableStatement;
|
| +import com.google.dart.compiler.ast.DartWhileStatement;
|
| +import com.google.dart.compiler.ast.LibraryUnit;
|
| +
|
| +/**
|
| + * Base class for the different AST dump formats
|
| + */
|
| +public abstract class BaseASTWriter {
|
| +
|
| + private static final String[] ignoredLibs = {"corelib", "corelib_impl", "dom", "html"};
|
| + protected final String outputDir;
|
| + private final ASTNodeTraverser visitor;
|
| +
|
| + BaseASTWriter(String outputDir) {
|
| + this.outputDir = outputDir;
|
| + visitor = new ASTNodeTraverser();
|
| + }
|
| +
|
| + private void write(String nodeType, DartNode node) {
|
| + write(nodeType, node, "");
|
| + }
|
| +
|
| + /**
|
| + * Handle the write calls from the ASTNodeVisitor for a single node
|
| + *
|
| + * @param nodeType - Type of node. DartNode's classname sometimes refers to inner classes. So, we
|
| + * pass the node type obtained from Visitor function's name.
|
| + * @param node - The Dart node itself
|
| + * @param data - Extra data for printing with the AST node
|
| + */
|
| + protected abstract void write(String nodeType, DartNode node, String data);
|
| +
|
| + // Hooks called before and after visiting tree
|
| + protected abstract void endHook(DartUnit unit);
|
| +
|
| + protected abstract void startHook(DartUnit unit);
|
| +
|
| + /**
|
| + * Processes a Dart Unit by visiting the parse tree
|
| + *
|
| + * @param unit
|
| + */
|
| + public void process(DartUnit unit) {
|
| + startHook(unit);
|
| + unit.accept(visitor);
|
| + endHook(unit);
|
| + }
|
| +
|
| + /**
|
| + * For safety, this class creates the directories required for the AST dump file
|
| + *
|
| + * @param filePath - path of the AST dump file
|
| + * @return true if directory was cleared
|
| + */
|
| + protected boolean makeParentDirs(String filePath) {
|
| + int index = filePath.lastIndexOf(File.separator);
|
| + String dirPath = filePath.substring(0, index);
|
| + return new File(dirPath).mkdirs();
|
| + }
|
| +
|
| + /**
|
| + * Handle visit of children. Specialized classes override functionality to track parent-child
|
| + * relationship here.
|
| + *
|
| + * @param node
|
| + */
|
| + protected void visitChildren(DartNode node) {
|
| + node.visitChildren(visitor);
|
| + }
|
| +
|
| + boolean isIgnored(DartUnit unit) {
|
| + LibraryUnit lu = unit.getLibrary();
|
| + if (lu != null) {
|
| + String libName = lu.getName();
|
| + for (String ignoredLib : ignoredLibs) {
|
| + if (ignoredLib.equals(libName)) {
|
| + return true;
|
| + }
|
| + }
|
| + }
|
| + return false;
|
| + }
|
| +
|
| + class ASTNodeTraverser extends DartNodeTraverser<Object> {
|
| +
|
| + @Override
|
| + public void visit(List<? extends DartNode> nodes) {
|
| + if (nodes != null)
|
| + for (DartNode node : nodes) {
|
| + node.accept(this);
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + public Object visitArrayAccess(DartArrayAccess node) {
|
| + write("DartArrayAccess", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitArrayLiteral(DartArrayLiteral node) {
|
| + write("DartArrayLiteral", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitAssertion(DartAssertion node) {
|
| + write("DartAssertion", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitBinaryExpression(DartBinaryExpression node) {
|
| + write("DartBinaryExpression", node, node.getOperator().name());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitBlock(DartBlock node) {
|
| + write("DartBlock", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitBooleanLiteral(DartBooleanLiteral node) {
|
| + write("DartBooleanLiteral", node, new Boolean(node.getValue()).toString());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitBreakStatement(DartBreakStatement node) {
|
| + write("DartBreakStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitFunctionObjectInvocation(DartFunctionObjectInvocation node) {
|
| + write("DartFunctionObjectInvocation", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitMethodInvocation(DartMethodInvocation node) {
|
| + write("DartMethodInvocation", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitSuperConstructorInvocation(DartSuperConstructorInvocation node) {
|
| + write("DartSuperConstructorInvocation", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitCase(DartCase node) {
|
| + write("DartCase", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitClass(DartClass node) {
|
| + String type = "class ";
|
| + if (node.isInterface()) {
|
| + type = "interface ";
|
| + }
|
| + write("DartClass", node, type + node.getClassName());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitConditional(DartConditional node) {
|
| + write("DartConditional", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitContinueStatement(DartContinueStatement node) {
|
| + write("DartContinueStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitDefault(DartDefault node) {
|
| + write("DartDefault", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitDoubleLiteral(DartDoubleLiteral node) {
|
| + write("DartDoubleLiteral", node, new Double(node.getValue()).toString());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitDoWhileStatement(DartDoWhileStatement node) {
|
| + write("DartDoWhileStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitEmptyStatement(DartEmptyStatement node) {
|
| + write("DartEmptyStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitExprStmt(DartExprStmt node) {
|
| + write("DartExprStmt", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitField(DartField node) {
|
| + write("DartField", node, node.getName().getTargetName());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitFieldDefinition(DartFieldDefinition node) {
|
| + write("DartFieldDefinition", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitForInStatement(DartForInStatement node) {
|
| + write("DartForInStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitForStatement(DartForStatement node) {
|
| + write("DartForStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitFunction(DartFunction node) {
|
| + write("DartFunction", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitFunctionExpression(DartFunctionExpression node) {
|
| + write("DartFunctionExpression", node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitFunctionTypeAlias(DartFunctionTypeAlias node) {
|
| + write("DartFunctionTypeAlias", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitIdentifier(DartIdentifier node) {
|
| + write("DartIdentifier", node, node.getTargetName());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitIfStatement(DartIfStatement node) {
|
| + write("DartIfStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitImportDirective(DartImportDirective node) {
|
| + write("DartImportDirective", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitInitializer(DartInitializer node) {
|
| + write("DartInitializer", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitIntegerLiteral(DartIntegerLiteral node) {
|
| + write("DartIntegerLiteral", node, node.getValue().toString());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitLabel(DartLabel node) {
|
| + write("DartLabel", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitLibraryDirective(DartLibraryDirective node) {
|
| + write("DartLibraryDirective", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitMapLiteral(DartMapLiteral node) {
|
| + write("DartMapLiteral", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitMapLiteralEntry(DartMapLiteralEntry node) {
|
| + write("DartMapLiteralEntry", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitMethodDefinition(DartMethodDefinition node) {
|
| + write("DartMethodDefinition", node, node.getName().toString());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitNativeDirective(DartNativeDirective node) {
|
| + write("DartNativeDirective", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitNewExpression(DartNewExpression node) {
|
| + write("DartNewExpression", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitNullLiteral(DartNullLiteral node) {
|
| + write("DartNullLiteral", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitParameter(DartParameter node) {
|
| + write("DartParameter", node, node.getParameterName());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitParameterizedNode(DartParameterizedNode node) {
|
| + write("DartParameterizedNode", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitParenthesizedExpression(DartParenthesizedExpression node) {
|
| + write("DartParenthesizedExpression", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitPropertyAccess(DartPropertyAccess node) {
|
| + write("DartPropertyAccess", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitTypeNode(DartTypeNode node) {
|
| + write("DartTypeNode", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitResourceDirective(DartResourceDirective node) {
|
| + write("DartResourceDirective", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitReturnStatement(DartReturnStatement node) {
|
| + write("DartReturnStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitSourceDirective(DartSourceDirective node) {
|
| + write("DartSourceDirective", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitStringLiteral(DartStringLiteral node) {
|
| + write("DartStringLiteral", node, '"' + node.getValue() + '"');
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitStringInterpolation(DartStringInterpolation node) {
|
| + write("DartStringInterpolation", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitSuperExpression(DartSuperExpression node) {
|
| + write("DartSuperExpression", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitSwitchStatement(DartSwitchStatement node) {
|
| + write("DartSwitchStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitSyntheticErrorExpression(DartSyntheticErrorExpression node) {
|
| + write("DartSyntheticErrorExpression", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitSyntheticErrorStatement(DartSyntheticErrorStatement node) {
|
| + write("DartSyntheticErrorStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitThisExpression(DartThisExpression node) {
|
| + write("DartThisExpression", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitThrowStatement(DartThrowStatement node) {
|
| + write("DartThrowStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitCatchBlock(DartCatchBlock node) {
|
| + write("DartCatchBlock", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitTryStatement(DartTryStatement node) {
|
| + write("DartTryStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitUnaryExpression(DartUnaryExpression node) {
|
| + write("DartUnaryExpression", node, node.getOperator().name());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitUnit(DartUnit node) {
|
| + if (!isIgnored(node)) {
|
| + visitChildren(node);
|
| + }
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitUnqualifiedInvocation(DartUnqualifiedInvocation node) {
|
| + write("DartUnqualifiedInvocation", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitVariable(DartVariable node) {
|
| + write("DartVariable", node, node.getVariableName());
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitVariableStatement(DartVariableStatement node) {
|
| + write("DartVariableStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitWhileStatement(DartWhileStatement node) {
|
| + write("DartWhileStatement", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitNamedExpression(DartNamedExpression node) {
|
| + write("DartNamedExpression", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitTypeExpression(DartTypeExpression node) {
|
| + write("DartTypeExpression", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitTypeParameter(DartTypeParameter node) {
|
| + write("DartTypeParameter", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitNativeBlock(DartNativeBlock node) {
|
| + write("DartNativeBlock", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| +
|
| + @Override
|
| + public Object visitRedirectConstructorInvocation(DartRedirectConstructorInvocation node) {
|
| + write("DartRedirectConstructorInvocation", node);
|
| + visitChildren(node);
|
| + return null;
|
| + }
|
| + }
|
| +}
|
|
|