/******************************************************************************* * Copyright (c) 2015 Jeff Martin. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Lesser General Public * License v3.0 which accompanies this distribution, and is available at * http://www.gnu.org/licenses/lgpl.html * * Contributors: * Jeff Martin - initial API and implementation ******************************************************************************/ package cuchaz.enigma.analysis; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.Writer; import com.strobel.componentmodel.Key; import com.strobel.decompiler.languages.java.ast.*; import com.strobel.decompiler.patterns.Pattern; public class TreeDumpVisitor implements IAstVisitor<Void, Void> { private File m_file; private Writer m_out; public TreeDumpVisitor(File file) { m_file = file; m_out = null; } @Override public Void visitCompilationUnit(CompilationUnit node, Void ignored) { try { m_out = new FileWriter(m_file); recurse(node, ignored); m_out.close(); return null; }catch(IOException ex) { throw new Error(ex); } } private Void recurse(AstNode node, Void ignored) { // show the tree try { m_out.write(getIndent(node) + node.getClass().getSimpleName() + " " + getText(node) + " " + dumpUserData(node) + " " + node.getRegion() + "\n"); }catch(IOException ex) { throw new Error(ex); } // recurse for(final AstNode child : node.getChildren()) child.acceptVisitor(this, ignored); return null; } private String getText(AstNode node) { if(node instanceof Identifier) return "\"" + ((Identifier)node).getName() + "\""; return ""; } private String dumpUserData(AstNode node) { StringBuilder buf = new StringBuilder(); for(Key<?> key : Keys.ALL_KEYS) { Object val = node.getUserData(key); if(val != null) buf.append(String.format(" [%s=%s]", key, val)); } return buf.toString(); } private String getIndent(AstNode node) { StringBuilder buf = new StringBuilder(); int depth = getDepth(node); for(int i = 0; i < depth; i++) buf.append("\t"); return buf.toString(); } private int getDepth(AstNode node) { int depth = -1; while(node != null) { depth++; node = node.getParent(); } return depth; } // OVERRIDES WE DON'T CARE ABOUT @Override public Void visitInvocationExpression(InvocationExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitMemberReferenceExpression(MemberReferenceExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitSimpleType(SimpleType node, Void ignored) { return recurse(node, ignored); } @Override public Void visitMethodDeclaration(MethodDeclaration node, Void ignored) { return recurse(node, ignored); } @Override public Void visitConstructorDeclaration(ConstructorDeclaration node, Void ignored) { return recurse(node, ignored); } @Override public Void visitParameterDeclaration(ParameterDeclaration node, Void ignored) { return recurse(node, ignored); } @Override public Void visitFieldDeclaration(FieldDeclaration node, Void ignored) { return recurse(node, ignored); } @Override public Void visitTypeDeclaration(TypeDeclaration node, Void ignored) { return recurse(node, ignored); } @Override public Void visitComment(Comment node, Void ignored) { return recurse(node, ignored); } @Override public Void visitPatternPlaceholder(AstNode node, Pattern pattern, Void ignored) { return recurse(node, ignored); } @Override public Void visitTypeReference(TypeReferenceExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitJavaTokenNode(JavaTokenNode node, Void ignored) { return recurse(node, ignored); } @Override public Void visitIdentifier(Identifier node, Void ignored) { return recurse(node, ignored); } @Override public Void visitNullReferenceExpression(NullReferenceExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitThisReferenceExpression(ThisReferenceExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitSuperReferenceExpression(SuperReferenceExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitClassOfExpression(ClassOfExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitBlockStatement(BlockStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitExpressionStatement(ExpressionStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitBreakStatement(BreakStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitContinueStatement(ContinueStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitDoWhileStatement(DoWhileStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitEmptyStatement(EmptyStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitIfElseStatement(IfElseStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitLabelStatement(LabelStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitLabeledStatement(LabeledStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitReturnStatement(ReturnStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitSwitchStatement(SwitchStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitSwitchSection(SwitchSection node, Void ignored) { return recurse(node, ignored); } @Override public Void visitCaseLabel(CaseLabel node, Void ignored) { return recurse(node, ignored); } @Override public Void visitThrowStatement(ThrowStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitCatchClause(CatchClause node, Void ignored) { return recurse(node, ignored); } @Override public Void visitAnnotation(Annotation node, Void ignored) { return recurse(node, ignored); } @Override public Void visitNewLine(NewLineNode node, Void ignored) { return recurse(node, ignored); } @Override public Void visitVariableDeclaration(VariableDeclarationStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitVariableInitializer(VariableInitializer node, Void ignored) { return recurse(node, ignored); } @Override public Void visitText(TextNode node, Void ignored) { return recurse(node, ignored); } @Override public Void visitImportDeclaration(ImportDeclaration node, Void ignored) { return recurse(node, ignored); } @Override public Void visitInitializerBlock(InstanceInitializer node, Void ignored) { return recurse(node, ignored); } @Override public Void visitTypeParameterDeclaration(TypeParameterDeclaration node, Void ignored) { return recurse(node, ignored); } @Override public Void visitPackageDeclaration(PackageDeclaration node, Void ignored) { return recurse(node, ignored); } @Override public Void visitArraySpecifier(ArraySpecifier node, Void ignored) { return recurse(node, ignored); } @Override public Void visitComposedType(ComposedType node, Void ignored) { return recurse(node, ignored); } @Override public Void visitWhileStatement(WhileStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitPrimitiveExpression(PrimitiveExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitCastExpression(CastExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitBinaryOperatorExpression(BinaryOperatorExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitInstanceOfExpression(InstanceOfExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitIndexerExpression(IndexerExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitIdentifierExpression(IdentifierExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitUnaryOperatorExpression(UnaryOperatorExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitConditionalExpression(ConditionalExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitArrayInitializerExpression( ArrayInitializerExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitObjectCreationExpression(ObjectCreationExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitArrayCreationExpression(ArrayCreationExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitAssignmentExpression(AssignmentExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitForStatement(ForStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitForEachStatement(ForEachStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitTryCatchStatement(TryCatchStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitGotoStatement(GotoStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitParenthesizedExpression(ParenthesizedExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitSynchronizedStatement(SynchronizedStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitAnonymousObjectCreationExpression( AnonymousObjectCreationExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitWildcardType(WildcardType node, Void ignored) { return recurse(node, ignored); } @Override public Void visitMethodGroupExpression(MethodGroupExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitEnumValueDeclaration(EnumValueDeclaration node, Void ignored) { return recurse(node, ignored); } @Override public Void visitAssertStatement(AssertStatement node, Void ignored) { return recurse(node, ignored); } @Override public Void visitLambdaExpression(LambdaExpression node, Void ignored) { return recurse(node, ignored); } @Override public Void visitLocalTypeDeclarationStatement( LocalTypeDeclarationStatement node, Void ignored) { return recurse(node, ignored); } }