edu.cmu.cs.crystal.cfg.eclipse
Class EclipseCFG

java.lang.Object
  extended by org.eclipse.jdt.core.dom.ASTVisitor
      extended by edu.cmu.cs.crystal.cfg.eclipse.EclipseCFG
All Implemented Interfaces:
IControlFlowGraph<ASTNode>, Cloneable
Direct Known Subclasses:
EclipseNodeFirstCFG

public class EclipseCFG
extends ASTVisitor
implements IControlFlowGraph<ASTNode>, Cloneable

Builds a CFG on the Eclipse AST. This class has been tested at the method level only, it has not been tested at higher or lower levels, though it would theoretically work. There is an interesting problem regarding when the transfer function for a node appears if it is a control flow statement. That is, when does the transfer statement for constructs like if and while occur? We have produced three possibilities: Kevin: Should appear at the point when the branching of control flow occurs. For example, the the conditionals of if and while. Nels: Should appear at the merge point of the control flow. This is the conditional for while, and the node that merges the two if branches. Ciera: Should appear after all the children have been visited. This is the merge point on if, and it is the node after the conditional on while. Then we decided that no one in their right mind should be using transfer functions on control flow anyway, so we can do whatever we want. Since I'm writing this and I have a nice design for the third option anyway, we're going with that. Note: Since this was written someone (Thomas? Nels?) did need to transfer on the control flow. He needed it at the merge point though. The subtype @link{EclipseNodeFirstCFG} handles that, and is currently the default control flow graph used in Crystal. Algorithm description: This class visits each node of the AST. When it visits a node, it maps the ASTNode to the CFGNode that it is creating. This allows a parent node to pull it out later and insert it into the graph. There are several other data structures to help us with control flow. These are described individually later. - In the previsit method, we create the node and put it in the map. - In the visit method, we prepare any data structures that will be needed by the children. - In the endvisit method, we put together the CFG for this node and its children (with the exception of any edges that were added by children through the data structures.

Author:
ciera

Constructor Summary
EclipseCFG()
           
EclipseCFG(MethodDeclaration method)
           
 
Method Summary
 void createGraph(MethodDeclaration method)
           
 void endVisit(ArrayAccess node)
           
 void endVisit(ArrayCreation node)
           
 void endVisit(ArrayInitializer node)
           
 void endVisit(ArrayType node)
          TYPES *
 void endVisit(AssertStatement node)
           
 void endVisit(Assignment node)
           
 void endVisit(Block node)
           
 void endVisit(BooleanLiteral node)
           
 void endVisit(BreakStatement node)
           
 void endVisit(CastExpression node)
           
 void endVisit(CatchClause node)
           
 void endVisit(CharacterLiteral node)
           
 void endVisit(ClassInstanceCreation node)
           
 void endVisit(ConditionalExpression node)
           
 void endVisit(ConstructorInvocation node)
           
 void endVisit(ContinueStatement node)
           
 void endVisit(DoStatement node)
           
 void endVisit(EnhancedForStatement node)
           
 void endVisit(ExpressionStatement node)
           
 void endVisit(FieldAccess node)
           
 void endVisit(ForStatement node)
           
 void endVisit(IfStatement node)
           
 void endVisit(InfixExpression node)
           
 void endVisit(InstanceofExpression node)
           
 void endVisit(LabeledStatement node)
           
 void endVisit(MethodDeclaration node)
           
 void endVisit(MethodInvocation node)
           
 void endVisit(NullLiteral node)
           
 void endVisit(NumberLiteral node)
           
 void endVisit(ParameterizedType node)
           
 void endVisit(ParenthesizedExpression node)
           
 void endVisit(PostfixExpression node)
           
 void endVisit(PrefixExpression node)
           
 void endVisit(PrimitiveType node)
           
 void endVisit(QualifiedName node)
           
 void endVisit(QualifiedType node)
           
 void endVisit(ReturnStatement node)
           
 void endVisit(SimpleName node)
           
 void endVisit(SimpleType node)
           
 void endVisit(SingleVariableDeclaration node)
           
 void endVisit(StringLiteral node)
           
 void endVisit(SuperConstructorInvocation node)
           
 void endVisit(SuperFieldAccess node)
           
 void endVisit(SuperMethodInvocation node)
           
 void endVisit(SwitchCase node)
           
 void endVisit(SwitchStatement node)
           
 void endVisit(SynchronizedStatement node)
           
 void endVisit(ThisExpression node)
           
 void endVisit(ThrowStatement node)
           
 void endVisit(TypeLiteral node)
           
 void endVisit(VariableDeclarationExpression node)
           
 void endVisit(VariableDeclarationFragment node)
           
 void endVisit(VariableDeclarationStatement node)
           
 void endVisit(WhileStatement node)
           
 void endVisit(WildcardType node)
           
 att.grappa.Graph getDotGraph()
           
 ICFGNode<ASTNode> getEndNode()
           
 Map<ITypeBinding,EclipseCFGNode> getExceptionalExits()
           
 ICFGNode<ASTNode> getStartNode()
           
 ICFGNode<ASTNode> getUberReturn()
           
 ICFGNode<ASTNode> getUndeclaredExit()
           
 void preVisit(ASTNode node)
           
 boolean visit(AnonymousClassDeclaration node)
           
 boolean visit(Block node)
           
 boolean visit(BreakStatement node)
           
 boolean visit(CatchClause node)
           
 boolean visit(DoStatement node)
           
 boolean visit(EnhancedForStatement node)
           
 boolean visit(ForStatement node)
           
 boolean visit(IfStatement node)
           
 boolean visit(LabeledStatement node)
           
 boolean visit(MethodDeclaration node)
           
 boolean visit(SwitchStatement node)
           
 boolean visit(TryStatement node)
           
 boolean visit(TypeDeclarationStatement node)
           
 boolean visit(WhileStatement node)
           
 
Methods inherited from class org.eclipse.jdt.core.dom.ASTVisitor
endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, endVisit, postVisit, preVisit2, 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
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

EclipseCFG

public EclipseCFG(MethodDeclaration method)

EclipseCFG

public EclipseCFG()
Method Detail

createGraph

public void createGraph(MethodDeclaration method)

getStartNode

public ICFGNode<ASTNode> getStartNode()
Specified by:
getStartNode in interface IControlFlowGraph<ASTNode>

getEndNode

public ICFGNode<ASTNode> getEndNode()
Specified by:
getEndNode in interface IControlFlowGraph<ASTNode>

getUberReturn

public ICFGNode<ASTNode> getUberReturn()
Specified by:
getUberReturn in interface IControlFlowGraph<ASTNode>

getUndeclaredExit

public ICFGNode<ASTNode> getUndeclaredExit()
Specified by:
getUndeclaredExit in interface IControlFlowGraph<ASTNode>

getExceptionalExits

public Map<ITypeBinding,EclipseCFGNode> getExceptionalExits()
Specified by:
getExceptionalExits in interface IControlFlowGraph<ASTNode>

getDotGraph

public att.grappa.Graph getDotGraph()
Specified by:
getDotGraph in interface IControlFlowGraph<ASTNode>

preVisit

public void preVisit(ASTNode node)
Overrides:
preVisit in class ASTVisitor

endVisit

public void endVisit(AssertStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(BreakStatement node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(BreakStatement node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ContinueStatement node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ConditionalExpression node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(DoStatement node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(DoStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(EnhancedForStatement node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(EnhancedForStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(ForStatement node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(ForStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(LabeledStatement node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(LabeledStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(IfStatement node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(IfStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(MethodDeclaration node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(MethodDeclaration node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ReturnStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(SwitchStatement node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(SwitchStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(CatchClause node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(CatchClause node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ThrowStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(TryStatement node)
Overrides:
visit in class ASTVisitor

visit

public boolean visit(WhileStatement node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(WhileStatement node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(Block node)
Overrides:
visit in class ASTVisitor

endVisit

public void endVisit(Block node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ExpressionStatement node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ParenthesizedExpression node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(SwitchCase node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(SynchronizedStatement node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(VariableDeclarationExpression node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(VariableDeclarationFragment node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(VariableDeclarationStatement node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(SingleVariableDeclaration node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ArrayAccess node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ArrayCreation node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ArrayInitializer node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(Assignment node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(CastExpression node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ConstructorInvocation node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(FieldAccess node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(InfixExpression node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(InstanceofExpression node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ClassInstanceCreation node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(MethodInvocation node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(PostfixExpression node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(PrefixExpression node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(QualifiedName node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(SuperConstructorInvocation node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(SuperFieldAccess node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(SuperMethodInvocation node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(StringLiteral node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ThisExpression node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(SimpleName node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(NullLiteral node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(NumberLiteral node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(TypeLiteral node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(CharacterLiteral node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(BooleanLiteral node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ArrayType node)
TYPES *

Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(ParameterizedType node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(PrimitiveType node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(QualifiedType node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(SimpleType node)
Overrides:
endVisit in class ASTVisitor

endVisit

public void endVisit(WildcardType node)
Overrides:
endVisit in class ASTVisitor

visit

public boolean visit(TypeDeclarationStatement node)
Overrides:
visit in class ASTVisitor

visit

public boolean visit(AnonymousClassDeclaration node)
Overrides:
visit in class ASTVisitor