Loading src/main/java/tfm/arcs/Arc.java +18 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<>(); } Loading @@ -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; } } src/main/java/tfm/arcs/pdg/DataDependencyArc.java +1 −19 Original line number Diff line number Diff line Loading @@ -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}, Loading @@ -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 Loading @@ -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()); } } src/main/java/tfm/graphs/cfg/CFG.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading src/main/java/tfm/graphs/sdg/MethodCallReplacerVisitor.java +51 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() Loading @@ -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()) ) ); Loading src/main/java/tfm/graphs/sdg/SDG.java +1 −1 Original line number Diff line number Diff line Loading @@ -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()); } Loading Loading
src/main/java/tfm/arcs/Arc.java +18 −7 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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<>(); } Loading @@ -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; } }
src/main/java/tfm/arcs/pdg/DataDependencyArc.java +1 −19 Original line number Diff line number Diff line Loading @@ -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}, Loading @@ -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 Loading @@ -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()); } }
src/main/java/tfm/graphs/cfg/CFG.java +1 −0 Original line number Diff line number Diff line Loading @@ -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; Loading
src/main/java/tfm/graphs/sdg/MethodCallReplacerVisitor.java +51 −10 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() Loading @@ -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()) ) ); Loading
src/main/java/tfm/graphs/sdg/SDG.java +1 −1 Original line number Diff line number Diff line Loading @@ -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()); } Loading