diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typesolvers/JavaParserTypeSolver.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typesolvers/JavaParserTypeSolver.java index ed5997ff24..35effb7143 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typesolvers/JavaParserTypeSolver.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/resolution/typesolvers/JavaParserTypeSolver.java @@ -126,7 +126,19 @@ private Optional parse(Path srcFile) { } } + /** + * Note that this parse only files directly contained in this directory. + * It does not traverse recursively all children directory. + */ private List parseDirectory(Path srcDirectory) { + return parseDirectory(srcDirectory, false); + } + + private List parseDirectoryRecursively(Path srcDirectory) { + return parseDirectory(srcDirectory, true); + } + + private List parseDirectory(Path srcDirectory, boolean recursively) { try { return parsedDirectories.get(srcDirectory.toAbsolutePath(), () -> { List units = new ArrayList<>(); @@ -136,6 +148,8 @@ private List parseDirectory(Path srcDirectory) { .forEach(file -> { if (file.getFileName().toString().toLowerCase().endsWith(".java")) { parse(file).ifPresent(units::add); + } else if (recursively && file.toFile().isDirectory()) { + units.addAll(parseDirectoryRecursively(file)); } }); } @@ -197,8 +211,20 @@ private SymbolReference tryToSolveTypeUncached } // If this is not possible we parse all files + // First we try just in the same package, for classes defined in a file not named as the class itself + // later we move to top directories until we get the root + { + List compilationUnits = parseDirectory(srcFile.getParent()); + for (CompilationUnit compilationUnit : compilationUnits) { + Optional> astTypeDeclaration = Navigator.findType(compilationUnit, typeName.toString()); + if (astTypeDeclaration.isPresent()) { + return SymbolReference.solved(JavaParserFacade.get(this).getTypeDeclaration(astTypeDeclaration.get())); + } + } + } + { - List compilationUnits = parseDirectory(srcDir); + List compilationUnits = parseDirectoryRecursively(srcDir); for (CompilationUnit compilationUnit : compilationUnits) { Optional> astTypeDeclaration = Navigator.findType(compilationUnit, typeName.toString()); if (astTypeDeclaration.isPresent()) { diff --git a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverTest.java b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverTest.java index 8cffe54704..c5447e94cd 100644 --- a/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverTest.java +++ b/javaparser-symbol-solver-testing/src/test/java/com/github/javaparser/symbolsolver/resolution/SymbolSolverTest.java @@ -42,7 +42,6 @@ public class SymbolSolverTest extends AbstractTest { @Before public void setup() { - Path srcNewCode = adaptPath("src/test/test_sourcecode/javaparser_new_src/javaparser-core"); CombinedTypeSolver combinedTypeSolverNewCode = new CombinedTypeSolver(); combinedTypeSolverNewCode.add(new ReflectionTypeSolver());