/******************************************************************************* * Copyright (c) 2014 Jeff Martin. * All rights reserved. This program and the accompanying materials * are made available under the terms of the GNU Public License v3.0 * which accompanies this distribution, and is available at * http://www.gnu.org/licenses/gpl.html * * Contributors: * Jeff Martin - initial API and implementation ******************************************************************************/ package cuchaz.enigma.analysis; import com.strobel.assembler.metadata.TypeDefinition; import com.strobel.decompiler.languages.java.ast.Annotation; import com.strobel.decompiler.languages.java.ast.AnonymousObjectCreationExpression; import com.strobel.decompiler.languages.java.ast.ArrayCreationExpression; import com.strobel.decompiler.languages.java.ast.ArrayInitializerExpression; import com.strobel.decompiler.languages.java.ast.ArraySpecifier; import com.strobel.decompiler.languages.java.ast.AssertStatement; import com.strobel.decompiler.languages.java.ast.AssignmentExpression; import com.strobel.decompiler.languages.java.ast.AstNode; import com.strobel.decompiler.languages.java.ast.BinaryOperatorExpression; import com.strobel.decompiler.languages.java.ast.BlockStatement; import com.strobel.decompiler.languages.java.ast.BreakStatement; import com.strobel.decompiler.languages.java.ast.CaseLabel; import com.strobel.decompiler.languages.java.ast.CastExpression; import com.strobel.decompiler.languages.java.ast.CatchClause; import com.strobel.decompiler.languages.java.ast.ClassOfExpression; import com.strobel.decompiler.languages.java.ast.Comment; import com.strobel.decompiler.languages.java.ast.CompilationUnit; import com.strobel.decompiler.languages.java.ast.ComposedType; import com.strobel.decompiler.languages.java.ast.ConditionalExpression; import com.strobel.decompiler.languages.java.ast.ConstructorDeclaration; import com.strobel.decompiler.languages.java.ast.ContinueStatement; import com.strobel.decompiler.languages.java.ast.DoWhileStatement; import com.strobel.decompiler.languages.java.ast.EmptyStatement; import com.strobel.decompiler.languages.java.ast.EnumValueDeclaration; import com.strobel.decompiler.languages.java.ast.ExpressionStatement; import com.strobel.decompiler.languages.java.ast.FieldDeclaration; import com.strobel.decompiler.languages.java.ast.ForEachStatement; import com.strobel.decompiler.languages.java.ast.ForStatement; import com.strobel.decompiler.languages.java.ast.GotoStatement; import com.strobel.decompiler.languages.java.ast.IAstVisitor; import com.strobel.decompiler.languages.java.ast.Identifier; import com.strobel.decompiler.languages.java.ast.IdentifierExpression; import com.strobel.decompiler.languages.java.ast.IfElseStatement; import com.strobel.decompiler.languages.java.ast.ImportDeclaration; import com.strobel.decompiler.languages.java.ast.IndexerExpression; import com.strobel.decompiler.languages.java.ast.InstanceInitializer; import com.strobel.decompiler.languages.java.ast.InstanceOfExpression; import com.strobel.decompiler.languages.java.ast.InvocationExpression; import com.strobel.decompiler.languages.java.ast.JavaTokenNode; import com.strobel.decompiler.languages.java.ast.Keys; import com.strobel.decompiler.languages.java.ast.LabelStatement; import com.strobel.decompiler.languages.java.ast.LabeledStatement; import com.strobel.decompiler.languages.java.ast.LambdaExpression; import com.strobel.decompiler.languages.java.ast.LocalTypeDeclarationStatement; import com.strobel.decompiler.languages.java.ast.MemberReferenceExpression; import com.strobel.decompiler.languages.java.ast.MethodDeclaration; import com.strobel.decompiler.languages.java.ast.MethodGroupExpression; import com.strobel.decompiler.languages.java.ast.NewLineNode; import com.strobel.decompiler.languages.java.ast.NullReferenceExpression; import com.strobel.decompiler.languages.java.ast.ObjectCreationExpression; import com.strobel.decompiler.languages.java.ast.PackageDeclaration; import com.strobel.decompiler.languages.java.ast.ParameterDeclaration; import com.strobel.decompiler.languages.java.ast.ParenthesizedExpression; import com.strobel.decompiler.languages.java.ast.PrimitiveExpression; import com.strobel.decompiler.languages.java.ast.ReturnStatement; import com.strobel.decompiler.languages.java.ast.SimpleType; import com.strobel.decompiler.languages.java.ast.SuperReferenceExpression; import com.strobel.decompiler.languages.java.ast.SwitchSection; import com.strobel.decompiler.languages.java.ast.SwitchStatement; import com.strobel.decompiler.languages.java.ast.SynchronizedStatement; import com.strobel.decompiler.languages.java.ast.TextNode; import com.strobel.decompiler.languages.java.ast.ThisReferenceExpression; import com.strobel.decompiler.languages.java.ast.ThrowStatement; import com.strobel.decompiler.languages.java.ast.TryCatchStatement; import com.strobel.decompiler.languages.java.ast.TypeDeclaration; import com.strobel.decompiler.languages.java.ast.TypeParameterDeclaration; import com.strobel.decompiler.languages.java.ast.TypeReferenceExpression; import com.strobel.decompiler.languages.java.ast.UnaryOperatorExpression; import com.strobel.decompiler.languages.java.ast.VariableDeclarationStatement; import com.strobel.decompiler.languages.java.ast.VariableInitializer; import com.strobel.decompiler.languages.java.ast.WhileStatement; import com.strobel.decompiler.languages.java.ast.WildcardType; import com.strobel.decompiler.patterns.Pattern; import cuchaz.enigma.mapping.ClassEntry; public class SourceIndexVisitor implements IAstVisitor { @Override public Void visitTypeDeclaration(TypeDeclaration node, SourceIndex index) { TypeDefinition def = node.getUserData(Keys.TYPE_DEFINITION); ClassEntry classEntry = new ClassEntry(def.getInternalName()); index.addDeclaration(node.getNameToken(), classEntry); return node.acceptVisitor(new SourceIndexClassVisitor(classEntry), index); } protected Void recurse(AstNode node, SourceIndex index) { for (final AstNode child : node.getChildren()) { child.acceptVisitor(this, index); } return null; } @Override public Void visitMethodDeclaration(MethodDeclaration node, SourceIndex index) { return recurse(node, index); } @Override public Void visitConstructorDeclaration(ConstructorDeclaration node, SourceIndex index) { return recurse(node, index); } @Override public Void visitFieldDeclaration(FieldDeclaration node, SourceIndex index) { return recurse(node, index); } @Override public Void visitEnumValueDeclaration(EnumValueDeclaration node, SourceIndex index) { return recurse(node, index); } @Override public Void visitParameterDeclaration(ParameterDeclaration node, SourceIndex index) { return recurse(node, index); } @Override public Void visitInvocationExpression(InvocationExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitMemberReferenceExpression(MemberReferenceExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitSimpleType(SimpleType node, SourceIndex index) { return recurse(node, index); } @Override public Void visitIdentifierExpression(IdentifierExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitComment(Comment node, SourceIndex index) { return recurse(node, index); } @Override public Void visitPatternPlaceholder(AstNode node, Pattern pattern, SourceIndex index) { return recurse(node, index); } @Override public Void visitTypeReference(TypeReferenceExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitJavaTokenNode(JavaTokenNode node, SourceIndex index) { return recurse(node, index); } @Override public Void visitIdentifier(Identifier node, SourceIndex index) { return recurse(node, index); } @Override public Void visitNullReferenceExpression(NullReferenceExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitThisReferenceExpression(ThisReferenceExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitSuperReferenceExpression(SuperReferenceExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitClassOfExpression(ClassOfExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitBlockStatement(BlockStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitExpressionStatement(ExpressionStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitBreakStatement(BreakStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitContinueStatement(ContinueStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitDoWhileStatement(DoWhileStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitEmptyStatement(EmptyStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitIfElseStatement(IfElseStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitLabelStatement(LabelStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitLabeledStatement(LabeledStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitReturnStatement(ReturnStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitSwitchStatement(SwitchStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitSwitchSection(SwitchSection node, SourceIndex index) { return recurse(node, index); } @Override public Void visitCaseLabel(CaseLabel node, SourceIndex index) { return recurse(node, index); } @Override public Void visitThrowStatement(ThrowStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitCatchClause(CatchClause node, SourceIndex index) { return recurse(node, index); } @Override public Void visitAnnotation(Annotation node, SourceIndex index) { return recurse(node, index); } @Override public Void visitNewLine(NewLineNode node, SourceIndex index) { return recurse(node, index); } @Override public Void visitVariableDeclaration(VariableDeclarationStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitVariableInitializer(VariableInitializer node, SourceIndex index) { return recurse(node, index); } @Override public Void visitText(TextNode node, SourceIndex index) { return recurse(node, index); } @Override public Void visitImportDeclaration(ImportDeclaration node, SourceIndex index) { return recurse(node, index); } @Override public Void visitInitializerBlock(InstanceInitializer node, SourceIndex index) { return recurse(node, index); } @Override public Void visitTypeParameterDeclaration(TypeParameterDeclaration node, SourceIndex index) { return recurse(node, index); } @Override public Void visitCompilationUnit(CompilationUnit node, SourceIndex index) { return recurse(node, index); } @Override public Void visitPackageDeclaration(PackageDeclaration node, SourceIndex index) { return recurse(node, index); } @Override public Void visitArraySpecifier(ArraySpecifier node, SourceIndex index) { return recurse(node, index); } @Override public Void visitComposedType(ComposedType node, SourceIndex index) { return recurse(node, index); } @Override public Void visitWhileStatement(WhileStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitPrimitiveExpression(PrimitiveExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitCastExpression(CastExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitBinaryOperatorExpression(BinaryOperatorExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitInstanceOfExpression(InstanceOfExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitIndexerExpression(IndexerExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitUnaryOperatorExpression(UnaryOperatorExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitConditionalExpression(ConditionalExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitArrayInitializerExpression(ArrayInitializerExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitObjectCreationExpression(ObjectCreationExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitArrayCreationExpression(ArrayCreationExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitAssignmentExpression(AssignmentExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitForStatement(ForStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitForEachStatement(ForEachStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitTryCatchStatement(TryCatchStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitGotoStatement(GotoStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitParenthesizedExpression(ParenthesizedExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitSynchronizedStatement(SynchronizedStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitAnonymousObjectCreationExpression(AnonymousObjectCreationExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitWildcardType(WildcardType node, SourceIndex index) { return recurse(node, index); } @Override public Void visitMethodGroupExpression(MethodGroupExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitAssertStatement(AssertStatement node, SourceIndex index) { return recurse(node, index); } @Override public Void visitLambdaExpression(LambdaExpression node, SourceIndex index) { return recurse(node, index); } @Override public Void visitLocalTypeDeclarationStatement(LocalTypeDeclarationStatement node, SourceIndex index) { return recurse(node, index); } }