@Override public ControlFlowNode visitReturnStatement(final ReturnStatement node, final ControlFlowNode data) { return createEndNode(node); }
protected ControlFlowNode createSpecialNode(final Statement statement, final ControlFlowNodeType type, final boolean addNodeToList) { final ControlFlowNode node = createNode(null, statement, type); if (addNodeToList) { nodes.add(node); } return node; }
protected ControlFlowNode createSpecialNode(final Statement statement, final ControlFlowNodeType type) { return createSpecialNode(statement, type, true); }
@Override public ControlFlowNode visitWhileStatement(final WhileStatement node, final ControlFlowNode data) { final ControlFlowNode end = createEndNode(node, false); final ControlFlowNode conditionNode = createSpecialNode(node, ControlFlowNodeType.LoopCondition); breakTargets.push(end); continueTargets.push(conditionNode); connect(data, conditionNode); final Boolean condition = evaluateCondition(node.getCondition()); final ControlFlowNode bodyStart = createStartNode(node.getEmbeddedStatement()); if (!Boolean.FALSE.equals(condition)) { connect(conditionNode, bodyStart, ControlFlowEdgeType.ConditionTrue); } final ControlFlowNode bodyEnd = node.getEmbeddedStatement().acceptVisitor(this, bodyStart); connect(bodyEnd, conditionNode); if (!Boolean.TRUE.equals(condition)) { connect(conditionNode, end, ControlFlowEdgeType.ConditionFalse); } breakTargets.pop(); continueTargets.pop(); nodes.add(end); return end; }
@Override public ControlFlowNode visitIfElseStatement(final IfElseStatement node, final ControlFlowNode data) { final Boolean condition = evaluateCondition(node.getCondition()); final ControlFlowNode trueBegin = createStartNode(node.getTrueStatement()); final ControlFlowNode falseBegin = createStartNode(node.getFalseStatement()); final ControlFlowNode end = 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 visitSwitchStatement(final SwitchStatement node, final ControlFlowNode data) { final ResolveResult constant = evaluateConstant(node.getExpression()); final ResolveResult labelConstant = evaluateConstant(label.getExpression()); final ControlFlowNode end = createEndNode(node, false);
this.resolver = resolver; final ControlFlowNode entryPoint = createStartNode(statement); annotateLeaveEdgesWithTryFinallyBlocks();
final ControlFlowGraphBuilder graphBuilder = new ControlFlowGraphBuilder(); final List<ControlFlowNode> nodes = graphBuilder.buildControlFlowGraph(node, new JavaResolver(context));
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 ControlFlowEdge connect(final ControlFlowNode from, final ControlFlowNode to, final ControlFlowEdgeType type) { final ControlFlowEdge edge = ControlFlowGraphBuilder.this.createEdge(from, to, type); from.getOutgoing().add(edge); to.getIncoming().add(edge); return edge; }
protected Boolean evaluateCondition(final Expression e) { final ResolveResult result = evaluateConstant(e); if (result != null && result.isCompileTimeConstant()) { final Object constantValue = result.getConstantValue(); if (constantValue instanceof Boolean) { return (Boolean) constantValue; } return null; } return null; }
final List<? extends DefiniteAssignmentNode> nodes = (List) builder.buildControlFlowGraph( (Statement) lambda.getBody(), resolver
@Override public ControlFlowNode visitDoWhileStatement(final DoWhileStatement node, final ControlFlowNode data) { final ControlFlowNode end = createEndNode(node, false); final ControlFlowNode conditionNode = createSpecialNode(node, ControlFlowNodeType.LoopCondition, false); breakTargets.push(end); continueTargets.push(conditionNode); final ControlFlowNode bodyStart = createStartNode(node.getEmbeddedStatement()); connect(data, bodyStart); final ControlFlowNode bodyEnd = node.getEmbeddedStatement().acceptVisitor(this, bodyStart); connect(bodyEnd, conditionNode); final Boolean condition = evaluateCondition(node.getCondition()); if (!Boolean.FALSE.equals(condition)) { connect(conditionNode, bodyStart, ControlFlowEdgeType.ConditionTrue); } if (!Boolean.TRUE.equals(condition)) { connect(conditionNode, end, ControlFlowEdgeType.ConditionFalse); } breakTargets.pop(); continueTargets.pop(); nodes.add(conditionNode); nodes.add(end); return end; }
@Override public ControlFlowNode visitIfElseStatement(final IfElseStatement node, final ControlFlowNode data) { final Boolean condition = evaluateCondition(node.getCondition()); final ControlFlowNode trueBegin = createStartNode(node.getTrueStatement()); final ControlFlowNode falseBegin = createStartNode(node.getFalseStatement()); final ControlFlowNode end = 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 visitSwitchStatement(final SwitchStatement node, final ControlFlowNode data) { final ResolveResult constant = evaluateConstant(node.getExpression()); final ResolveResult labelConstant = evaluateConstant(label.getExpression()); final ControlFlowNode end = createEndNode(node, false);
this.resolver = resolver; final ControlFlowNode entryPoint = createStartNode(statement); annotateLeaveEdgesWithTryFinallyBlocks();
final ControlFlowGraphBuilder graphBuilder = new ControlFlowGraphBuilder(); final List<ControlFlowNode> nodes = graphBuilder.buildControlFlowGraph(node, new JavaResolver(context));
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); }