Newer
Older
import com.github.javaparser.ast.body.MethodDeclaration;
import tfm.arcs.Arc;
import tfm.arcs.pdg.ControlDependencyArc;
import tfm.arcs.pdg.DataDependencyArc;
public GraphNode<?> getRootNode() {
Iterator<GraphNode<?>> iterator = this.getNodesAtLevel(0).iterator();
if (iterator.hasNext()) {
return iterator.next();
}
public void addControlDependencyArc(GraphNode<?> from, GraphNode<?> to) {
this.addEdge(from, to);
public void addDataDependencyArc(GraphNode<?> from, GraphNode<?> to, String variable) {
this.addEdge(from, to, new DataDependencyArc(variable));
public Set<GraphNode<?>> getNodesAtLevel(int level) {
return getNodes().stream()
.max(Comparator.comparingInt(this::getLevelOf))
.map(node -> getLevelOf(node) + 1)
.orElse(0);
}
public int getLevelOf(int nodeId) {
return findNodeById(nodeId)
.map(this::getLevelOf)
.orElseThrow(() -> new NodeNotFoundException("Node with id " + nodeId + " not found in PDG graph"));
}
public int getLevelOf(@NotNull GraphNode<?> node) {
Optional<ControlDependencyArc> optionalControlDependencyArc = incomingEdgesOf(node).stream()
.filter(Arc::isControlDependencyArrow)
.findFirst()
.map(arc -> (ControlDependencyArc) arc);
if (!optionalControlDependencyArc.isPresent()) {
return 0;
}
GraphNode<?> parent = this.getEdgeSource(optionalControlDependencyArc.get());
public void setCfgGraph(CFGGraph cfgGraph) {
this.cfgGraph = cfgGraph;
}
@Override
public String toGraphvizRepresentation() {
String lineSep = System.lineSeparator();
.sorted(Comparator.comparingInt(GraphNode::getId))
.map(GraphNode::toGraphvizRepresentation)
StringBuilder rankedNodes = new StringBuilder();
// No level 0 is needed (only one node)
for (int i = 0; i < getLevels(); i++) {
Set<GraphNode<?>> levelNodes = getNodesAtLevel(i);
if (levelNodes.size() <= 1) {
continue;
}
// rank same
rankedNodes.append("{ rank = same; ")
.append(levelNodes.stream()
.map(node -> String.valueOf(node.getId()))
.collect(Collectors.joining(";")))
.append(" }")
.append(lineSep);
// invisible arrows for ordering
rankedNodes.append(levelNodes.stream()
.map(node -> String.valueOf(node.getId()))
.collect(Collectors.joining(" -> ")))
.append("[style = invis];")
.append(lineSep);
}
.sorted(Comparator.comparingInt(arc -> this.getEdgeSource(arc).getId()))
.collect(Collectors.joining(lineSep));
return "digraph g{" + lineSep +
"splines=true;" + lineSep +
nodesDeclaration + lineSep +
arrows + lineSep +
Optional<GraphNode<?>> optionalGraphNode = slicingCriterion.findNode(this);
// // DEPRECATED - Find CFGNode and find last definition of variable
// CFGNode cfgNode = this.cfgGraph.findNodeByASTNode(node.getAstNode())
// .orElseThrow(() -> new NodeNotFoundException("CFGNode not found"));
//
// Set<CFGNode<?>> definitionNodes = Utils.findLastDefinitionsFrom(cfgNode, slicingCriterion.getVariable());
//
// Logger.format("Slicing node: %s", node);
//
// // Get slice nodes from definition nodes
// Set<Integer> sliceNodes = definitionNodes.stream()
// .flatMap(definitionNode -> getSliceNodes(new HashSet<>(), this.findNodeByASTNode(definitionNode.getAstNode()).get()).stream())
// .collect(Collectors.toSet());
//
// sliceNodes.add(node.getId());
Set<Integer> sliceNodes = getSliceNodes(new HashSet<>(), node);
astCopy.accept(new PDGBuilder(sliceGraph), sliceGraph.getNodesAtLevel(0).iterator().next());
for (GraphNode<?> sliceNode : sliceGraph.getNodes()) {
// Optional<GraphNode> fromOptional = sliceGraph.findNodeById(arc.getFromNode().getId());
// Optional<GraphNode> toOptional = sliceGraph.findNodeById(arc.getToNode().getId());
//
// if (fromOptional.isPresent() && toOptional.isPresent()) {
// GraphNode from = fromOptional.get();
// GraphNode to = toOptional.get();
//
// if (arc.isControlDependencyArrow()) {
// sliceGraph.addControlDependencyArc(from, to);
// } else {
// DataDependencyArc dataDependencyArc = (DataDependencyArc) arc;
// sliceGraph.addDataDependencyArc(from, to, dataDependencyArc.getData().getVariables().get(0));
// }
// }
// }
private Set<Integer> getSliceNodes(Set<Integer> visited, GraphNode<?> root) {
for (Arc arc : incomingEdgesOf(root)) {
GraphNode<?> from = this.getEdgeSource(arc);
continue;
}
getSliceNodes(visited, from);
}
return visited;
}
public CFGGraph getCfgGraph() {
return cfgGraph;
}