diff --git a/sdg-cli/src/main/java/es/upv/mist/slicing/cli/Slicer.java b/sdg-cli/src/main/java/es/upv/mist/slicing/cli/Slicer.java index cc34c1c5fd9fba2c82aae5946cda10feb2df8368..460161a1ae61950a05618dfb28e765e00a3e7dcc 100644 --- a/sdg-cli/src/main/java/es/upv/mist/slicing/cli/Slicer.java +++ b/sdg-cli/src/main/java/es/upv/mist/slicing/cli/Slicer.java @@ -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 units = new NodeList<>(); + Set 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) 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 findAllJavaFiles(File directory) { + Stream.Builder builder = Stream.builder(); + findAllJavaFiles(directory, builder); + return builder.build(); + } + + protected void findAllJavaFiles(File directory, Stream.Builder 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", diff --git a/sdg-core/src/main/java/es/upv/mist/slicing/graphs/CallGraph.java b/sdg-core/src/main/java/es/upv/mist/slicing/graphs/CallGraph.java index d6a2e6b310c6f9f6d8b80349f908747fb2056b29..f0cdb2ce4ebc7cbb1402921f31ecac0af74342a6 100644 --- a/sdg-core/src/main/java/es/upv/mist/slicing/graphs/CallGraph.java +++ b/sdg-core/src/main/java/es/upv/mist/slicing/graphs/CallGraph.java @@ -40,7 +40,6 @@ import java.util.stream.Stream; */ public class CallGraph extends DirectedPseudograph> implements Buildable> { private final Map, CFG> cfgMap; - private final Map, Vertex> vertexDeclarationMap = ASTUtils.newIdentityHashMap(); private final ClassGraph classGraph; private boolean built = false; @@ -116,27 +115,21 @@ public class CallGraph extends DirectedPseudograph() { @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 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. */