Skip to content
PDGCFGVisitor.java 1.97 KiB
Newer Older
Javier Costa's avatar
Javier Costa committed
package tfm.visitors;

Javier Costa's avatar
Javier Costa committed
import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
import com.github.javaparser.ast.body.MethodDeclaration;
Javier Costa's avatar
Javier Costa committed
import com.github.javaparser.ast.stmt.*;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import edg.graphlib.Arrow;
import tfm.arcs.cfg.ControlFlowArc;
import tfm.graphs.CFGGraph;
import tfm.graphs.PDGGraph;
import tfm.nodes.CFGNode;
import tfm.nodes.PDGNode;
import tfm.utils.Logger;
import tfm.utils.Utils;
Javier Costa's avatar
Javier Costa committed
import tfm.variables.VariableExtractor;

import java.util.*;

public class PDGCFGVisitor extends VoidVisitorAdapter<PDGNode> {

    private PDGGraph pdgGraph;
    private CFGGraph cfgGraph;
Javier Costa's avatar
Javier Costa committed

    public CFGGraph getCfgGraph() {
        return cfgGraph;
    }
Javier Costa's avatar
Javier Costa committed

    public PDGCFGVisitor(PDGGraph pdgGraph) {
        this(pdgGraph, new CFGGraph() {
            @Override
            protected String getRootNodeData() {
                return "Start";
            }
        });
    }

    public PDGCFGVisitor(PDGGraph pdgGraph, CFGGraph cfgGraph) {
        this.pdgGraph = pdgGraph;
        this.cfgGraph = cfgGraph;
    }

    public void visit(MethodDeclaration methodDeclaration, PDGNode parent) {
        if (!methodDeclaration.getBody().isPresent())
            return;
Javier Costa's avatar
Javier Costa committed

        BlockStmt blockStmt = methodDeclaration.getBody().get();
Javier Costa's avatar
Javier Costa committed

        // Build control dependency
        ControlDependencyVisitor controlDependencyVisitor = new ControlDependencyVisitor(pdgGraph, cfgGraph);
        blockStmt.accept(controlDependencyVisitor, parent);
Javier Costa's avatar
Javier Costa committed

        // Build data dependency
        DataDependencyVisitor dataDependencyVisitor = new DataDependencyVisitor(pdgGraph, cfgGraph);
        blockStmt.accept(dataDependencyVisitor, null);
Javier Costa's avatar
Javier Costa committed
    }
Javier Costa's avatar
Javier Costa committed

    @Override
    public void visit(ClassOrInterfaceDeclaration classOrInterfaceDeclaration, PDGNode parent) {
        // build CFG
        classOrInterfaceDeclaration.accept(new CFGVisitor(cfgGraph), null);

        // Visit normally...
        super.visit(classOrInterfaceDeclaration, parent);
    }
Javier Costa's avatar
Javier Costa committed
}