Commit 1627ca40 authored by Javier Costa's avatar Javier Costa
Browse files

For stmt control dependency + Added id to graphviz representation on arcs

parent 8e6b8d64
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -38,6 +38,6 @@ public class Main {
        // compilationUnit.accept(new PDGVisitor(pdgGraph), pdgGraph.getRootVertex());

        System.out.println(pdgGraph);
//        System.out.println(cfgGraph.toGraphvizRepresentation());
        System.out.println(pdgGraph.toGraphvizRepresentation());
    }
}
+6 −1
Original line number Diff line number Diff line
@@ -26,6 +26,11 @@ public abstract class Arc<D extends ArcData> extends edg.graphlib.Arrow<String,
    }

    public String toGraphvizRepresentation() {
        return String.format("\"%s\" -> \"%s\"", getFrom().getData(), getTo().getData());
        Vertex from = (Vertex) getFrom();
        Vertex to = (Vertex) getTo();

        return String.format("\"%s: %s\" -> \"%s: %s\"",
                from.getId(), from.getData(),
                to.getId(), to.getData());
    }
}
+17 −0
Original line number Diff line number Diff line
@@ -3,12 +3,21 @@ package tfm.graphlib.nodes;
import tfm.graphlib.arcs.data.ArcData;
import tfm.graphlib.graphs.Graph;

import java.util.Optional;
import java.util.stream.Collectors;

public class Vertex extends edg.graphlib.Vertex<String, ArcData> {

    private int fileLineNumber;

    public Vertex(Graph.VertexId id, String instruction) {
        this(id, instruction, null);
    }

    public Vertex(Graph.VertexId id, String instruction, Integer fileLineNumber) {
        super(id.toString(), instruction);

        this.fileLineNumber = Optional.ofNullable(fileLineNumber).orElse(-1);
    }

    public int getId() {
@@ -22,4 +31,12 @@ public class Vertex extends edg.graphlib.Vertex<String, ArcData> {
                getIncomingArrows().stream().map(arrow -> arrow.getFrom().getName()).collect(Collectors.toList()),
                getOutgoingArrows().stream().map(arc -> arc.getTo().getName()).collect(Collectors.toList()));
    }

    public Optional<Integer> getFileLineNumber() {
        return fileLineNumber == -1 ? Optional.empty() : Optional.of(fileLineNumber);
    }

    public void setFileLineNumber(Integer fileLineNumber) {
        this.fileLineNumber = fileLineNumber;
    }
}
+22 −11
Original line number Diff line number Diff line
package tfm.graphlib.utils;

import com.github.javaparser.ast.expr.AssignExpr;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.VariableDeclarationExpr;
import com.github.javaparser.ast.stmt.ExpressionStmt;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class VariableExtractor {

    private List<String> declaredVariables;
    private Map<String, Object> declaredVariables;
    private List<String> usedVariables;

    private VariableExtractor() {
        declaredVariables = new ArrayList<>();
        declaredVariables = new HashMap<>();
        usedVariables = new ArrayList<>();
    }

    public static VariableExtractor parse(Expression expression) {
        VariableExtractor extractor = new VariableExtractor();
        extractor.parse(expression);
//    public static VariableExtractor parse(Expression expression) {
//        VariableExtractor extractor = new VariableExtractor();
//
//        return extractor;
//    }

        return extractor;
    }
    public static VariableExtractor parse(AssignExpr assignExpr) {
        VariableExtractor variableExtractor = new VariableExtractor();


        assignExpr.getTarget().ifVariableDeclarationExpr(variableDeclarationExpr ->
                variableDeclarationExpr.getVariables().forEach(variableDeclarator -> {

    private void parse(AssignExpr assignExpr) {
                })
        );

        return variableExtractor;
    }

    private void parse(VariableDeclarationExpr variableDeclarationExpr) {
    public static VariableExtractor parse(VariableDeclarationExpr variableDeclarationExpr) {
        VariableExtractor variableExtractor = new VariableExtractor();

        // todo
        return variableExtractor;
    }
}
+29 −0
Original line number Diff line number Diff line
package tfm.graphlib.visitors;

import com.github.javaparser.ast.expr.AssignExpr;
import com.github.javaparser.ast.expr.BooleanLiteralExpr;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.StringLiteralExpr;
import com.github.javaparser.ast.stmt.ExpressionStmt;
import com.github.javaparser.ast.stmt.ForStmt;
import com.github.javaparser.ast.stmt.IfStmt;
import com.github.javaparser.ast.stmt.WhileStmt;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import tfm.graphlib.graphs.PDGGraph;
import tfm.graphlib.nodes.PDGVertex;

import java.util.List;
import java.util.stream.Collectors;

public class PDGVisitor extends VoidVisitorAdapter<PDGVertex> {

    private PDGGraph graph;
@@ -50,4 +57,26 @@ public class PDGVisitor extends VoidVisitorAdapter<PDGVertex> {

        super.visit(whileStmt, whileNode);
    }

    @Override
    public void visit(ForStmt forStmt, PDGVertex parent) {
        // Add initialization nodes
        forStmt.getInitialization().stream()
                .map(expression -> graph.addVertex(expression.toString()))
                .forEach(pdgVertex -> graph.addControlDependencyArc(parent, pdgVertex));

        // Add condition node
        Expression condition = forStmt.getCompare().orElse(new BooleanLiteralExpr(true));
        PDGVertex conditionNode = graph.addVertex(condition.toString());

        graph.addControlDependencyArc(parent, conditionNode);

        // Visit for
        super.visit(forStmt, conditionNode);

        // Add update vertex
        forStmt.getUpdate().stream()
                .map(expression -> graph.addVertex(expression.toString()))
                .forEach(pdgVertex -> graph.addControlDependencyArc(conditionNode, pdgVertex));
    }
}