use of org.eclipse.n4js.flowgraphs.model.Node in project n4js by eclipse.
the class VariableStatementFactory method buildComplexNode.
static ComplexNode buildComplexNode(ReentrantASTIterator astpp, VariableStatement varDeclStmt) {
ComplexNode cNode = new ComplexNode(astpp.container(), varDeclStmt);
Node entryNode = new HelperNode(NodeNames.ENTRY, astpp.pos(), varDeclStmt);
List<Node> varDeclNodes = new LinkedList<>();
for (int n = 0; n < varDeclStmt.getVarDeclsOrBindings().size(); n++) {
VariableDeclarationOrBinding varDOB = varDeclStmt.getVarDeclsOrBindings().get(n);
Node varDeclNode = DelegatingNodeFactory.create(astpp, "declaration_" + n, varDeclStmt, varDOB);
varDeclNodes.add(varDeclNode);
}
Node exitNode = new RepresentingNode(NodeNames.EXIT, astpp.pos(), varDeclStmt);
cNode.addNode(entryNode);
for (Node varDeclNode : varDeclNodes) cNode.addNode(varDeclNode);
cNode.addNode(exitNode);
List<Node> nodes = new LinkedList<>();
nodes.add(entryNode);
nodes.addAll(varDeclNodes);
nodes.add(exitNode);
cNode.connectInternalSucc(nodes);
cNode.setEntryNode(entryNode);
cNode.setExitNode(exitNode);
return cNode;
}
use of org.eclipse.n4js.flowgraphs.model.Node in project n4js by eclipse.
the class WithFactory method buildComplexNode.
static ComplexNode buildComplexNode(ReentrantASTIterator astpp, WithStatement withStmt) {
ComplexNode cNode = new ComplexNode(astpp.container(), withStmt);
Node entryNode = new HelperNode(NodeNames.ENTRY, astpp.pos(), withStmt);
Node expressionNode = DelegatingNodeFactory.create(astpp, NodeNames.EXPRESSION, withStmt, withStmt.getExpression());
Node statementNode = DelegatingNodeFactory.create(astpp, NodeNames.STATEMENT, withStmt, withStmt.getStatement());
Node exitNode = new HelperNode(NodeNames.EXIT, astpp.pos(), withStmt);
cNode.addNode(entryNode);
cNode.addNode(expressionNode);
cNode.addNode(statementNode);
cNode.addNode(exitNode);
List<Node> nodes = new LinkedList<>();
nodes.add(entryNode);
nodes.add(expressionNode);
nodes.add(statementNode);
nodes.add(exitNode);
cNode.connectInternalSucc(nodes);
cNode.setEntryNode(entryNode);
cNode.setExitNode(exitNode);
return cNode;
}
use of org.eclipse.n4js.flowgraphs.model.Node in project n4js by eclipse.
the class WhileFactory method buildComplexNode.
static ComplexNode buildComplexNode(ReentrantASTIterator astpp, WhileStatement whileStmt) {
ComplexNode cNode = new ComplexNode(astpp.container(), whileStmt);
Node entryNode = new HelperNode(NodeNames.ENTRY, astpp.pos(), whileStmt);
Node conditionNode = DelegatingNodeFactory.createOrHelper(astpp, NodeNames.CONDITION, whileStmt, whileStmt.getExpression());
Node conditionForkNode = new HelperNode(NodeNames.CONDITION_FORK, astpp.pos(), whileStmt);
Node bodyNode = DelegatingNodeFactory.createOrHelper(astpp, NodeNames.BODY, whileStmt, whileStmt.getStatement());
Node continueCatchNode = new HelperNode(NodeNames.CONTINUE_CATCH, astpp.pos(), whileStmt);
Node exitNode = new HelperNode(NodeNames.EXIT, astpp.pos(), whileStmt);
cNode.addNode(entryNode);
cNode.addNode(conditionNode);
cNode.addNode(conditionForkNode);
cNode.addNode(bodyNode);
cNode.addNode(continueCatchNode);
cNode.addNode(exitNode);
cNode.connectInternalSucc(entryNode, conditionNode, conditionForkNode);
cNode.connectInternalSucc(ControlFlowType.LoopEnter, conditionForkNode, bodyNode);
cNode.connectInternalSucc(ControlFlowType.LoopExit, conditionForkNode, exitNode);
cNode.connectInternalSucc(bodyNode, continueCatchNode);
cNode.connectInternalSucc(ControlFlowType.LoopRepeat, continueCatchNode, conditionNode);
cNode.setEntryNode(entryNode);
cNode.setExitNode(exitNode);
// catch for short-circuits
conditionForkNode.addCatchToken(new CatchToken(ControlFlowType.IfTrue));
exitNode.addCatchToken(new CatchToken(ControlFlowType.IfFalse, ControlFlowType.LoopExit));
LabelledStatement lblStmt = ASTUtils.getLabelledStatement(whileStmt);
exitNode.addCatchToken(new CatchToken(ControlFlowType.Break, lblStmt));
continueCatchNode.addCatchToken(new CatchToken(ControlFlowType.Continue, lblStmt));
return cNode;
}
use of org.eclipse.n4js.flowgraphs.model.Node in project n4js by eclipse.
the class SuccessorPredecessorAnalysis method getSuccessorsSkipInternal.
/**
* see {@link N4JSFlowAnalyser#getSuccessorsSkipInternal(ControlFlowElement)}
*/
public Set<ControlFlowElement> getSuccessorsSkipInternal(ControlFlowElement cfe) {
NextEdgesProvider nextEdgesProvider = new NextEdgesProvider.Forward();
Node nextNode = getNextNode(cfe, true, nextEdgesProvider);
Set<ControlFlowElement> successors = getNextCFEs(nextEdgesProvider, cfe, nextNode);
return successors;
}
use of org.eclipse.n4js.flowgraphs.model.Node in project n4js by eclipse.
the class SuccessorPredecessorAnalysis method getSuccessors.
/**
* see {@link N4JSFlowAnalyser#getSuccessors(ControlFlowElement)}
*/
public Set<ControlFlowElement> getSuccessors(ControlFlowElement cfe) {
NextEdgesProvider nextEdgesProvider = new NextEdgesProvider.Forward();
Node nextNode = getNextNode(cfe, false, nextEdgesProvider);
Set<ControlFlowElement> successors = getNextCFEs(nextEdgesProvider, cfe, nextNode);
return successors;
}
Aggregations