Skip to content
CFGGraph.java 1.99 KiB
Newer Older
Javier Costa's avatar
Javier Costa committed
package tfm.graphs;
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
import com.github.javaparser.ast.Node;
Javier Costa's avatar
Javier Costa committed
import com.github.javaparser.ast.stmt.EmptyStmt;
import com.github.javaparser.ast.stmt.Statement;
Javier Costa's avatar
Javier Costa committed
import edg.graphlib.Arrow;
Javier Costa's avatar
Javier Costa committed
import tfm.arcs.Arc;
Javier Costa's avatar
Javier Costa committed
import tfm.arcs.cfg.ControlFlowArc;
Javier Costa's avatar
Javier Costa committed
import tfm.nodes.CFGNode;
Javier Costa's avatar
Javier Costa committed
import tfm.nodes.GraphNode;
Javier Costa's avatar
Javier Costa committed
import tfm.slicing.SlicingCriterion;
Javier Costa's avatar
Javier Costa committed

import java.util.Comparator;
import java.util.stream.Collectors;
Javier Costa's avatar
Javier Costa committed

Javier Costa's avatar
Javier Costa committed
public class CFGGraph extends Graph<CFGNode<?>> {
Javier Costa's avatar
Javier Costa committed

    public CFGGraph() {
        super();
Javier Costa's avatar
Javier Costa committed
        setRootVertex(new CFGNode<>(getNextVertexId(), getRootNodeData(), new EmptyStmt()));
Javier Costa's avatar
Javier Costa committed
    }

    @Override
Javier Costa's avatar
Javier Costa committed
    public <ASTNode extends Node> CFGNode<ASTNode> addNode(String instruction, ASTNode node) {
        CFGNode<ASTNode> vertex = new CFGNode<>(getNextVertexId(), instruction, node);
Javier Costa's avatar
Javier Costa committed
        this.addVertex(vertex);

        return vertex;
    }

Javier Costa's avatar
Javier Costa committed

    protected String getRootNodeData() {
        return "Start";
    }
Javier Costa's avatar
Javier Costa committed

    @SuppressWarnings("unchecked")
Javier Costa's avatar
Javier Costa committed
    public void addControlFlowEdge(CFGNode from, CFGNode to) {
Javier Costa's avatar
Javier Costa committed
        super.addEdge((Arrow) new ControlFlowArc(from, to));
    }
Javier Costa's avatar
Javier Costa committed

    @Override
    public String toGraphvizRepresentation() {
        String lineSep = System.lineSeparator();

Javier Costa's avatar
Javier Costa committed
        String nodes = getNodes().stream()
Javier Costa's avatar
Javier Costa committed
                .sorted(Comparator.comparingInt(GraphNode::getId))
Javier Costa's avatar
Javier Costa committed
                .map(node -> String.format("%s [label=\"%s: %s\"]", node.getId(), node.getId(), node.getData()))
                .collect(Collectors.joining(lineSep));

Javier Costa's avatar
Javier Costa committed
        String arrows =
                getArrows().stream()
Javier Costa's avatar
Javier Costa committed
                        .sorted(Comparator.comparingInt(arrow -> ((GraphNode) arrow.getFrom()).getId()))
Javier Costa's avatar
Javier Costa committed
                        .map(arrow -> ((Arc) arrow).toGraphvizRepresentation())
                        .collect(Collectors.joining(lineSep));

        return "digraph g{" + lineSep +
Javier Costa's avatar
Javier Costa committed
                nodes + lineSep +
Javier Costa's avatar
Javier Costa committed
                arrows + lineSep +
                "}";
    }
Javier Costa's avatar
Javier Costa committed
    public Graph<CFGNode<?>> slice(SlicingCriterion slicingCriterion) {
Javier Costa's avatar
Javier Costa committed
        return this;
Javier Costa's avatar
Javier Costa committed
}