From ad1d5d3a7e2f16dce9ce75206a00425b0e151bfa Mon Sep 17 00:00:00 2001 From: aboyko Date: Fri, 27 Dec 2024 16:18:39 -0500 Subject: [PATCH] Compliance level for Java source parsing during indexing --- .../java/utils/ASTParserCleanupEnabled.java | 4 +- .../boot/java/utils/SpringIndexerJava.java | 61 +++++++++++-------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTParserCleanupEnabled.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTParserCleanupEnabled.java index 1007fbb93..018f6f78a 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTParserCleanupEnabled.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTParserCleanupEnabled.java @@ -34,11 +34,11 @@ public class ASTParserCleanupEnabled { private final AnnotationHierarchies annotationHierachies; - public ASTParserCleanupEnabled(String[] classpathEntries, String[] sourceEntries, AnnotationHierarchies annotationHierarchies, boolean ignoreMethodBodies) { + public ASTParserCleanupEnabled(String[] classpathEntries, String[] sourceEntries, String complianceVersion, AnnotationHierarchies annotationHierarchies, boolean ignoreMethodBodies) { this.annotationHierachies = annotationHierarchies; parser = ASTParser.newParser(AST.JLS21); options = JavaCore.getOptions(); - JavaCore.setComplianceOptions(JavaCore.VERSION_21, options); + JavaCore.setComplianceOptions(complianceVersion, options); parser.setCompilerOptions(options); parser.setKind(ASTParser.K_COMPILATION_UNIT); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerJava.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerJava.java index fcf175100..3e1aabaa2 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerJava.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerJava.java @@ -36,6 +36,7 @@ import java.util.stream.Stream; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.tuple.Pair; +import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.CompilationUnit; @@ -563,36 +564,38 @@ public class SpringIndexerJava implements SpringIndexer { PercentageProgressTask progressTask = this.progressService.createPercentageProgressTask(INDEX_FILES_TASK_ID + project.getElementName(), javaFiles.length, "Spring Tools: Indexing Java Sources for '" + project.getElementName() + "'"); + List nextPassFiles = new ArrayList<>(); + final boolean ignoreMethodBodies = SCAN_PASS.ONE.equals(pass); + + FileASTRequestor requestor = new FileASTRequestor() { + + @Override + public void acceptAST(String sourceFilePath, CompilationUnit cu) { + File file = new File(sourceFilePath); + String docURI = UriUtil.toUri(file).toASCIIString(); + long lastModified = file.lastModified(); + AtomicReference docRef = new AtomicReference<>(); + + IProblemCollector problemCollector = problemCollectorCreator.apply(docRef, diagnosticsAggregator); + + SpringIndexerJavaContext context = new SpringIndexerJavaContext(project, cu, docURI, sourceFilePath, + lastModified, docRef, null, generatedSymbols, generatedBeans, problemCollector, pass, nextPassFiles, !ignoreMethodBodies); + + scanAST(context, true); + progressTask.increment(); + } + }; + + ASTParserCleanupEnabled parser = createParser(project, annotations, ignoreMethodBodies); try { - List nextPassFiles = new ArrayList<>(); - final boolean ignoreMethodBodies = SCAN_PASS.ONE.equals(pass); - - FileASTRequestor requestor = new FileASTRequestor() { - - @Override - public void acceptAST(String sourceFilePath, CompilationUnit cu) { - File file = new File(sourceFilePath); - String docURI = UriUtil.toUri(file).toASCIIString(); - long lastModified = file.lastModified(); - AtomicReference docRef = new AtomicReference<>(); - - IProblemCollector problemCollector = problemCollectorCreator.apply(docRef, diagnosticsAggregator); - - SpringIndexerJavaContext context = new SpringIndexerJavaContext(project, cu, docURI, sourceFilePath, - lastModified, docRef, null, generatedSymbols, generatedBeans, problemCollector, pass, nextPassFiles, !ignoreMethodBodies); - - scanAST(context, true); - progressTask.increment(); - } - }; - - ASTParserCleanupEnabled parser = createParser(project, annotations, ignoreMethodBodies); parser.createASTs(javaFiles, null, new String[0], requestor, null); - parser.cleanup(); - return (String[]) nextPassFiles.toArray(new String[nextPassFiles.size()]); + } catch (Throwable t) { + log.error("Failed to index project '%s'".formatted(project.getElementName()), t); + return new String[0]; } finally { + parser.cleanup(); progressTask.done(); } } @@ -803,8 +806,14 @@ public class SpringIndexerJava implements SpringIndexer { public static ASTParserCleanupEnabled createParser(IJavaProject project, AnnotationHierarchies annotationHierarchies, boolean ignoreMethodBodies) throws Exception { String[] classpathEntries = getClasspathEntries(project); String[] sourceEntries = getSourceEntries(project); + String complianceJavaVersion = getComplianceJavaVersion(project.getClasspath().getJavaVersion()); - return new ASTParserCleanupEnabled(classpathEntries, sourceEntries, annotationHierarchies, ignoreMethodBodies); + return new ASTParserCleanupEnabled(classpathEntries, sourceEntries, complianceJavaVersion, annotationHierarchies, ignoreMethodBodies); + } + + private static String getComplianceJavaVersion(String javaVersion) { + // Currently the java version in the classpath seems to be 1.8, 17, 21 etc. + return javaVersion == null || javaVersion.isBlank() ? JavaCore.VERSION_21 : javaVersion; } private static String[] getClasspathEntries(IJavaProject project) throws Exception {