Commit cbbd7a65 authored by jacosro's avatar jacosro
Browse files

Expanded method declaration nodes + WIP: expand method call nodes

parent aaea10e1
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ import java.util.Optional;

public class Main {

    public static final String PROGRAM = Utils.PROGRAMS_FOLDER + "cfg/Eval_4.java";
    public static final String PROGRAM = Utils.PROGRAMS_FOLDER + "sdg/Example1.java";
    public static final String GRAPH = GraphLog.SDG;
    public static final String METHOD = "main";

+0 −2
Original line number Diff line number Diff line
@@ -8,8 +8,6 @@ import tfm.graphs.GraphWithRootNode;
import tfm.graphs.Sliceable;
import tfm.graphs.cfg.CFG;
import tfm.nodes.GraphNode;
import tfm.nodes.MethodRootNode;
import tfm.nodes.NodeFactory;
import tfm.slicing.Slice;
import tfm.slicing.SlicingCriterion;
import tfm.utils.NodeNotFoundException;
+19 −8
Original line number Diff line number Diff line
package tfm.graphs.sdg;

import tfm.nodes.GraphNode;
import tfm.utils.Context;
import tfm.utils.Logger;

import java.util.Optional;

class MethodCallReplacer {

    private SDG sdg;
@@ -9,13 +15,18 @@ class MethodCallReplacer {
    }

    public void replace() {
//        this.sdg.getContextPDGGraphMap()
//                .forEach((context, pdgGraph) -> {
//                    if (!context.getCurrentMethod().isPresent()) {
//                        return; // Should NOT happen
//                    }
//
//                    context.getCurrentMethod().get().accept(new MethodCallReplacerVisitor(pdgGraph), context);
//                });
        this.sdg.getContexts().stream()
            .filter(context -> context.getCurrentMethod().isPresent())
            .forEach(context -> {
                Logger.log("MethodCallReplacer", context);

                Optional<GraphNode<?>> optionalRootNode = this.sdg.getRootNode(context);

                if (!optionalRootNode.isPresent()) {
                    return; // We don't have visited the code (e.g. the MethodDeclaration for a method call)
                }

                optionalRootNode.get().getAstNode().accept(new MethodCallReplacerVisitor(), context);
            });
    }
}
+10 −1
Original line number Diff line number Diff line
@@ -9,6 +9,9 @@ import com.github.javaparser.ast.expr.VariableDeclarationExpr;
import com.github.javaparser.ast.stmt.ExpressionStmt;
import com.github.javaparser.ast.type.Type;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;
import com.github.javaparser.symbolsolver.model.resolution.TypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
import tfm.graphs.pdg.PDG;
import tfm.nodes.GraphNode;
import tfm.utils.Context;
@@ -23,23 +26,29 @@ class MethodCallReplacerVisitor extends VoidVisitorAdapter<Context> {

    private PDG pdg;

    public MethodCallReplacerVisitor() {

    }

    public MethodCallReplacerVisitor(PDG pdg) {
        this.pdg = pdg;
    }

    @Override
    public void visit(MethodCallExpr methodCallExpr, Context context) {
        Logger.log("MethodCallReplacerVisitor", context);

        Optional<MethodDeclaration> optionalCallingMethod = methodCallExpr.getScope().isPresent()
                ? shouldMakeCallWithScope(methodCallExpr, context)
                : shouldMakeCallWithNoScope(methodCallExpr, context);

        if (!optionalCallingMethod.isPresent()) {
            Logger.log("Discarding: " + methodCallExpr);
            return;
        }

        // todo make call
        Logger.log(String.format("Method '%s' called", optionalCallingMethod.get().getNameAsString()));
        Logger.log(String.format("%s | Method '%s' called", methodCallExpr, optionalCallingMethod.get().getNameAsString()));
    }

    private Optional<MethodDeclaration> shouldMakeCallWithScope(MethodCallExpr methodCallExpr, Context context) {
+0 −12
Original line number Diff line number Diff line
package tfm.graphs.sdg;

import com.github.javaparser.ast.body.MethodDeclaration;
import com.github.javaparser.ast.visitor.VoidVisitorAdapter;

public class MethodDeclarationReplacer extends VoidVisitorAdapter<Void> {

    @Override
    public void visit(MethodDeclaration methodDeclaration, Void arg) {

    }
}
Loading