From 0d75bd4b563cb710060da56c406bc6056b667165 Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Mon, 2 Oct 2017 09:33:14 +0200 Subject: [PATCH] PT #150711096: start symbol parsing at language server startup --- .../boot/java/BootJavaLanguageServer.java | 11 +++- .../vscode/boot/java/utils/SpringIndexer.java | 64 +++++++++++-------- .../RequestMappingSymbolProviderTest.java | 4 +- .../utils/test/SpringIndexerBeansTest.java | 6 +- .../java/utils/test/SpringIndexerTest.java | 12 ++-- 5 files changed, 57 insertions(+), 40 deletions(-) diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java index fe9370d2a..a225fc6ec 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServer.java @@ -14,6 +14,7 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.lsp4j.CompletionItemKind; +import org.eclipse.lsp4j.InitializedParams; import org.springframework.ide.vscode.boot.java.beans.BeansSymbolProvider; import org.springframework.ide.vscode.boot.java.beans.ComponentSymbolProvider; import org.springframework.ide.vscode.boot.java.handlers.BootJavaCodeLensEngine; @@ -72,6 +73,7 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { }); private final VscodeCompletionEngineAdapter completionEngine; + private final SpringIndexer indexer; public BootJavaLanguageServer(JavaProjectFinder javaProjectFinder, SpringPropertyIndexProvider indexProvider) { super("vscode-boot-java"); @@ -96,20 +98,25 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { ReferencesHandler referencesHandler = createReferenceHandler(this, javaProjectFinder); documents.onReferences(referencesHandler); - SpringIndexer indexer = createAnnotationIndexer(this, javaProjectFinder); + indexer = createAnnotationIndexer(this, javaProjectFinder); documents.onDocumentSymbol(new BootJavaDocumentSymbolHandler(indexer)); workspaceService.onWorkspaceSymbol(new BootJavaWorkspaceSymbolHandler(indexer)); BootJavaCodeLensEngine codeLensHandler = createCodeLensEngine(this, javaProjectFinder); documents.onCodeLens(codeLensHandler::createCodeLenses); documents.onCodeLensResolve(codeLensHandler::resolveCodeLens); - } public void setMaxCompletionsNumber(int number) { completionEngine.setMaxCompletions(number); } + @Override + public void initialized(InitializedParams params) { + super.initialized(params); + this.indexer.initialize(this.getWorkspaceRoot()); + } + protected ICompletionEngine createCompletionEngine(JavaProjectFinder javaProjectFinder, SpringPropertyIndexProvider indexProvider) { Map providers = new HashMap<>(); providers.put(org.springframework.ide.vscode.boot.java.scope.Constants.SPRING_SCOPE, new ScopeCompletionProcessor()); diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java index e80f0a861..7b45e9e2b 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/SpringIndexer.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.ExecutionException; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -71,32 +72,19 @@ public class SpringIndexer { this.symbolsByDoc = new ConcurrentHashMap<>(); } - public void initialize() { + public void initialize(final Path workspaceRoot) { synchronized(this) { if (this.initializeTask == null) { this.initializeTask = CompletableFuture.runAsync(new Runnable() { @Override public void run() { System.out.println("start initial scan..."); - Path workspaceRoot = server.getWorkspaceRoot(); - reset(); scanFiles(workspaceRoot.toFile()); System.out.println("initial scan done...!!!"); } }); } } - - try { - this.initializeTask.get(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public void reset() { - this.symbols.clear(); - this.symbolsByDoc.clear(); } public void updateDocument(String docURI) { @@ -104,18 +92,45 @@ public class SpringIndexer { } public List getAllSymbols(String query) { - initialize(); - if (query != null && query.length() > 0) { - return searchMatchingSymbols(this.symbols, query); + if (initializeTask != null) { + try { + initializeTask.get(); + if (query != null && query.length() > 0) { + return searchMatchingSymbols(this.symbols, query); + } else { + return this.symbols; + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } } - else { - return this.symbols; + return null; + } + + public List getSymbols(String docURI) { + if (initializeTask != null) { + try { + initializeTask.get(); + return this.symbolsByDoc.get(docURI); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } } + return null; } private List searchMatchingSymbols(List allsymbols, String query) { - return allsymbols.stream() - .filter(symbol -> containsCharacters(symbol.getName().toCharArray(), query.toCharArray())).collect(Collectors.toList()); + if (initializeTask != null) { + try { + initializeTask.get(); + return allsymbols.stream() + .filter(symbol -> containsCharacters(symbol.getName().toCharArray(), query.toCharArray())) + .collect(Collectors.toList()); + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + } + return null; } private boolean containsCharacters(char[] symbolChars, char[] queryChars) { @@ -132,12 +147,7 @@ public class SpringIndexer { return queryindex == queryChars.length; } - public List getSymbols(String docURI) { - initialize(); - return this.symbolsByDoc.get(docURI); - } - - public void scanFiles(File directory) { + private void scanFiles(File directory) { try { System.out.println("scan directory..."); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java index 4346982e3..8ae8d944d 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/RequestMappingSymbolProviderTest.java @@ -75,7 +75,7 @@ public class RequestMappingSymbolProviderTest { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-request-mapping-symbols/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); String uriPrefix = "file://" + directory.getAbsolutePath(); List symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/SimpleMappingClass.java"); @@ -89,7 +89,7 @@ public class RequestMappingSymbolProviderTest { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-request-mapping-symbols/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); String uriPrefix = "file://" + directory.getAbsolutePath(); List symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/ParentMappingClass.java"); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerBeansTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerBeansTest.java index e7840b3f2..54f2a0145 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerBeansTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerBeansTest.java @@ -76,7 +76,7 @@ public class SpringIndexerBeansTest { public void testScanSimpleConfigurationClass() throws Exception { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); String uriPrefix = "file://" + directory.getAbsolutePath(); List symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/SimpleConfiguration.java"); @@ -88,7 +88,7 @@ public class SpringIndexerBeansTest { public void testScanSimpleFunctionBean() throws Exception { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); String uriPrefix = "file://" + directory.getAbsolutePath(); List symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/FunctionClass.java"); @@ -100,7 +100,7 @@ public class SpringIndexerBeansTest { public void testScanSimpleComponentClass() throws Exception { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-beans/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); String uriPrefix = "file://" + directory.getAbsolutePath(); List symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/SimpleComponent.java"); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java index fddc8c7a9..b6fbbebba 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/utils/test/SpringIndexerTest.java @@ -75,7 +75,7 @@ public class SpringIndexerTest { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); List allSymbols = indexer.getAllSymbols(""); @@ -99,7 +99,7 @@ public class SpringIndexerTest { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); String uriPrefix = "file://" + directory.getAbsolutePath(); List symbols = indexer.getSymbols(uriPrefix + "/src/main/java/org/test/MainClass.java"); @@ -126,7 +126,7 @@ public class SpringIndexerTest { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); List allSymbols = indexer.getAllSymbols(""); @@ -150,7 +150,7 @@ public class SpringIndexerTest { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); List allSymbols = indexer.getAllSymbols("mapp"); @@ -172,7 +172,7 @@ public class SpringIndexerTest { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); List allSymbols = indexer.getAllSymbols("@/foo-root-mapping -- (no method defined)"); @@ -190,7 +190,7 @@ public class SpringIndexerTest { SpringIndexer indexer = new SpringIndexer(harness.getServer(), projectFinder, symbolProviders); File directory = new File(ProjectsHarness.class.getResource("/test-projects/test-annotation-indexing-parent/test-annotation-indexing/").toURI()); - indexer.scanFiles(directory); + indexer.initialize(directory.toPath()); List allSymbols = indexer.getAllSymbols("@/foo-root-mapping/embedded-foo-mapping-with-root -- (no method defined)");