Loading sdg-core/src/main/java/tfm/graphs/sdg/SDG.java +7 −0 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading sdg-core/src/main/java/tfm/slicing/FileLineSlicingCriterion.java 0 → 100644 +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; } } sdg-core/src/main/java/tfm/slicing/LineNumberCriterion.java +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; Loading @@ -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); Loading @@ -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; Loading @@ -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); Loading Loading
sdg-core/src/main/java/tfm/graphs/sdg/SDG.java +7 −0 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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 Loading
sdg-core/src/main/java/tfm/slicing/FileLineSlicingCriterion.java 0 → 100644 +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; } }
sdg-core/src/main/java/tfm/slicing/LineNumberCriterion.java +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; Loading @@ -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); Loading @@ -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; Loading @@ -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); Loading