Commit bbc7464e authored by Carlos Galindo's avatar Carlos Galindo
Browse files

Generate interprocedural tree links between actual/formal-in

parent 1974789e
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
@@ -6,6 +6,8 @@ import es.upv.mist.slicing.graphs.cfg.CFGBuilder;
import es.upv.mist.slicing.graphs.exceptionsensitive.ExceptionSensitiveCallConnector;
import es.upv.mist.slicing.nodes.GraphNode;
import es.upv.mist.slicing.nodes.VariableAction;
import es.upv.mist.slicing.nodes.io.ActualIONode;
import es.upv.mist.slicing.nodes.io.FormalIONode;
import es.upv.mist.slicing.nodes.io.OutputNode;
import es.upv.mist.slicing.utils.ASTUtils;

@@ -22,6 +24,33 @@ public class JSysCallConnector extends ExceptionSensitiveCallConnector {
        super.connectAllCalls(callGraph);
    }

    @Override
    protected void connectActualIn(GraphNode<? extends CallableDeclaration<?>> declaration, ActualIONode actualIn) {
        sdg.outgoingEdgesOf(declaration).stream()
                .map(sdg::getEdgeTarget)
                .filter(FormalIONode.class::isInstance)
                .map(FormalIONode.class::cast)
                .filter(actualIn::matchesFormalIO)
                .forEach(formalIn -> {
                    boolean primitive = !formalIn.getVariableName().equals("this")
                            && declaration.getAstNode().getParameterByName(formalIn.getVariableName())
                                    .orElseThrow().getType().isPrimitiveType();
                    if (primitive)
                        sdg.addParameterInOutArc(actualIn, formalIn);
                    else
                        connectObjectActualIn(actualIn, formalIn);
                });
    }

    protected void connectObjectActualIn(GraphNode<?> actualIn, GraphNode<?> formalIn) {
        List<VariableAction> actualList = actualIn.getVariableActions();
        List<VariableAction> formalList = formalIn.getVariableActions();
        assert formalList.size() == 1;
        VariableAction actualVar = actualList.get(actualList.size() - 1);
        VariableAction formalVar = formalList.get(0);
        actualVar.applySDGTreeConnection((JSysDG) sdg, formalVar);
    }

    @Override
    protected void connectOutput(GraphNode<? extends CallableDeclaration<?>> methodDeclaration, GraphNode<?> callReturnNode) {
        Consumer<GraphNode<?>> action;