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

Merge branch 'fix-44' into 'develop'

Fix github#44 (-i flag misbehaving)

Closes #44

See merge request !54
parents efa5b136 64195ec7
Loading
Loading
Loading
Loading
Loading
+30 −7
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@ import es.upv.mist.slicing.graphs.sdg.SDG;
import es.upv.mist.slicing.slicing.FileLineSlicingCriterion;
import es.upv.mist.slicing.slicing.Slice;
import es.upv.mist.slicing.slicing.SlicingCriterion;
import es.upv.mist.slicing.utils.NodeHashSet;
import es.upv.mist.slicing.utils.StaticTypeSolver;
import org.apache.commons.cli.*;

@@ -22,6 +23,7 @@ import java.io.PrintWriter;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;

public class Slicer {
    protected static final String HELP_HEADER = "Java SDG Slicer: extract a slice from a Java program. At least" +
@@ -215,13 +217,16 @@ public class Slicer {
        StaticJavaParser.getConfiguration().setAttributeComments(false);

        // Build the SDG
        NodeList<CompilationUnit> units = new NodeList<>();
        Set<CompilationUnit> units = new NodeHashSet<>();
        try {
            for (File directory : dirIncludeSet)
                units.add(StaticJavaParser.parse(directory));
            CompilationUnit scUnit = StaticJavaParser.parse(scFile);
            if (!units.contains(scUnit))
                units.add(scUnit);
            for (File file : dirIncludeSet) {
                if (file.isDirectory())
                    for (File f : (Iterable<File>) findAllJavaFiles(file)::iterator)
                        units.add(StaticJavaParser.parse(f));
                else
                    units.add(StaticJavaParser.parse(file));
            }
            units.add(StaticJavaParser.parse(scFile));
        } catch (FileNotFoundException e) {
            throw new ParseException(e.getMessage());
        }
@@ -235,7 +240,7 @@ public class Slicer {
            default:
                throw new IllegalArgumentException("Unknown type of graph. Available graphs are SDG, ASDG, PSDG, ESSDG");
        }
        sdg.build(units);
        sdg.build(new NodeList<>(units));

        // Slice the SDG
        SlicingCriterion sc = new FileLineSlicingCriterion(scFile, scLine);
@@ -258,6 +263,24 @@ public class Slicer {
        }
    }

    protected Stream<File> findAllJavaFiles(File directory) {
        Stream.Builder<File> builder = Stream.builder();
        findAllJavaFiles(directory, builder);
        return builder.build();
    }

    protected void findAllJavaFiles(File directory, Stream.Builder<File> builder) {
        File[] files = directory.listFiles();
        if (files == null)
            return;
        for (File f : files) {
            if (f.isDirectory())
                findAllJavaFiles(f, builder);
            else if (f.getName().endsWith(".java"))
                builder.add(f);
        }
    }

    protected String getDisclaimer(CompilationUnit.Storage s) {
        return String.format("\n\tThis file was automatically generated as part of a slice with criterion" +
                        "\n\tfile: %s, line: %d, variable(s): %s\n\tOriginal file: %s\n",
+3 −10
Original line number Diff line number Diff line
@@ -40,7 +40,6 @@ import java.util.stream.Stream;
 */
public class CallGraph extends DirectedPseudograph<CallGraph.Vertex, CallGraph.Edge<?>> implements Buildable<NodeList<CompilationUnit>> {
    private final Map<CallableDeclaration<?>, CFG> cfgMap;
    private final Map<CallableDeclaration<?>, Vertex> vertexDeclarationMap = ASTUtils.newIdentityHashMap();
    private final ClassGraph classGraph;

    private boolean built = false;
@@ -116,27 +115,21 @@ public class CallGraph extends DirectedPseudograph<CallGraph.Vertex, CallGraph.E
        arg.accept(new VoidVisitorAdapter<Void>() {
            @Override
            public void visit(MethodDeclaration n, Void arg) {
                addDeclaration(n);
                addVertex(new Vertex(n));
                super.visit(n, arg);
            }

            @Override
            public void visit(ConstructorDeclaration n, Void arg) {
                addDeclaration(n);
                addVertex(new Vertex(n));
                super.visit(n, arg);
            }
        }, null);
    }

    protected void addDeclaration(CallableDeclaration<?> n) {
        Vertex v = new Vertex(n);
        vertexDeclarationMap.put(n, v);
        addVertex(v);
    }

    protected boolean addEdge(CallableDeclaration<?> source, CallableDeclaration<?> target, Resolvable<? extends ResolvedMethodLikeDeclaration> call) {
        Edge<?> edge = new Edge<>(call, findGraphNode(call, source));
        return addEdge(vertexDeclarationMap.get(source), vertexDeclarationMap.get(target), edge);
        return addEdge(findVertexByDeclaration(source), findVertexByDeclaration(target), edge);
    }

    /** Find the calls to methods and constructors (edges) in the given list of compilation units. */