Commit 645b5659 authored by jacosro's avatar jacosro
Browse files

Added label to Arc

parent 14b6ef14
Loading
Loading
Loading
Loading
+18 −7
Original line number Diff line number Diff line
@@ -13,6 +13,16 @@ import java.util.Map;
import java.util.Objects;

public abstract class Arc extends DefaultEdge {

    private String label;

    protected Arc() {
    }

    protected Arc(String label) {
        this.label = label;
    }

    /** @see tfm.arcs.cfg.ControlFlowArc */
    public final boolean isControlFlowArc() {
        return this instanceof ControlFlowArc;
@@ -69,10 +79,6 @@ public abstract class Arc extends DefaultEdge {
                ((GraphNode<?>) getSource()).getId(), ((GraphNode<?>) getTarget()).getId());
    }

    public String getLabel() {
        return "";
    }

    public Map<String, Attribute> getDotAttributes() {
        return new HashMap<>();
    }
@@ -85,12 +91,17 @@ public abstract class Arc extends DefaultEdge {
            return false;
        if (!o.getClass().equals(this.getClass()))
            return false;
        return Objects.equals(getSource(), ((Arc) o).getSource()) &&
                Objects.equals(getTarget(), ((Arc) o).getTarget());
        return Objects.equals(getSource(), ((Arc) o).getSource())
                && Objects.equals(getTarget(), ((Arc) o).getTarget())
                && Objects.equals(getLabel(), ((Arc) o).getLabel());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getClass(), getSource(), getTarget());
        return Objects.hash(getClass(), getLabel(), getSource(), getTarget());
    }

    public String getLabel() {
        return label;
    }
}
+1 −19
Original line number Diff line number Diff line
@@ -7,7 +7,6 @@ import tfm.graphs.pdg.PDG;
import tfm.graphs.sdg.SDG;

import java.util.Map;
import java.util.Objects;

/**
 * An arc used in the {@link PDG} and {@link SDG},
@@ -17,16 +16,9 @@ import java.util.Objects;
 * path between the nodes where the variable is not redefined.
 */
public class DataDependencyArc extends Arc {
    private final String variable;

    public DataDependencyArc(String variable) {
        super();
        this.variable = variable;
    }

    @Override
    public String getLabel() {
        return variable;
        super(variable);
    }

    @Override
@@ -36,15 +28,5 @@ public class DataDependencyArc extends Arc {
        map.put("color", DefaultAttribute.createAttribute("red"));
        return map;
    }

    @Override
    public boolean equals(Object o) {
        return super.equals(o) && Objects.equals(variable, ((DataDependencyArc) o).variable);
    }

    @Override
    public int hashCode() {
        return Objects.hash(variable, super.hashCode());
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -3,6 +3,7 @@ package tfm.graphs.cfg;
import com.github.javaparser.ast.body.MethodDeclaration;
import tfm.arcs.Arc;
import tfm.arcs.cfg.ControlFlowArc;
import tfm.graphs.Graph;
import tfm.graphs.GraphWithRootNode;
import tfm.nodes.GraphNode;
import tfm.utils.NodeNotFoundException;
+51 −10
Original line number Diff line number Diff line
@@ -10,9 +10,7 @@ import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.MethodCallExpr;
import com.github.javaparser.ast.expr.NameExpr;
import com.github.javaparser.ast.expr.VariableDeclarationExpr;
import com.github.javaparser.ast.stmt.ExpressionStmt;
import com.github.javaparser.ast.stmt.ReturnStmt;
import com.github.javaparser.ast.stmt.Statement;
import com.github.javaparser.ast.stmt.*;
import com.github.javaparser.ast.type.Type;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import tfm.nodes.GraphNode;
@@ -43,24 +41,62 @@ class MethodCallReplacerVisitor extends VoidVisitorAdapter<Context> {
    }

    @Override
    public void visit(ReturnStmt n, Context arg) {
    public void visit(DoStmt n, Context arg) {
        searchAndSetMethodCallNode(n);
        super.visit(n, arg);
    }

    @Override
    public void visit(ExpressionStmt n, Context arg) {
        Optional<GraphNode<ExpressionStmt>> optionalNode = sdg.findNodeByASTNode(n);
    public void visit(ForEachStmt n, Context arg) {
        searchAndSetMethodCallNode(n);
        super.visit(n, arg);
    }

        assert optionalNode.isPresent();
    @Override
    public void visit(ForStmt n, Context arg) {
        searchAndSetMethodCallNode(n);
        super.visit(n, arg);
    }

        methodCallNode = optionalNode.get();
    @Override
    public void visit(IfStmt n, Context arg) {
        searchAndSetMethodCallNode(n);
        super.visit(n, arg);
    }

    @Override
    public void visit(SwitchStmt n, Context arg) {
        searchAndSetMethodCallNode(n);
        super.visit(n, arg);
    }

    @Override
    public void visit(WhileStmt n, Context arg) {
        searchAndSetMethodCallNode(n);
        super.visit(n, arg);
    }

    @Override
    public void visit(ReturnStmt n, Context arg) {
        searchAndSetMethodCallNode(n);
        super.visit(n, arg);
    }

    @Override
    public void visit(ExpressionStmt n, Context arg) {
        searchAndSetMethodCallNode(n);
        super.visit(n, arg);
    }

    @Override
    public void visit(MethodCallExpr methodCallExpr, Context context) {
        List<Expression> arguments = methodCallExpr.getArguments();

//        // Parse first method call expressions as arguments
//        arguments.stream()
//                .filter(Expression::isMethodCallExpr)
//                .forEach(expression -> expression.accept(this, context));

        Logger.log("MethodCallReplacerVisitor", context);

        Optional<MethodDeclaration> optionalCallingMethod = methodCallExpr.getScope().isPresent()
@@ -82,13 +118,18 @@ class MethodCallReplacerVisitor extends VoidVisitorAdapter<Context> {

        sdg.addCallArc(methodCallNode, calledMethodNode);

        for (Parameter parameter : calledMethodNode.getAstNode().getParameters()) {
        NodeList<Parameter> parameters = calledMethodNode.getAstNode().getParameters();

        for (int i = 0; i < parameters.size(); i++) {
            Parameter parameter = parameters.get(i);
            Expression argument = arguments.get(i);

            // In expression
            VariableDeclarationExpr inVariableDeclarationExpr = new VariableDeclarationExpr(
                    new VariableDeclarator(
                            parameter.getType(),
                            parameter.getNameAsString() + "_in",
                            new NameExpr(parameter.getNameAsString())
                            new NameExpr(argument.toString())
                    )
            );

+1 −1
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ public class SDG extends Graph implements Sliceable, Buildable<NodeList<Compilat
        this.addEdge(from, to, new DataDependencyArc(variable));
    }

    public void addCallArc(GraphNode<ExpressionStmt> from, GraphNode<MethodDeclaration> to) {
    public void addCallArc(GraphNode<?> from, GraphNode<MethodDeclaration> to) {
        this.addEdge(from, to, new CallArc());
    }