org.tromer.jie
Class ContextualVisitor

java.lang.Object
  |
  +--org.tromer.jie.visitor.CallingDepthFirst
        |
        +--org.tromer.jie.ContextualVisitor

public class ContextualVisitor
extends CallingDepthFirst

Recursively visits a tree while maintaining context information. The context is held in instances of VisitContext, and includes information about the current package, type and method. This class is a descendant of CallingDepthFirst, so another visitor can be called for further processing. That visitor is called after the context has been updated for the current node.


Field Summary
protected  GenericStaticFilter filter
          Generic static filter used by this visitor to visit only interesting places.
 
Fields inherited from class org.tromer.jie.visitor.CallingDepthFirst
_callee, visitStopper
 
Method Summary
static java.lang.Object apply(CompilationUnit root, java.lang.String filename, GenericStaticFilter filter, ObjectVisitor payload)
          Applies a new ContextualVisitor to a compilation unit.
 java.lang.Object visit(AllocationExpression n, java.lang.Object argu)
          Visit allocation expression: if it includes an anonymous class declaration, update the context accordingly.
 java.lang.Object visit(ClassBody n, java.lang.Object argu)
          Visit class body: activate new class context (not for interfaces).
 java.lang.Object visit(ConstructorDeclaration n, java.lang.Object argu)
          Visit constructor declaration: save constructor data in context.
 java.lang.Object visit(FieldDeclaration n, java.lang.Object argu)
          Visit field declarator: update the context (some generic context parameters consider this a "method").
 java.lang.Object visit(Initializer n, java.lang.Object argu)
          Visit initializer (either static or instance): we treat this as a method, so update the context.
 java.lang.Object visit(MethodDeclaration n, java.lang.Object argu)
          Visit method declaration: save method data in context.
 java.lang.Object visit(NestedClassDeclaration n, java.lang.Object argu)
          Visit NestedClassDeclaration -- record whether it's "static".
 java.lang.Object visit(PackageDeclaration n, java.lang.Object argu)
          Visit package declaration: save package name in context.
 java.lang.Object visit(TypeDeclaration n, java.lang.Object argu)
          If we reached a type declaration before seeing a package declaration, then this compilation unit is in the unnamed package.
 java.lang.Object visit(UnmodifiedClassDeclaration n, java.lang.Object argu)
          Visit unmodified (named) class declaration: save class name in context.
 java.lang.Object visit(UnmodifiedInterfaceDeclaration n, java.lang.Object argu)
          Visit unmodified interface declaration: update context, since field initializers can include code that will be instrumented.
 
Methods inherited from class org.tromer.jie.visitor.CallingDepthFirst
visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit
 
Methods inherited from class java.lang.Object
, clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

filter

protected GenericStaticFilter filter
Generic static filter used by this visitor to visit only interesting places.
Method Detail

apply

public static java.lang.Object apply(CompilationUnit root,
                                     java.lang.String filename,
                                     GenericStaticFilter filter,
                                     ObjectVisitor payload)
Applies a new ContextualVisitor to a compilation unit. The payload object is called for every node. The generic filter is used every time the context changes to determine whether to descend into specific packages, types and methods. The filename is needed since it's a part of the context information.

visit

public java.lang.Object visit(PackageDeclaration n,
                              java.lang.Object argu)
Visit package declaration: save package name in context.
 nodeToken -> "package"
 name -> Name()
 nodeToken1 -> ";"
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(TypeDeclaration n,
                              java.lang.Object argu)
If we reached a type declaration before seeing a package declaration, then this compilation unit is in the unnamed package. Update the context accordingly.

In addition, apply package filtering.

 nodeChoice -> ClassDeclaration()
       | InterfaceDeclaration()
       | ";"
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(UnmodifiedClassDeclaration n,
                              java.lang.Object argu)
Visit unmodified (named) class declaration: save class name in context.
 nodeToken -> "class"
 nodeToken1 -> <IDENTIFIER>
 nodeOptional -> [ "extends" Name() ]
 nodeOptional1 -> [ "implements" NameList() ]
 classBody -> ClassBody()
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(AllocationExpression n,
                              java.lang.Object argu)
Visit allocation expression: if it includes an anonymous class declaration, update the context accordingly.
 nodeChoice -> "new" PrimitiveType() ArrayDimsAndInits()
       | "new" Name() ( ArrayDimsAndInits() | Arguments() [ ClassBody() ] )
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(ClassBody n,
                              java.lang.Object argu)
Visit class body: activate new class context (not for interfaces).

In addition, apply class filtering.

 nodeToken -> "{"
 nodeListOptional -> ( ClassBodyDeclaration() )*
 nodeToken1 -> "}"
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(NestedClassDeclaration n,
                              java.lang.Object argu)
Visit NestedClassDeclaration -- record whether it's "static".
 nodeListOptional -> ( "static" | "abstract" | "final" | "public" | "protected" | "private" | "strictfp" )*
 unmodifiedClassDeclaration -> UnmodifiedClassDeclaration()
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(UnmodifiedInterfaceDeclaration n,
                              java.lang.Object argu)
Visit unmodified interface declaration: update context, since field initializers can include code that will be instrumented. In addition, apply class filtering.
 nodeToken -> "interface"
 nodeToken1 -> <IDENTIFIER>
 nodeOptional -> [ "extends" NameList() ]
 nodeToken2 -> "{"
 nodeListOptional -> ( InterfaceMemberDeclaration() )*
 nodeToken3 -> "}"
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(MethodDeclaration n,
                              java.lang.Object argu)
Visit method declaration: save method data in context.
 nodeListOptional -> ( "public" | "protected" | "private" | "static" | "abstract" | "final" | "native" | "synchronized" )*
 resultType -> ResultType()
 methodDeclarator -> MethodDeclarator()
 nodeOptional -> [ "throws" NameList() ]
 nodeChoice -> ( TopBlock() | ";" )
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(ConstructorDeclaration n,
                              java.lang.Object argu)
Visit constructor declaration: save constructor data in context.
 nodeOptional -> [ "public" | "protected" | "private" ]
 nodeToken -> <IDENTIFIER>
 formalParameters -> FormalParameters()
 nodeOptional1 -> [ "throws" NameList() ]
 nodeToken1 -> "{"
 nodeOptional2 -> [ ExplicitConstructorInvocation() ]
 nodeListOptional -> ( TopBlockStatement() )*
 nodeToken2 -> "}"
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(Initializer n,
                              java.lang.Object argu)
Visit initializer (either static or instance): we treat this as a method, so update the context.
 nodeOptional -> [ "static" ]
 block -> Block()
 
Overrides:
visit in class CallingDepthFirst

visit

public java.lang.Object visit(FieldDeclaration n,
                              java.lang.Object argu)
Visit field declarator: update the context (some generic context parameters consider this a "method").
  nodeListOptional -> ( "public" | "protected" | "private" | "static" | "final" | "transient" | "volatile" )*
 type -> Type()
 variableDeclarator -> VariableDeclarator()
 nodeListOptional1 -> ( "," VariableDeclarator() )*
 nodeToken -> ";"
 
Overrides:
visit in class CallingDepthFirst