From 29f39749588db645f3a0c7178858cc191172b814 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Fri, 20 Oct 2023 15:48:02 +0200 Subject: [PATCH] GH-1119: document symbol computation re-uses compilation unit cache instead of creating its own parser and AST --- .../vscode/boot/app/SpringSymbolIndex.java | 6 ++-- .../boot/java/utils/SpringIndexerJava.java | 34 ++++++++----------- 2 files changed, 17 insertions(+), 23 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java index 8330acab9..acf13955d 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/SpringSymbolIndex.java @@ -56,6 +56,7 @@ import org.springframework.ide.vscode.boot.java.handlers.EnhancedSymbolInformati import org.springframework.ide.vscode.boot.java.handlers.SymbolAddOnInformation; import org.springframework.ide.vscode.boot.java.handlers.SymbolProvider; import org.springframework.ide.vscode.boot.java.reconcilers.JdtReconciler; +import org.springframework.ide.vscode.boot.java.utils.CompilationUnitCache; import org.springframework.ide.vscode.boot.java.utils.DocumentDescriptor; import org.springframework.ide.vscode.boot.java.utils.SpringFactoriesIndexer; import org.springframework.ide.vscode.boot.java.utils.SpringIndexer; @@ -102,6 +103,7 @@ public class SpringSymbolIndex implements InitializingBean, SpringIndex { @Autowired FutureProjectFinder futureProjectFinder; @Autowired SpringMetamodelIndex springIndex; @Autowired JdtReconciler jdtReconciler; + @Autowired CompilationUnitCache cuCache; private static final String QUERY_PARAM_LOCATION_PREFIX = "locationPrefix:"; @@ -246,10 +248,8 @@ public class SpringSymbolIndex implements InitializingBean, SpringIndex { namespaceHandler.put("http://www.springframework.org/schema/beans", new SpringIndexerXMLNamespaceHandlerBeans()); springIndexerXML = new SpringIndexerXML(handler, namespaceHandler, this.cache, projectFinder()); - BiFunction, BiConsumer, IProblemCollector> problemCollectorFactory = (docRef, aggregator) -> server.createProblemCollector(docRef, aggregator); - springIndexerJava = new SpringIndexerJava(handler, specificProviders, this.cache, projectFinder(), server.getProgressService(), jdtReconciler, problemCollectorFactory, config.getJavaValidationSettingsJson()); - + springIndexerJava = new SpringIndexerJava(handler, specificProviders, this.cache, projectFinder(), server.getProgressService(), jdtReconciler, problemCollectorFactory, config.getJavaValidationSettingsJson(), cuCache); factoriesIndexer = new SpringFactoriesIndexer(handler, cache); this.indexers = new SpringIndexer[] {springIndexerJava, factoriesIndexer}; 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 242647e87..96a9350cf 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 @@ -104,6 +104,7 @@ public class SpringIndexerJava implements SpringIndexer { private final IndexCache cache; private final JavaProjectFinder projectFinder; private final ProgressService progressService; + private final CompilationUnitCache cuCache; private boolean scanTestJavaSources = false; private JsonObject validationSeveritySettings; @@ -113,11 +114,11 @@ public class SpringIndexerJava implements SpringIndexer { private final SpringIndexerJavaDependencyTracker dependencyTracker = new SpringIndexerJavaDependencyTracker(); private final BiFunction, BiConsumer, IProblemCollector> problemCollectorCreator; - + public SpringIndexerJava(SymbolHandler symbolHandler, AnnotationHierarchyAwareLookup symbolProviders, IndexCache cache, JavaProjectFinder projectFimder, ProgressService progressService, JdtReconciler jdtReconciler, BiFunction, BiConsumer, IProblemCollector> problemCollectorCreator, - JsonObject validationSeveritySettings) { + JsonObject validationSeveritySettings, CompilationUnitCache cuCache) { this.symbolHandler = symbolHandler; this.symbolProviders = symbolProviders; this.reconciler = jdtReconciler; @@ -127,6 +128,7 @@ public class SpringIndexerJava implements SpringIndexer { this.problemCollectorCreator = problemCollectorCreator; this.validationSeveritySettings = validationSeveritySettings; + this.cuCache = cuCache; } public SpringIndexerJavaDependencyTracker getDependencyTracker() { @@ -322,44 +324,36 @@ public class SpringIndexerJava implements SpringIndexer { } public List computeSymbols(IJavaProject project, String docURI, String content) throws Exception { - final boolean ignoreMethodBodies = false; - ASTParser parser = createParser(project, ignoreMethodBodies); - if (content != null) { - String unitName = docURI.substring(docURI.lastIndexOf("/")); - parser.setUnitName(unitName); - log.debug("Scan file: {}", unitName); - parser.setSource(content.toCharArray()); - - CompilationUnit cu = (CompilationUnit) parser.createAST(null); - - if (cu != null) { + URI uri = URI.create(docURI); + + return cuCache.withCompilationUnit(project, uri, cu -> { List generatedSymbols = new ArrayList(); List generatedBeans = new ArrayList(); - + IProblemCollector voidProblemCollector = new IProblemCollector() { @Override public void endCollecting() { } - + @Override public void beginCollecting() { } - + @Override public void accept(ReconcileProblem problem) { } }; - + AtomicReference docRef = new AtomicReference<>(); String file = UriUtil.toFileString(docURI); SpringIndexerJavaContext context = new SpringIndexerJavaContext(project, cu, docURI, file, - 0, docRef, content, generatedSymbols, generatedBeans, voidProblemCollector, SCAN_PASS.ONE, new ArrayList<>(), !ignoreMethodBodies); + 0, docRef, content, generatedSymbols, generatedBeans, voidProblemCollector, SCAN_PASS.ONE, new ArrayList<>(), true); scanAST(context); - + return generatedSymbols.stream().map(s -> s.getEnhancedSymbol()).collect(Collectors.toList()); - } + }); } return Collections.emptyList();