Skip to content
Snippets Groups Projects
Commit ff2dcf4e authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Temporarily modify existing return statements in constructors to return 'this'.

parent 26ceed48
No related branches found
No related tags found
1 merge request!58Object flow and trees
......@@ -9,6 +9,8 @@ import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.ThisExpr;
import com.github.javaparser.ast.stmt.ExplicitConstructorInvocationStmt;
import com.github.javaparser.ast.stmt.ReturnStmt;
import com.github.javaparser.ast.visitor.ModifierVisitor;
import com.github.javaparser.ast.visitor.Visitable;
import es.upv.mist.slicing.arcs.Arc;
import es.upv.mist.slicing.graphs.ClassGraph;
import es.upv.mist.slicing.graphs.ExpressionObjectTreeFinder;
......@@ -25,6 +27,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
......@@ -199,12 +202,16 @@ public class JSysCFG extends ESCFG {
methodInsertedInstructions.add(superCall);
n.getBody().addStatement(0, superCall);
}
// insert return this;
var returnThis = new ReturnStmt(new ThisExpr());
// insert return this; at the end of the constructor
var returnThis = new ReturnStmt();
methodInsertedInstructions.add(returnThis);
n.getBody().addStatement(returnThis);
// modify every return statement so that it returns 'this'
modifyAllReturnExpr(n, ThisExpr::new);
// Perform the same task as previous graphs.
super.visit(n, arg);
// restore return statements
modifyAllReturnExpr(n, () -> null);
// Convert enter/exit nodes to implicit if appropriate
if (implicitDeclaration) {
getRootNode().markAsImplicit();
......@@ -214,6 +221,16 @@ public class JSysCFG extends ESCFG {
}
}
protected void modifyAllReturnExpr(Node node, Supplier<Expression> expressionSupplier) {
node.accept(new ModifierVisitor<Void>() {
@Override
public Visitable visit(ReturnStmt n, Void arg) {
n.setExpression(expressionSupplier.get());
return n;
}
}, null);
}
@Override
protected void addMethodOutput(CallableDeclaration<?> callableDeclaration, GraphNode<?> exit) {
super.addMethodOutput(callableDeclaration, exit);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment