Skip to content

Commit ad1d5d3

Browse files
committed
Compliance level for Java source parsing during indexing
1 parent c16be39 commit ad1d5d3

File tree

2 files changed

+36
-27
lines changed

2 files changed

+36
-27
lines changed

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/ASTParserCleanupEnabled.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ public class ASTParserCleanupEnabled {
3434

3535
private final AnnotationHierarchies annotationHierachies;
3636

37-
public ASTParserCleanupEnabled(String[] classpathEntries, String[] sourceEntries, AnnotationHierarchies annotationHierarchies, boolean ignoreMethodBodies) {
37+
public ASTParserCleanupEnabled(String[] classpathEntries, String[] sourceEntries, String complianceVersion, AnnotationHierarchies annotationHierarchies, boolean ignoreMethodBodies) {
3838
this.annotationHierachies = annotationHierarchies;
3939
parser = ASTParser.newParser(AST.JLS21);
4040
options = JavaCore.getOptions();
41-
JavaCore.setComplianceOptions(JavaCore.VERSION_21, options);
41+
JavaCore.setComplianceOptions(complianceVersion, options);
4242

4343
parser.setCompilerOptions(options);
4444
parser.setKind(ASTParser.K_COMPILATION_UNIT);

headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexerJava.java

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.apache.commons.codec.digest.DigestUtils;
3737
import org.apache.commons.io.FileUtils;
3838
import org.apache.commons.lang3.tuple.Pair;
39+
import org.eclipse.jdt.core.JavaCore;
3940
import org.eclipse.jdt.core.dom.ASTVisitor;
4041
import org.eclipse.jdt.core.dom.Annotation;
4142
import org.eclipse.jdt.core.dom.CompilationUnit;
@@ -563,36 +564,38 @@ private String[] scanFiles(IJavaProject project, AnnotationHierarchies annotatio
563564
PercentageProgressTask progressTask = this.progressService.createPercentageProgressTask(INDEX_FILES_TASK_ID + project.getElementName(),
564565
javaFiles.length, "Spring Tools: Indexing Java Sources for '" + project.getElementName() + "'");
565566

566-
try {
567-
List<String> nextPassFiles = new ArrayList<>();
568-
final boolean ignoreMethodBodies = SCAN_PASS.ONE.equals(pass);
569-
570-
FileASTRequestor requestor = new FileASTRequestor() {
567+
List<String> nextPassFiles = new ArrayList<>();
568+
final boolean ignoreMethodBodies = SCAN_PASS.ONE.equals(pass);
571569

572-
@Override
573-
public void acceptAST(String sourceFilePath, CompilationUnit cu) {
574-
File file = new File(sourceFilePath);
575-
String docURI = UriUtil.toUri(file).toASCIIString();
576-
long lastModified = file.lastModified();
577-
AtomicReference<TextDocument> docRef = new AtomicReference<>();
578-
579-
IProblemCollector problemCollector = problemCollectorCreator.apply(docRef, diagnosticsAggregator);
570+
FileASTRequestor requestor = new FileASTRequestor() {
580571

581-
SpringIndexerJavaContext context = new SpringIndexerJavaContext(project, cu, docURI, sourceFilePath,
582-
lastModified, docRef, null, generatedSymbols, generatedBeans, problemCollector, pass, nextPassFiles, !ignoreMethodBodies);
583-
584-
scanAST(context, true);
585-
progressTask.increment();
586-
}
587-
};
588-
589-
ASTParserCleanupEnabled parser = createParser(project, annotations, ignoreMethodBodies);
590-
parser.createASTs(javaFiles, null, new String[0], requestor, null);
591-
parser.cleanup();
572+
@Override
573+
public void acceptAST(String sourceFilePath, CompilationUnit cu) {
574+
File file = new File(sourceFilePath);
575+
String docURI = UriUtil.toUri(file).toASCIIString();
576+
long lastModified = file.lastModified();
577+
AtomicReference<TextDocument> docRef = new AtomicReference<>();
578+
579+
IProblemCollector problemCollector = problemCollectorCreator.apply(docRef, diagnosticsAggregator);
580+
581+
SpringIndexerJavaContext context = new SpringIndexerJavaContext(project, cu, docURI, sourceFilePath,
582+
lastModified, docRef, null, generatedSymbols, generatedBeans, problemCollector, pass, nextPassFiles, !ignoreMethodBodies);
583+
584+
scanAST(context, true);
585+
progressTask.increment();
586+
}
587+
};
592588

589+
ASTParserCleanupEnabled parser = createParser(project, annotations, ignoreMethodBodies);
590+
try {
591+
parser.createASTs(javaFiles, null, new String[0], requestor, null);
593592
return (String[]) nextPassFiles.toArray(new String[nextPassFiles.size()]);
593+
} catch (Throwable t) {
594+
log.error("Failed to index project '%s'".formatted(project.getElementName()), t);
595+
return new String[0];
594596
}
595597
finally {
598+
parser.cleanup();
596599
progressTask.done();
597600
}
598601
}
@@ -803,8 +806,14 @@ private boolean isJakartaAnnotationWithDefaultSymbol(String qualifiedName) {
803806
public static ASTParserCleanupEnabled createParser(IJavaProject project, AnnotationHierarchies annotationHierarchies, boolean ignoreMethodBodies) throws Exception {
804807
String[] classpathEntries = getClasspathEntries(project);
805808
String[] sourceEntries = getSourceEntries(project);
809+
String complianceJavaVersion = getComplianceJavaVersion(project.getClasspath().getJavaVersion());
806810

807-
return new ASTParserCleanupEnabled(classpathEntries, sourceEntries, annotationHierarchies, ignoreMethodBodies);
811+
return new ASTParserCleanupEnabled(classpathEntries, sourceEntries, complianceJavaVersion, annotationHierarchies, ignoreMethodBodies);
812+
}
813+
814+
private static String getComplianceJavaVersion(String javaVersion) {
815+
// Currently the java version in the classpath seems to be 1.8, 17, 21 etc.
816+
return javaVersion == null || javaVersion.isBlank() ? JavaCore.VERSION_21 : javaVersion;
808817
}
809818

810819
private static String[] getClasspathEntries(IJavaProject project) throws Exception {

0 commit comments

Comments
 (0)