@Override public ControlFlowNode visitContinueStatement(final ContinueStatement node, final ControlFlowNode data) { if (!StringUtilities.isNullOrEmpty(node.getLabel())) { gotoStatements.add(data); return createEndNode(node); } if (!continueTargets.isEmpty()) { connect(data, continueTargets.peek(), ControlFlowEdgeType.Jump); } return createEndNode(node); }
@Override public ControlFlowNode visitForEachStatement(final ForEachStatement node, final ControlFlowNode data) { final ControlFlowNode end = createEndNode(node, false); final ControlFlowNode conditionNode = createSpecialNode(node, ControlFlowNodeType.LoopCondition); connect(data, conditionNode); breakTargets.push(end); continueTargets.push(conditionNode); final ControlFlowNode bodyEnd = handleEmbeddedStatement(node.getEmbeddedStatement(), conditionNode); connect(bodyEnd, conditionNode); breakTargets.pop(); continueTargets.pop(); connect(conditionNode, end); nodes.add(end); return end; }
@Override public ControlFlowNode visitContinueStatement(final ContinueStatement node, final ControlFlowNode data) { if (!StringUtilities.isNullOrEmpty(node.getLabel())) { gotoStatements.add(data); return createEndNode(node); } if (!continueTargets.isEmpty()) { connect(data, continueTargets.peek(), ControlFlowEdgeType.Jump); } return createEndNode(node); }
final ControlFlowNode handleStatementList(final AstNodeCollection<Statement> statements, final ControlFlowNode source) { ControlFlowNode childNode = null; for (final Statement statement : statements) { if (childNode == null) { childNode = createStartNode(statement); if (source != null) { connect(source, childNode); } } assert childNode.getNextStatement() == statement; childNode = statement.acceptVisitor(this, childNode); assert childNode.getPreviousStatement() == statement; } return childNode != null ? childNode : source; }
@Override public ControlFlowNode visitForEachStatement(final ForEachStatement node, final ControlFlowNode data) { final ControlFlowNode end = createEndNode(node, false); final ControlFlowNode conditionNode = createSpecialNode(node, ControlFlowNodeType.LoopCondition); connect(data, conditionNode); breakTargets.push(end); continueTargets.push(conditionNode); final ControlFlowNode bodyEnd = handleEmbeddedStatement(node.getEmbeddedStatement(), conditionNode); connect(bodyEnd, conditionNode); breakTargets.pop(); continueTargets.pop(); connect(conditionNode, end); nodes.add(end); return end; }
@Override public ControlFlowNode visitForEachStatement(final ForEachStatement node, final ControlFlowNode data) { final ControlFlowNode end = createEndNode(node, false); final ControlFlowNode conditionNode = createSpecialNode(node, ControlFlowNodeType.LoopCondition); connect(data, conditionNode); breakTargets.push(end); continueTargets.push(conditionNode); final ControlFlowNode bodyEnd = handleEmbeddedStatement(node.getEmbeddedStatement(), conditionNode); connect(bodyEnd, conditionNode); breakTargets.pop(); continueTargets.pop(); connect(conditionNode, end); nodes.add(end); return end; }
final ControlFlowEdge connect(final ControlFlowNode from, final ControlFlowNode to) { return connect(from, to, ControlFlowEdgeType.Normal); }
@Override public ControlFlowNode visitBreakStatement(final BreakStatement node, final ControlFlowNode data) { if (!StringUtilities.isNullOrEmpty(node.getLabel())) { gotoStatements.add(data); return createEndNode(node); } if (!breakTargets.isEmpty()) { connect(data, breakTargets.peek(), ControlFlowEdgeType.Jump); } return createEndNode(node); }
final ControlFlowNode handleEmbeddedStatement(final Statement embeddedStatement, final ControlFlowNode source) { if (embeddedStatement == null || embeddedStatement.isNull()) { return source; } final ControlFlowNode bodyStart = createStartNode(embeddedStatement); if (source != null) { connect(source, bodyStart); } return embeddedStatement.acceptVisitor(this, bodyStart); }
@Override public ControlFlowNode visitContinueStatement(final ContinueStatement node, final ControlFlowNode data) { if (!StringUtilities.isNullOrEmpty(node.getLabel())) { gotoStatements.add(data); return createEndNode(node); } if (!continueTargets.isEmpty()) { connect(data, continueTargets.peek(), ControlFlowEdgeType.Jump); } return createEndNode(node); }
final ControlFlowNode handleEmbeddedStatement(final Statement embeddedStatement, final ControlFlowNode source) { if (embeddedStatement == null || embeddedStatement.isNull()) { return source; } final ControlFlowNode bodyStart = createStartNode(embeddedStatement); if (source != null) { connect(source, bodyStart); } return embeddedStatement.acceptVisitor(this, bodyStart); }
final ControlFlowNode createConnectedEndNode(final Statement statement, final ControlFlowNode from) { final ControlFlowNode newNode = ControlFlowGraphBuilder.this.createEndNode(statement); connect(from, newNode); return newNode; }
@Override public ControlFlowNode visitLabeledStatement(final LabeledStatement node, final ControlFlowNode data) { final ControlFlowNode end = createConnectedEndNode(node, data); labels.put(node.getLabel(), end); connect(end, node.getStatement().acceptVisitor(this, data)); return end; }
@Override public ControlFlowNode visitBreakStatement(final BreakStatement node, final ControlFlowNode data) { if (!StringUtilities.isNullOrEmpty(node.getLabel())) { gotoStatements.add(data); return createEndNode(node); } if (!breakTargets.isEmpty()) { connect(data, breakTargets.peek(), ControlFlowEdgeType.Jump); } return createEndNode(node); }
final ControlFlowNode handleEmbeddedStatement(final Statement embeddedStatement, final ControlFlowNode source) { if (embeddedStatement == null || embeddedStatement.isNull()) { return source; } final ControlFlowNode bodyStart = createStartNode(embeddedStatement); if (source != null) { connect(source, bodyStart); } return embeddedStatement.acceptVisitor(this, bodyStart); }
@Override public ControlFlowNode visitLabeledStatement(final LabeledStatement node, final ControlFlowNode data) { final ControlFlowNode end = createConnectedEndNode(node, data); labels.put(node.getLabel(), end); connect(end, node.getStatement().acceptVisitor(this, data)); return end; }
final ControlFlowNode createConnectedEndNode(final Statement statement, final ControlFlowNode from) { final ControlFlowNode newNode = ControlFlowGraphBuilder.this.createEndNode(statement); connect(from, newNode); return newNode; }
@Override public ControlFlowNode visitBreakStatement(final BreakStatement node, final ControlFlowNode data) { if (!StringUtilities.isNullOrEmpty(node.getLabel())) { gotoStatements.add(data); return createEndNode(node); } if (!breakTargets.isEmpty()) { connect(data, breakTargets.peek(), ControlFlowEdgeType.Jump); } return createEndNode(node); }
final ControlFlowNode createConnectedEndNode(final Statement statement, final ControlFlowNode from) { final ControlFlowNode newNode = ControlFlowGraphBuilder.this.createEndNode(statement); connect(from, newNode); return newNode; }
@Override public ControlFlowNode visitLabeledStatement(final LabeledStatement node, final ControlFlowNode data) { final ControlFlowNode end = createConnectedEndNode(node, data); labels.put(node.getLabel(), end); connect(end, node.getStatement().acceptVisitor(this, data)); return end; }