diff --git a/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java b/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java index e2e13256b5..dcbcc2f095 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java +++ b/javaparser-core/src/main/java/com/github/javaparser/JavaParser.java @@ -329,7 +329,7 @@ private static T simplifiedParse(ParseStart context, Provide if (result.isSuccessful()) { return result.getResult().get(); } - throw new ParseProblemException(result.getProblems()); + throw new ParseProblemException(result); } /** diff --git a/javaparser-core/src/main/java/com/github/javaparser/ParseProblemException.java b/javaparser-core/src/main/java/com/github/javaparser/ParseProblemException.java index 50064dc7b5..295bb6a8ad 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/ParseProblemException.java +++ b/javaparser-core/src/main/java/com/github/javaparser/ParseProblemException.java @@ -35,14 +35,16 @@ public class ParseProblemException extends RuntimeException { * The problems that were encountered during parsing */ private final List problems; + private final ParseResult result; - public ParseProblemException(List problems) { - super(createMessage(assertNotNull(problems))); - this.problems = problems; + public ParseProblemException(ParseResult result) { + super(createMessage(assertNotNull(result.getProblems()))); + this.problems = result.getProblems(); + this.result = result; } public ParseProblemException(Throwable throwable) { - this(singletonList(new Problem(throwable.getMessage(), null, throwable))); + this(new ParseResult<>(null, singletonList(new Problem(throwable.getMessage(), null, throwable)), null, null)); } private static String createMessage(List problems) { @@ -56,4 +58,8 @@ private static String createMessage(List problems) { public List getProblems() { return problems; } + + public ParseResult getResult() { + return result; + } } diff --git a/javaparser-core/src/main/java/com/github/javaparser/utils/SourceRoot.java b/javaparser-core/src/main/java/com/github/javaparser/utils/SourceRoot.java index 8b17975678..8a8a3e7e39 100644 --- a/javaparser-core/src/main/java/com/github/javaparser/utils/SourceRoot.java +++ b/javaparser-core/src/main/java/com/github/javaparser/utils/SourceRoot.java @@ -253,7 +253,7 @@ public CompilationUnit parse(String startPackage, String filename) { if (result.isSuccessful()) { return result.getResult().get(); } - throw new ParseProblemException(result.getProblems()); + throw new ParseProblemException(result); } catch (IOException e) { throw new ParseProblemException(e); } diff --git a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclaration.java b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclaration.java index 8811219699..9e50a97d99 100644 --- a/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclaration.java +++ b/javaparser-symbol-solver-core/src/main/java/com/github/javaparser/symbolsolver/javaparsermodel/declarations/JavaParserInterfaceDeclaration.java @@ -310,11 +310,12 @@ public Optional containerType() { private ResolvedReferenceType toReferenceType(ClassOrInterfaceType classOrInterfaceType) { SymbolReference ref = null; - if (classOrInterfaceType.toString().indexOf('.') > -1) { - ref = typeSolver.tryToSolveType(classOrInterfaceType.toString()); + String typeName = classOrInterfaceType.getNameAsString(); + if (typeName.indexOf('.') > -1) { + ref = typeSolver.tryToSolveType(typeName); } if (ref == null || !ref.isSolved()) { - ref = solveType(classOrInterfaceType.toString(), typeSolver); + ref = solveType(typeName, typeSolver); } if (!ref.isSolved()) { ref = solveType(classOrInterfaceType.getName().getId(), typeSolver); 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 900a2b862a..93632a91eb 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 @@ -16,8 +16,7 @@ package com.github.javaparser.symbolsolver.resolution.typesolvers; -import com.github.javaparser.JavaParser; -import com.github.javaparser.ParseProblemException; +import com.github.javaparser.*; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.resolution.declarations.ResolvedReferenceTypeDeclaration; import com.github.javaparser.symbolsolver.javaparser.Navigator; @@ -36,6 +35,10 @@ import java.util.Optional; import java.util.concurrent.ExecutionException; +import static com.github.javaparser.ParseStart.*; +import static com.github.javaparser.ParserConfiguration.LanguageLevel.*; +import static com.github.javaparser.Providers.provider; + /** * Defines a directory containig source code that should be used for solving symbols. * The directory must correspond to the root package of the files within. @@ -45,6 +48,7 @@ public class JavaParserTypeSolver implements TypeSolver { private final File srcDir; + private final JavaParser javaParser; private TypeSolver parent; @@ -65,6 +69,11 @@ public JavaParserTypeSolver(File srcDir) { throw new IllegalStateException("SrcDir does not exist or is not a directory: " + srcDir.getAbsolutePath()); } this.srcDir = srcDir; + javaParser = new JavaParser( + new ParserConfiguration() + .setLanguageLevel(BLEEDING_EDGE) + .setAttributeComments(false) + .setStoreTokens(false)); } @Override @@ -85,17 +94,21 @@ public void setParent(TypeSolver parent) { this.parent = parent; } - private Optional parse(File srcFile) { try { return parsedFiles.get(srcFile.getAbsolutePath(), () -> { try { - return Optional.of(JavaParser.parse(srcFile)); + if (!srcFile.exists()) { + return Optional.empty(); + } + return javaParser.parse(COMPILATION_UNIT, provider(srcFile)) + .getResult() + .map(cu -> cu.setStorage(srcFile.toPath())); } catch (FileNotFoundException e) { - Log.trace("File not found while type solving: " + srcFile.getAbsolutePath()); - return Optional.empty(); + throw new RuntimeException("Issue while parsing while type solving: " + srcFile.getAbsolutePath(), e); } catch (ParseProblemException e) { - throw new RuntimeException("Issue while parsing " + srcFile.getAbsolutePath(), e); + Log.trace("Issue while parsing while type solving: " + srcFile.getAbsolutePath(), e); + return Optional.of((CompilationUnit) e.getResult().getResult().get()); } }); } catch (ExecutionException e) { @@ -143,25 +156,26 @@ private SymbolReference tryToSolveTypeUncached String[] nameElements = name.split("\\."); for (int i = nameElements.length; i > 0; i--) { - String filePath = srcDir.getAbsolutePath(); + StringBuilder filePath = new StringBuilder(srcDir.getAbsolutePath()); for (int j = 0; j < i; j++) { - filePath += "/" + nameElements[j]; + filePath.append("/") + .append(nameElements[j]); } - filePath += ".java"; + filePath.append(".java"); - String typeName = ""; + StringBuilder typeName = new StringBuilder(); for (int j = i - 1; j < nameElements.length; j++) { if (j != i - 1) { - typeName += "."; + typeName.append("."); } - typeName += nameElements[j]; + typeName.append(nameElements[j]); } - File srcFile = new File(filePath); + File srcFile = new File(filePath.toString()); { Optional compilationUnit = parse(srcFile); if (compilationUnit.isPresent()) { - Optional> astTypeDeclaration = Navigator.findType(compilationUnit.get(), typeName); + Optional> astTypeDeclaration = Navigator.findType(compilationUnit.get(), typeName.toString()); if (astTypeDeclaration.isPresent()) { return SymbolReference.solved(JavaParserFacade.get(this).getTypeDeclaration(astTypeDeclaration.get())); } @@ -171,7 +185,7 @@ private SymbolReference tryToSolveTypeUncached { List compilationUnits = parseDirectory(srcFile.getParentFile()); for (CompilationUnit compilationUnit : compilationUnits) { - Optional> astTypeDeclaration = Navigator.findType(compilationUnit, typeName); + Optional> astTypeDeclaration = Navigator.findType(compilationUnit, typeName.toString()); if (astTypeDeclaration.isPresent()) { return SymbolReference.solved(JavaParserFacade.get(this).getTypeDeclaration(astTypeDeclaration.get())); }