diff --git a/java-symbol-solver-core/src/main/java/me/tomassetti/symbolsolver/javaparser/Navigator.java b/java-symbol-solver-core/src/main/java/me/tomassetti/symbolsolver/javaparser/Navigator.java index 6786b98a8d..b2a4dd6609 100644 --- a/java-symbol-solver-core/src/main/java/me/tomassetti/symbolsolver/javaparser/Navigator.java +++ b/java-symbol-solver-core/src/main/java/me/tomassetti/symbolsolver/javaparser/Navigator.java @@ -8,6 +8,8 @@ import com.github.javaparser.ast.stmt.ReturnStmt; import com.github.javaparser.ast.stmt.SwitchStmt; +import java.util.LinkedList; +import java.util.List; import java.util.Optional; /** @@ -197,12 +199,12 @@ private static SwitchStmt findSwitchHelper(Node node) { return null; } - private static N findNodeOfGivenClasshHelper(Node node, Class clazz) { + private static N findNodeOfGivenClassHelper(Node node, Class clazz) { if (clazz.isInstance(node)) { return clazz.cast(node); } for (Node child : node.getChildrenNodes()) { - N resChild = findNodeOfGivenClasshHelper(child, clazz); + N resChild = findNodeOfGivenClassHelper(child, clazz); if (resChild != null) { return resChild; } @@ -211,7 +213,7 @@ private static N findNodeOfGivenClasshHelper(Node node, Class clazz) { } public static N findNodeOfGivenClass(Node node, Class clazz) { - N res = findNodeOfGivenClasshHelper(node, clazz); + N res = findNodeOfGivenClassHelper(node, clazz); if (res == null) { throw new IllegalArgumentException(); } else { @@ -219,6 +221,21 @@ public static N findNodeOfGivenClass(Node node, Class clazz) { } } + public static List findAllNodesOfGivenClass(Node node, Class clazz) { + List res = new LinkedList<>(); + findAllNodesOfGivenClassHelper(node, clazz, res); + return res; + } + + private static void findAllNodesOfGivenClassHelper(Node node, Class clazz, List collector) { + if (clazz.isInstance(node)) { + collector.add(clazz.cast(node)); + } + for (Node child : node.getChildrenNodes()) { + findAllNodesOfGivenClassHelper(child, clazz, collector); + } + } + public static ReturnStmt findReturnStmt(MethodDeclaration method) { return findNodeOfGivenClass(method, ReturnStmt.class); } diff --git a/java-symbol-solver-core/src/test/java/me/tomassetti/symbolsolver/resolution/AnalyseNewJavaParserHelpersTest.java b/java-symbol-solver-core/src/test/java/me/tomassetti/symbolsolver/resolution/AnalyseNewJavaParserHelpersTest.java new file mode 100644 index 0000000000..e48c09daf6 --- /dev/null +++ b/java-symbol-solver-core/src/test/java/me/tomassetti/symbolsolver/resolution/AnalyseNewJavaParserHelpersTest.java @@ -0,0 +1,284 @@ +package me.tomassetti.symbolsolver.resolution; + +import com.github.javaparser.ParseException; +import me.tomassetti.symbolsolver.*; +import me.tomassetti.symbolsolver.javaparsermodel.JavaParserFacade; +import me.tomassetti.symbolsolver.resolution.typesolvers.CombinedTypeSolver; +import me.tomassetti.symbolsolver.resolution.typesolvers.JavaParserTypeSolver; +import me.tomassetti.symbolsolver.resolution.typesolvers.JreTypeSolver; +import org.junit.Test; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * We analize a more recent version of JavaParser, after the project moved to Java 8. + */ +public class AnalyseNewJavaParserHelpersTest extends AbstractResolutionTest { + + private static final File src = adaptPath(new File("src/test/resources/javaparser_new_src/javaparser-core")); + + private static SourceFileInfoExtractor getSourceFileInfoExtractor() { + CombinedTypeSolver combinedTypeSolver = new CombinedTypeSolver(); + combinedTypeSolver.add(new JreTypeSolver()); + combinedTypeSolver.add(new JavaParserTypeSolver(src)); + combinedTypeSolver.add(new JavaParserTypeSolver(adaptPath(new File("src/test/resources/javaparser_new_src/javaparser-generated-sources")))); + SourceFileInfoExtractor sourceFileInfoExtractor = new SourceFileInfoExtractor(); + sourceFileInfoExtractor.setTypeSolver(combinedTypeSolver); + sourceFileInfoExtractor.setPrintFileName(false); + sourceFileInfoExtractor.setVerbose(true); + return sourceFileInfoExtractor; + } + + private static SourceFileInfoExtractor sourceFileInfoExtractor = getSourceFileInfoExtractor(); + + static String readFile(File file) + throws IOException + { + byte[] encoded = Files.readAllBytes(Paths.get(file.getAbsolutePath())); + return new String(encoded, StandardCharsets.UTF_8); + } + + private static final boolean DEBUG = true; + + private void parse(String fileName) throws IOException, ParseException { + File sourceFile = new File(src.getAbsolutePath() + "/" + fileName + ".java"); + OutputStream outErrStream = new ByteArrayOutputStream(); + PrintStream outErr = new PrintStream(outErrStream); + + sourceFileInfoExtractor.setOut(outErr); + sourceFileInfoExtractor.setErr(outErr); + sourceFileInfoExtractor.solveMethodCalls(sourceFile); + String output = outErrStream.toString(); + + String path = adaptPath(new File("src/test/resources/javaparser_methodcalls_expected_output")).getPath()+ "/" + fileName.replaceAll("/", "_")+ ".txt"; + File dstFile = new File(path); + + if (DEBUG && (sourceFileInfoExtractor.getKo() != 0 || sourceFileInfoExtractor.getUnsupported() != 0)){ + System.err.println(output); + } + + assertTrue("No failures expected when analyzing " + path, 0 == sourceFileInfoExtractor.getKo()); + assertTrue("No UnsupportedOperationException expected when analyzing " + path, 0 == sourceFileInfoExtractor.getUnsupported()); + + if (/*!dstFile.exists() ||*/ false) { + // If we need to update the file uncomment these lines + PrintWriter writer = new PrintWriter(dstFile.getAbsoluteFile(), "UTF-8"); + writer.print(output); + writer.close(); + } + + String expected = readFile(dstFile); + + String[] outputLines = output.split("\n"); + String[] expectedLines = expected.split("\n"); + + for (int i=0; i