Skip to content

Commit eb2d825

Browse files
committed
Slicer: JavaParser setup and handling of additional files with -i
1 parent 3cf566a commit eb2d825

File tree

1 file changed

+50
-20
lines changed
  • sdg-cli/src/main/java/es/upv/mist/slicing/cli

1 file changed

+50
-20
lines changed

sdg-cli/src/main/java/es/upv/mist/slicing/cli/Slicer.java

Lines changed: 50 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
package es.upv.mist.slicing.cli;
22

3-
import com.github.javaparser.StaticJavaParser;
3+
import com.github.javaparser.JavaParser;
4+
import com.github.javaparser.ParseResult;
5+
import com.github.javaparser.ParserConfiguration;
6+
import com.github.javaparser.Problem;
47
import com.github.javaparser.ast.CompilationUnit;
58
import com.github.javaparser.ast.NodeList;
69
import com.github.javaparser.ast.comments.BlockComment;
710
import com.github.javaparser.ast.nodeTypes.NodeWithName;
11+
import com.github.javaparser.symbolsolver.JavaSymbolSolver;
12+
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
813
import com.github.javaparser.symbolsolver.resolution.typesolvers.JavaParserTypeSolver;
14+
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;
915
import es.upv.mist.slicing.graphs.augmented.ASDG;
1016
import es.upv.mist.slicing.graphs.augmented.PSDG;
1117
import es.upv.mist.slicing.graphs.exceptionsensitive.ESSDG;
@@ -15,15 +21,12 @@
1521
import es.upv.mist.slicing.slicing.Slice;
1622
import es.upv.mist.slicing.slicing.SlicingCriterion;
1723
import es.upv.mist.slicing.utils.NodeHashSet;
18-
import es.upv.mist.slicing.utils.StaticTypeSolver;
1924
import org.apache.commons.cli.*;
2025

2126
import java.io.File;
2227
import java.io.FileNotFoundException;
2328
import java.io.PrintWriter;
24-
import java.util.Collections;
25-
import java.util.HashSet;
26-
import java.util.Set;
29+
import java.util.*;
2730
import java.util.regex.Matcher;
2831
import java.util.regex.Pattern;
2932
import java.util.stream.Stream;
@@ -172,24 +175,28 @@ public String getScVar() {
172175

173176
public void slice() throws ParseException {
174177
// Configure JavaParser
175-
StaticTypeSolver.addTypeSolverJRE();
178+
ParserConfiguration parserConfig = new ParserConfiguration();
179+
parserConfig.setAttributeComments(false);
180+
CombinedTypeSolver cts = new CombinedTypeSolver();
181+
cts.add(new ReflectionTypeSolver(true));
176182
for (File directory : dirIncludeSet)
177-
StaticTypeSolver.addTypeSolver(new JavaParserTypeSolver(directory));
178-
StaticJavaParser.getConfiguration().setAttributeComments(false);
183+
if (directory.isDirectory())
184+
cts.add(new JavaParserTypeSolver(directory));
185+
parserConfig.setSymbolResolver(new JavaSymbolSolver(cts));
186+
JavaParser parser = new JavaParser(parserConfig);
179187

180188
// Build the SDG
181189
Set<CompilationUnit> units = new NodeHashSet<>();
182-
try {
183-
for (File file : dirIncludeSet) {
184-
if (file.isDirectory())
185-
for (File f : (Iterable<File>) findAllJavaFiles(file)::iterator)
186-
units.add(StaticJavaParser.parse(f));
187-
else
188-
units.add(StaticJavaParser.parse(file));
189-
}
190-
units.add(StaticJavaParser.parse(scFile));
191-
} catch (FileNotFoundException e) {
192-
throw new ParseException(e.getMessage());
190+
List<Problem> problems = new LinkedList<>();
191+
boolean scFileFound = false;
192+
for (File file : (Iterable<File>) findAllJavaFiles(dirIncludeSet)::iterator)
193+
scFileFound |= parse(parser, file, units, problems);
194+
if (!scFileFound)
195+
parse(parser, scFile, units, problems);
196+
if (!problems.isEmpty()) {
197+
for (Problem p : problems)
198+
System.out.println(" * " + p.getVerboseMessage());
199+
throw new ParseException("Some problems were found while parsing files or folders");
193200
}
194201

195202
SDG sdg;
@@ -225,6 +232,29 @@ public void slice() throws ParseException {
225232
}
226233
}
227234

235+
private boolean parse(JavaParser parser, File file, Set<CompilationUnit> units, List<Problem> problems) {
236+
try {
237+
ParseResult<CompilationUnit> result = parser.parse(file);
238+
if (result.isSuccessful())
239+
result.ifSuccessful(units::add);
240+
else
241+
problems.addAll(result.getProblems());
242+
} catch (FileNotFoundException e) {
243+
problems.add(new Problem(e.getLocalizedMessage(), null, e));
244+
}
245+
return Objects.equals(file.getAbsoluteFile(), scFile.getAbsoluteFile());
246+
}
247+
248+
protected Stream<File> findAllJavaFiles(Collection<File> files) {
249+
Stream.Builder<File> builder = Stream.builder();
250+
for (File file : files)
251+
if (file.isDirectory())
252+
findAllJavaFiles(file, builder);
253+
else
254+
builder.accept(file);
255+
return builder.build();
256+
}
257+
228258
protected Stream<File> findAllJavaFiles(File directory) {
229259
Stream.Builder<File> builder = Stream.builder();
230260
findAllJavaFiles(directory, builder);
@@ -239,7 +269,7 @@ protected void findAllJavaFiles(File directory, Stream.Builder<File> builder) {
239269
if (f.isDirectory())
240270
findAllJavaFiles(f, builder);
241271
else if (f.getName().endsWith(".java"))
242-
builder.add(f);
272+
builder.accept(f);
243273
}
244274
}
245275

0 commit comments

Comments
 (0)