edu.cmu.cs.crystal.cfg.eclipse
Class EclipseCFG
java.lang.Object
org.eclipse.jdt.core.dom.ASTVisitor
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
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 |
EclipseCFG
public EclipseCFG(MethodDeclaration method)
EclipseCFG
public EclipseCFG()
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