Commit 9ae5825e authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Added FileLineSlicingCriterion, to select nodes in the SDG.

parent ec490f8e
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -31,11 +31,16 @@ public class SDG extends Graph implements Sliceable, Buildable<NodeList<Compilat
    private boolean built = false;

    private Map<MethodDeclaration, CFG> methodCFGMap;
    private NodeList<CompilationUnit> compilationUnits;

    public SDG() {
        this.methodCFGMap = new HashMap<>();
    }

    public NodeList<CompilationUnit> getCompilationUnits() {
        return compilationUnits;
    }

    @Override
    public Slice slice(SlicingCriterion slicingCriterion) {
        Optional<GraphNode<?>> optSlicingNode = slicingCriterion.findNode(this);
@@ -47,6 +52,8 @@ public class SDG extends Graph implements Sliceable, Buildable<NodeList<Compilat
    @Override
    public void build(NodeList<CompilationUnit> nodeList) {
        nodeList.accept(new SDGBuilder(this), new Context());
        compilationUnits = nodeList;
        built = true;
    }

    @Override
+42 −0
Original line number Diff line number Diff line
package tfm.slicing;

import com.github.javaparser.ast.CompilationUnit;
import com.github.javaparser.ast.NodeList;
import com.github.javaparser.ast.stmt.Statement;
import tfm.graphs.sdg.SDG;
import tfm.nodes.GraphNode;

import java.io.File;
import java.util.Optional;

public class FileLineSlicingCriterion extends LineNumberCriterion {
    protected final File file;

    public FileLineSlicingCriterion(File file, int lineNumber) {
        super(lineNumber, null);
        this.file = file;
    }

    @Override
    public Optional<GraphNode<?>> findNode(SDG graph) {
        Optional<CompilationUnit> optCu = findCompilationUnit(graph.getCompilationUnits());
        if (optCu.isEmpty())
            return Optional.empty();
        return optCu.get().findFirst(Statement.class, this::matchesLine).flatMap(graph::findNodeByASTNode);
    }

    protected Optional<CompilationUnit> findCompilationUnit(NodeList<CompilationUnit> cus) {
        for (CompilationUnit cu : cus) {
            Optional<CompilationUnit.Storage> optStorage = cu.getStorage();
            if (optStorage.isPresent() && optStorage.get().getFileName().equals(file.getName())
                    && optStorage.get().getDirectory().equals(file.getParentFile().toPath()))
                return Optional.of(cu);
        }
        return Optional.empty();
    }

    @Override
    public String toString() {
        return file + "#" + lineNumber + ":" + variable;
    }
}
+8 −2
Original line number Diff line number Diff line
package tfm.slicing;

import com.github.javaparser.Position;
import com.github.javaparser.ast.Node;
import tfm.graphs.cfg.CFG;
import tfm.graphs.pdg.PDG;
@@ -10,8 +11,9 @@ import tfm.utils.Logger;
import java.util.Optional;

public class LineNumberCriterion extends SlicingCriterion {
    protected static final Position DEFAULT_POSITION = new Position(0, 0);

    private int lineNumber;
    protected int lineNumber;

    public LineNumberCriterion(int lineNumber, String variable) {
        super(variable);
@@ -30,7 +32,7 @@ public class LineNumberCriterion extends SlicingCriterion {
        return graph.vertexSet().stream().filter(node -> {
            Node astNode = node.getAstNode();

            if (!astNode.getBegin().isPresent() || !astNode.getEnd().isPresent())
            if (astNode.getBegin().isEmpty() || astNode.getEnd().isEmpty())
                return false;

            int begin = astNode.getBegin().get().line;
@@ -47,6 +49,10 @@ public class LineNumberCriterion extends SlicingCriterion {
        return Optional.empty();
    }

    protected boolean matchesLine(Node node) {
        return node.getBegin().orElse(DEFAULT_POSITION).line == lineNumber;
    }

    @Override
    public String toString() {
        return String.format("(%s, %s)", lineNumber, variable);