use of org.eclipse.n4js.flowgraphs.model.Node in project n4js by eclipse.
the class GraphVisitorGuideInternal method walkthrough.
private void walkthrough(ComplexNode cn, NextEdgesProvider edgeProvider) {
List<BranchWalkerInternal> activatedPaths = initVisit();
guideWorklist.initialize(cn, edgeProvider, activatedPaths);
Node lastVisitNode = null;
for (EdgeGuide currEdgeGuide : guideWorklist.getCurrentEdgeGuides()) {
Node visitNode = currEdgeGuide.getPrevNode();
visitNode(lastVisitNode, currEdgeGuide, visitNode);
lastVisitNode = visitNode;
}
while (guideWorklist.hasNext()) {
flowAnalyzer.checkCancelled();
EdgeGuide currEdgeGuide = guideWorklist.next();
Node visitNode = currEdgeGuide.getNextNode();
visitNode(lastVisitNode, currEdgeGuide, visitNode);
lastVisitNode = visitNode;
mergeEdgeGuides();
}
}
use of org.eclipse.n4js.flowgraphs.model.Node in project n4js by eclipse.
the class BinaryLogicalExpressionFactory method buildComplexNode.
static ComplexNode buildComplexNode(ReentrantASTIterator astpp, BinaryLogicalExpression lbExpr) {
ComplexNode cNode = new ComplexNode(astpp.container(), lbExpr);
HelperNode entryNode = new HelperNode(NodeNames.ENTRY, astpp.pos(), lbExpr);
Node lhsNode = DelegatingNodeFactory.createOrHelper(astpp, NodeNames.LHS, lbExpr, lbExpr.getLhs());
Node scJumpNode = new HelperNode(NodeNames.SHORT_CIRCUIT_JUMP, astpp.pos(), lbExpr);
Node rhsNode = DelegatingNodeFactory.createOrHelper(astpp, NodeNames.RHS, lbExpr, lbExpr.getRhs());
Node exitNode = new RepresentingNode(NodeNames.EXIT, astpp.pos(), lbExpr);
cNode.addNode(entryNode);
cNode.addNode(lhsNode);
cNode.addNode(scJumpNode);
cNode.addNode(rhsNode);
cNode.addNode(exitNode);
ControlFlowType thenCFT = null;
ControlFlowType elseCFT = null;
switch(lbExpr.getOp()) {
case OR:
thenCFT = ControlFlowType.IfFalse;
elseCFT = ControlFlowType.IfTrue;
break;
case AND:
thenCFT = ControlFlowType.IfTrue;
elseCFT = ControlFlowType.IfFalse;
break;
}
cNode.connectInternalSucc(entryNode, lhsNode, scJumpNode);
cNode.connectInternalSucc(thenCFT, scJumpNode, rhsNode);
cNode.connectInternalSucc(rhsNode, exitNode);
// short-circuit evaluation
scJumpNode.addJumpToken(new JumpToken(elseCFT));
cNode.setJumpNode(scJumpNode);
cNode.setEntryNode(entryNode);
cNode.setExitNode(exitNode);
rhsNode.addCatchToken(new CatchToken(thenCFT));
boolean isCatchingLhs = isTopJumpCatcher(lbExpr);
if (isCatchingLhs) {
exitNode.addCatchToken(new CatchToken(elseCFT));
exitNode.addCatchToken(new CatchToken(thenCFT));
} else {
// TODO: minor improvement: add the following jump node
// exitNode.addJumpToken(new JumpToken(thenCFT)); // short-circuit evaluation
// cNode.setJumpNode(scJumpNode);
}
return cNode;
}
use of org.eclipse.n4js.flowgraphs.model.Node in project n4js by eclipse.
the class AbstractCaseClauseFactory method buildComplexNode.
static ComplexNode buildComplexNode(ReentrantASTIterator astpp, AbstractCaseClause abstrCaseClause) {
ComplexNode cNode = new ComplexNode(astpp.container(), abstrCaseClause);
Node entryNode = new HelperNode(NodeNames.ENTRY, astpp.pos(), abstrCaseClause);
List<Node> stmtNodes = new LinkedList<>();
Node caseConditionNode = null;
if (abstrCaseClause instanceof CaseClause) {
CaseClause caseClause = (CaseClause) abstrCaseClause;
caseConditionNode = DelegatingNodeFactory.create(astpp, NodeNames.CONDITION, caseClause, caseClause.getExpression());
}
EList<Statement> stmts = abstrCaseClause.getStatements();
for (int i = 0; i < stmts.size(); i++) {
Statement stmt = stmts.get(i);
Node blockNode = new DelegatingNode("stmt_" + i, astpp.pos(), abstrCaseClause, stmt);
stmtNodes.add(blockNode);
astpp.visitUtil(blockNode.getDelegatedControlFlowElement());
}
Node exitNode = new HelperNode(NodeNames.EXIT, astpp.pos(), abstrCaseClause);
cNode.addNode(entryNode);
cNode.addNode(caseConditionNode);
for (Node blockNode : stmtNodes) cNode.addNode(blockNode);
cNode.addNode(exitNode);
List<Node> nodes = new LinkedList<>();
nodes.add(entryNode);
nodes.add(caseConditionNode);
nodes.addAll(stmtNodes);
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 BlockFactory method buildComplexNode.
static ComplexNode buildComplexNode(ReentrantASTIterator astpp, org.eclipse.n4js.n4JS.Block block) {
ComplexNode cNode = new ComplexNode(astpp.container(), block);
Node entryNode = new HelperNode(NodeNames.ENTRY, astpp.pos(), block);
List<Node> blockNodes = new LinkedList<>();
EList<Statement> stmts = block.getStatements();
for (int i = 0; i < stmts.size(); i++) {
Statement stmt = stmts.get(i);
Node blockNode = DelegatingNodeFactory.create(astpp, "stmt_" + i, block, stmt);
blockNodes.add(blockNode);
}
Node exitNode = new HelperNode(NodeNames.EXIT, astpp.pos(), block);
cNode.addNode(entryNode);
for (Node blockNode : blockNodes) cNode.addNode(blockNode);
cNode.addNode(exitNode);
List<Node> nodes = new LinkedList<>();
nodes.add(entryNode);
nodes.addAll(blockNodes);
nodes.add(exitNode);
cNode.connectInternalSucc(nodes);
cNode.setEntryNode(entryNode);
cNode.setExitNode(exitNode);
if (FGUtils.isCFContainer(block)) {
exitNode.addCatchToken(new CatchToken(ControlFlowType.CatchesAll));
} else {
LabelledStatement lblStmt = ASTUtils.getLabelledStatement(block);
if (lblStmt != null) {
exitNode.addCatchToken(new CatchToken(ControlFlowType.Break, lblStmt));
}
}
return cNode;
}
use of org.eclipse.n4js.flowgraphs.model.Node in project n4js by eclipse.
the class CatchNodeFinder method find.
/**
* @return the node to which the given {@code jumpNode} jumps via the given {@link JumpToken}. Can return null.
*/
static Pair<Node, ControlFlowType> find(JumpToken jumpToken, Node jumpNode, ComplexNodeMapper cnMapper) {
CatchEvaluator catchEvaluator = getCatchEvaluator(jumpToken);
ControlFlowElement cfe = jumpNode.getControlFlowElement();
cfe = skipContainers(cfe);
ControlFlowElement lastCFE = null;
while (cfe != null) {
Pair<Node, ControlFlowType> catcher = findCatchNode(jumpToken, cfe, lastCFE, catchEvaluator, cnMapper);
if (catcher != null)
return catcher;
lastCFE = cfe;
cfe = getContainer(cfe);
}
return null;
}
Aggregations