From 72f0da117aa0982b4e97c3d07ea2f110c4e67fae Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Tue, 18 Jul 2023 13:35:23 +0200 Subject: [PATCH] GH-1068: added progress reporting to indexing infrastructure --- .../vscode/boot/app/SpringSymbolIndex.java | 3 +- .../handlers/BootJavaReconcileEngine.java | 2 +- .../boot/java/utils/SpringIndexerJava.java | 58 ++++++++++++------- 3 files changed, 39 insertions(+), 24 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 41e6758a5..9cdc677d4 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 @@ -221,12 +221,11 @@ public class SpringSymbolIndex implements InitializingBean, SpringIndex { Map namespaceHandler = new HashMap<>(); namespaceHandler.put("http://www.springframework.org/schema/beans", new SpringIndexerXMLNamespaceHandlerBeans()); springIndexerXML = new SpringIndexerXML(handler, namespaceHandler, this.cache, projectFinder()); - springIndexerJava = new SpringIndexerJava(handler, specificProviders, this.cache, projectFinder()); + springIndexerJava = new SpringIndexerJava(handler, specificProviders, this.cache, projectFinder(), server.getProgressService()); factoriesIndexer = new SpringFactoriesIndexer(handler, cache); this.indexers = new SpringIndexer[] {springIndexerJava, factoriesIndexer}; - getWorkspaceService().onDidChangeWorkspaceFolders(evt -> { log.debug("workspace roots have changed event arrived - added: " + evt.getEvent().getAdded() + " - removed: " + evt.getEvent().getRemoved()); }); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReconcileEngine.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReconcileEngine.java index 6a26e8569..bdaf1ff5a 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReconcileEngine.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaReconcileEngine.java @@ -145,7 +145,7 @@ public class BootJavaReconcileEngine implements IReconcileEngine, IJavaProjectRe PercentageProgressTask progressTask = progressService.createPercentageProgressTask( "reconcile-java-" + project.getElementName(), totalWork, - "Reconciling Spring Java for '" + project.getElementName() + "'" + "Spring Tools: Reconciling Java Sources for '" + project.getElementName() + "'" ); for (JavaReconciler jr : javaReconcilers) { 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 6aa62e9f2..fba7f6664 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 @@ -59,6 +59,8 @@ import org.springframework.ide.vscode.boot.java.reconcilers.CachedDiagnostics; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IClasspathUtil; import org.springframework.ide.vscode.commons.java.IJavaProject; +import org.springframework.ide.vscode.commons.languageserver.PercentageProgressTask; +import org.springframework.ide.vscode.commons.languageserver.ProgressService; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.protocol.spring.Bean; import org.springframework.ide.vscode.commons.util.UriUtil; @@ -81,26 +83,31 @@ public class SpringIndexerJava implements SpringIndexer { // whenever the implementation of the indexer changes in a way that the stored data in the cache is no longer valid, // we need to change the generation - this will result in a re-indexing due to no up-to-date cache data being found private static final String GENERATION = "GEN-3"; + private static final String INDEX_FILES_TASK_ID = "index-java-source-files-task-"; private static final String SYMBOL_KEY = "symbols"; private static final String BEANS_KEY = "beans"; private static final String DIAGNOSTICS_KEY = "diagnostics"; + private final SymbolHandler symbolHandler; private final AnnotationHierarchyAwareLookup symbolProviders; private final IndexCache cache; private final JavaProjectFinder projectFinder; + private final ProgressService progressService; + private boolean scanTestJavaSources = false; private FileScanListener fileScanListener = null; //used by test code only private final SpringIndexerJavaDependencyTracker dependencyTracker = new SpringIndexerJavaDependencyTracker(); public SpringIndexerJava(SymbolHandler symbolHandler, AnnotationHierarchyAwareLookup symbolProviders, IndexCache cache, - JavaProjectFinder projectFimder) { + JavaProjectFinder projectFimder, ProgressService progressService) { this.symbolHandler = symbolHandler; this.symbolProviders = symbolProviders; this.cache = cache; this.projectFinder = projectFimder; + this.progressService = progressService; } public SpringIndexerJavaDependencyTracker getDependencyTracker() { @@ -464,28 +471,37 @@ public class SpringIndexerJava implements SpringIndexer { private String[] scanFiles(IJavaProject project, String[] javaFiles, List generatedSymbols, List generatedBeans, List generatedDiagnostics, SCAN_PASS pass) throws Exception { + + PercentageProgressTask progressTask = this.progressService.createPercentageProgressTask(INDEX_FILES_TASK_ID + project.getElementName(), + javaFiles.length, "Spring Tools: Indexing Java Sources for '" + project.getElementName() + "'"); - ASTParser parser = createParser(project, SCAN_PASS.ONE.equals(pass)); - List nextPassFiles = new ArrayList<>(); + try { + ASTParser parser = createParser(project, SCAN_PASS.ONE.equals(pass)); + List nextPassFiles = new ArrayList<>(); + + 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<>(); + + SpringIndexerJavaContext context = new SpringIndexerJavaContext(project, cu, docURI, sourceFilePath, + lastModified, docRef, null, generatedSymbols, generatedBeans, generatedDiagnostics, pass, nextPassFiles); + + scanAST(context); + progressTask.increment(); + } + }; + + parser.createASTs(javaFiles, null, new String[0], requestor, null); - 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<>(); - - SpringIndexerJavaContext context = new SpringIndexerJavaContext(project, cu, docURI, sourceFilePath, - lastModified, docRef, null, generatedSymbols, generatedBeans, generatedDiagnostics, pass, nextPassFiles); - - scanAST(context); - } - }; - - parser.createASTs(javaFiles, null, new String[0], requestor, null); - - return (String[]) nextPassFiles.toArray(new String[nextPassFiles.size()]); + return (String[]) nextPassFiles.toArray(new String[nextPassFiles.size()]); + } + finally { + progressTask.done(); + } } private void scanAST(final SpringIndexerJavaContext context) {