package com.github.javaparser.ast.visitor; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.ImportDeclaration; import com.github.javaparser.ast.Node; import com.github.javaparser.ast.PackageDeclaration; import com.github.javaparser.ast.TypeParameter; import com.github.javaparser.ast.body.AnnotationDeclaration; import com.github.javaparser.ast.body.AnnotationMemberDeclaration; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.ConstructorDeclaration; import com.github.javaparser.ast.body.EmptyMemberDeclaration; import com.github.javaparser.ast.body.EmptyTypeDeclaration; import com.github.javaparser.ast.body.EnumConstantDeclaration; import com.github.javaparser.ast.body.EnumDeclaration; import com.github.javaparser.ast.body.FieldDeclaration; import com.github.javaparser.ast.body.InitializerDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.MultiTypeParameter; import com.github.javaparser.ast.body.Parameter; import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.body.VariableDeclaratorId; import com.github.javaparser.ast.comments.BlockComment; import com.github.javaparser.ast.comments.JavadocComment; import com.github.javaparser.ast.comments.LineComment; import com.github.javaparser.ast.expr.*; import com.github.javaparser.ast.stmt.AssertStmt; import com.github.javaparser.ast.stmt.BlockStmt; import com.github.javaparser.ast.stmt.BreakStmt; import com.github.javaparser.ast.stmt.CatchClause; import com.github.javaparser.ast.stmt.ContinueStmt; import com.github.javaparser.ast.stmt.DoStmt; import com.github.javaparser.ast.stmt.EmptyStmt; import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt; import com.github.javaparser.ast.stmt.ExpressionStmt; import com.github.javaparser.ast.stmt.ForStmt; import com.github.javaparser.ast.stmt.ForeachStmt; import com.github.javaparser.ast.stmt.IfStmt; import com.github.javaparser.ast.stmt.LabeledStmt; import com.github.javaparser.ast.stmt.ReturnStmt; import com.github.javaparser.ast.stmt.SwitchEntryStmt; import com.github.javaparser.ast.stmt.SwitchStmt; import com.github.javaparser.ast.stmt.SynchronizedStmt; import com.github.javaparser.ast.stmt.ThrowStmt; import com.github.javaparser.ast.stmt.TryStmt; import com.github.javaparser.ast.stmt.TypeDeclarationStmt; import com.github.javaparser.ast.stmt.WhileStmt; import com.github.javaparser.ast.type.ClassOrInterfaceType; import com.github.javaparser.ast.type.IntersectionType; import com.github.javaparser.ast.type.PrimitiveType; import com.github.javaparser.ast.type.ReferenceType; import com.github.javaparser.ast.type.UnionType; import com.github.javaparser.ast.type.UnknownType; import com.github.javaparser.ast.type.VoidType; import com.github.javaparser.ast.type.WildcardType; import xapi.collect.api.ClassTo; import xapi.fu.Filter; import xapi.fu.Filter.Filter1Unsafe; import static xapi.collect.X_Collect.newClassMap; import static xapi.fu.X_Fu.alwaysTrue; import java.lang.reflect.Method; /** * @author James X. Nelson (james@wetheinter.net) * Created on 4/17/16. */ public class DelegatingVisitor <T, C extends DelegatingVisitor.Context<T>> extends GenericVisitorAdapter<Boolean, C> { protected Filter<Node> filter; protected final ClassTo<Filter1Unsafe<Node>> nodeFilter; private C context; public DelegatingVisitor() { this(alwaysTrue()); } public DelegatingVisitor(Filter<Node> filter) { nodeFilter = newClassMap(Filter1Unsafe.class); this.filter = filter; } public DelegatingVisitor(VoidVisitor<C> delegate) { this(); for (Method method : VoidVisitor.class.getMethods()) { if (method.getName().equals("visit")) { final Class<?> type = method.getParameterTypes()[0]; nodeFilter.put(type, node->{ method.invoke(delegate, node); return true; }); } } } public C getContext() { return context; } public void setContext(C context) { this.context = context; } public DelegatingVisitor<T, C> withContext(C context) { setContext(context); return this; } public static class Context <T> { private T value; public T getValue() { return value; } public void setValue(T value) { this.value = value; } } @Override public Boolean visit( CompilationUnit n, C ctx ) { if (checkNodeFilter(CompilationUnit.class, n)) { if (filter.filter(n)) { super.visit(n, ctx); return true; } } return false; } private boolean checkNodeFilter(Class<? extends Node> cls, Node n) { if (nodeFilter.containsKey(cls)) { return nodeFilter.get(cls).filter1(n); } return true; } @Override public Boolean visit( PackageDeclaration n, C ctx ) { return null; } @Override public Boolean visit( ImportDeclaration n, C ctx ) { return null; } @Override public Boolean visit( TypeParameter n, C ctx ) { return null; } @Override public Boolean visit( LineComment n, C ctx ) { return null; } @Override public Boolean visit( BlockComment n, C ctx ) { return null; } @Override public Boolean visit( ClassOrInterfaceDeclaration n, C ctx ) { return null; } @Override public Boolean visit( EnumDeclaration n, C ctx ) { return null; } @Override public Boolean visit( EmptyTypeDeclaration n, C ctx ) { return null; } @Override public Boolean visit( EnumConstantDeclaration n, C ctx ) { return null; } @Override public Boolean visit( AnnotationDeclaration n, C ctx ) { return null; } @Override public Boolean visit( AnnotationMemberDeclaration n, C ctx ) { return null; } @Override public Boolean visit( FieldDeclaration n, C ctx ) { return null; } @Override public Boolean visit( VariableDeclarator n, C ctx ) { return null; } @Override public Boolean visit( VariableDeclaratorId n, C ctx ) { return null; } @Override public Boolean visit( ConstructorDeclaration n, C ctx ) { return null; } @Override public Boolean visit( MethodDeclaration n, C ctx ) { return null; } @Override public Boolean visit( Parameter n, C ctx ) { return null; } @Override public Boolean visit( MultiTypeParameter n, C ctx ) { return null; } @Override public Boolean visit( EmptyMemberDeclaration n, C ctx ) { return null; } @Override public Boolean visit( InitializerDeclaration n, C ctx ) { return null; } @Override public Boolean visit( JavadocComment n, C ctx ) { return null; } @Override public Boolean visit( ClassOrInterfaceType n, C ctx ) { return null; } @Override public Boolean visit( PrimitiveType n, C ctx ) { return null; } @Override public Boolean visit( ReferenceType n, C ctx ) { return null; } @Override public Boolean visit( IntersectionType n, C ctx ) { return null; } @Override public Boolean visit( UnionType n, C ctx ) { return null; } @Override public Boolean visit( VoidType n, C ctx ) { return null; } @Override public Boolean visit( WildcardType n, C ctx ) { return null; } @Override public Boolean visit( UnknownType n, C ctx ) { return null; } @Override public Boolean visit( ArrayAccessExpr n, C ctx ) { return null; } @Override public Boolean visit( ArrayCreationExpr n, C ctx ) { return null; } @Override public Boolean visit( ArrayInitializerExpr n, C ctx ) { return null; } @Override public Boolean visit( AssignExpr n, C ctx ) { return null; } @Override public Boolean visit( BinaryExpr n, C ctx ) { return null; } @Override public Boolean visit( CastExpr n, C ctx ) { return null; } @Override public Boolean visit( ClassExpr n, C ctx ) { return null; } @Override public Boolean visit( ConditionalExpr n, C ctx ) { return null; } @Override public Boolean visit( EnclosedExpr n, C ctx ) { return null; } @Override public Boolean visit( FieldAccessExpr n, C ctx ) { return null; } @Override public Boolean visit( InstanceOfExpr n, C ctx ) { return null; } @Override public Boolean visit( StringLiteralExpr n, C ctx ) { return null; } @Override public Boolean visit( TemplateLiteralExpr n, C ctx ) { return null; } @Override public Boolean visit( UiBodyExpr n, C ctx ) { return null; } @Override public Boolean visit( IntegerLiteralExpr n, C ctx ) { return null; } @Override public Boolean visit( LongLiteralExpr n, C ctx ) { return null; } @Override public Boolean visit( IntegerLiteralMinValueExpr n, C ctx ) { return null; } @Override public Boolean visit( LongLiteralMinValueExpr n, C ctx ) { return null; } @Override public Boolean visit( CharLiteralExpr n, C ctx ) { return null; } @Override public Boolean visit( DoubleLiteralExpr n, C ctx ) { return null; } @Override public Boolean visit( BooleanLiteralExpr n, C ctx ) { return null; } @Override public Boolean visit( NullLiteralExpr n, C ctx ) { return null; } @Override public Boolean visit( MethodCallExpr n, C ctx ) { return null; } @Override public Boolean visit( NameExpr n, C ctx ) { return null; } @Override public Boolean visit( ObjectCreationExpr n, C ctx ) { return null; } @Override public Boolean visit(QualifiedNameExpr n, C ctx) { return null; } @Override public Boolean visit(ThisExpr n, C ctx) { return null; } @Override public Boolean visit(SuperExpr n, C ctx) { return null; } @Override public Boolean visit(UnaryExpr n, C ctx) { return null; } @Override public Boolean visit(VariableDeclarationExpr n, C ctx) { return null; } @Override public Boolean visit(MarkerAnnotationExpr n, C ctx) { return null; } @Override public Boolean visit(SingleMemberAnnotationExpr n, C ctx) { return null; } @Override public Boolean visit(NormalAnnotationExpr n, C ctx) { return null; } @Override public Boolean visit(MemberValuePair n, C ctx) { return null; } @Override public Boolean visit( ExplicitConstructorInvocationStmt n, C ctx ) { return null; } @Override public Boolean visit( TypeDeclarationStmt n, C ctx ) { return null; } @Override public Boolean visit( AssertStmt n, C ctx ) { return null; } @Override public Boolean visit( BlockStmt n, C ctx ) { return null; } @Override public Boolean visit( LabeledStmt n, C ctx ) { return null; } @Override public Boolean visit( EmptyStmt n, C ctx ) { return null; } @Override public Boolean visit( ExpressionStmt n, C ctx ) { return null; } @Override public Boolean visit( SwitchStmt n, C ctx ) { return null; } @Override public Boolean visit( SwitchEntryStmt n, C ctx ) { return null; } @Override public Boolean visit( BreakStmt n, C ctx ) { return null; } @Override public Boolean visit( ReturnStmt n, C ctx ) { return null; } @Override public Boolean visit( IfStmt n, C ctx ) { return null; } @Override public Boolean visit( WhileStmt n, C ctx ) { return null; } @Override public Boolean visit( ContinueStmt n, C ctx ) { return null; } @Override public Boolean visit( DoStmt n, C ctx ) { return null; } @Override public Boolean visit( ForeachStmt n, C ctx ) { return null; } @Override public Boolean visit( ForStmt n, C ctx ) { return null; } @Override public Boolean visit( ThrowStmt n, C ctx ) { return null; } @Override public Boolean visit( SynchronizedStmt n, C ctx ) { return null; } @Override public Boolean visit( TryStmt n, C ctx ) { return null; } @Override public Boolean visit( CatchClause n, C ctx ) { return null; } @Override public Boolean visit(LambdaExpr n, C ctx) { return null; } @Override public Boolean visit(MethodReferenceExpr n, C ctx) { return null; } @Override public Boolean visit(TypeExpr n, C ctx) { return null; } @Override public Boolean visit(UiAttrExpr n, C ctx) { return null; } @Override public Boolean visit(UiContainerExpr n, C ctx) { return null; } }