diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/CompositeLanguageServerComponents.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/CompositeLanguageServerComponents.java index 2bc2b4806..43414c6a3 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/CompositeLanguageServerComponents.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/CompositeLanguageServerComponents.java @@ -21,13 +21,16 @@ import org.eclipse.lsp4j.CodeAction; import org.eclipse.lsp4j.CodeActionCapabilities; import org.eclipse.lsp4j.CodeActionContext; import org.eclipse.lsp4j.Command; +import org.eclipse.lsp4j.DocumentSymbolParams; import org.eclipse.lsp4j.Hover; import org.eclipse.lsp4j.HoverParams; +import org.eclipse.lsp4j.WorkspaceSymbol; import org.eclipse.lsp4j.jsonrpc.CancelChecker; import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.springframework.ide.vscode.commons.languageserver.reconcile.IProblemCollector; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.util.CodeActionHandler; +import org.springframework.ide.vscode.commons.languageserver.util.DocumentSymbolHandler; import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; @@ -61,6 +64,7 @@ public class CompositeLanguageServerComponents implements LanguageServerComponen private final IReconcileEngine reconcileEngine; private final HoverHandler hoverHandler; private final CodeActionHandler codeActionHandler; + private final DocumentSymbolHandler docSymbolHandler; public CompositeLanguageServerComponents(SimpleLanguageServer server, Builder builder) { this.componentsByLanguageId = ImmutableMap.copyOf(builder.componentsByLanguageId); @@ -119,6 +123,24 @@ public class CompositeLanguageServerComponents implements LanguageServerComponen return Collections.emptyList(); } }; + + this.docSymbolHandler = new DocumentSymbolHandler() { + + @Override + public List handle(DocumentSymbolParams params) { + TextDocument doc = server.getTextDocumentService().getLatestSnapshot(params.getTextDocument().getUri()); + LanguageId language = doc.getLanguageId(); + LanguageServerComponents subComponents = componentsByLanguageId.get(language); + if (subComponents != null) { + DocumentSymbolHandler subHandler = subComponents.getDocumentSymbolProvider().orElse(null); + if (subHandler != null) { + return subHandler.handle(params); + } + } + //No applicable subEngine... + return Collections.emptyList(); + } + }; } @Override @@ -130,12 +152,17 @@ public class CompositeLanguageServerComponents implements LanguageServerComponen public HoverHandler getHoverProvider() { return hoverHandler; } - + @Override public Optional getReconcileEngine() { return Optional.ofNullable(reconcileEngine); } + @Override + public Optional getDocumentSymbolProvider() { + return Optional.ofNullable(docSymbolHandler); + } + @SuppressWarnings("unchecked") public C get(Class subComponentsType) { for (LanguageServerComponents subcomp : this.componentsByLanguageId.values()) { diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/LanguageServerComponents.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/LanguageServerComponents.java index cce5f1f3c..9925d3113 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/LanguageServerComponents.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/composable/LanguageServerComponents.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2018 Pivotal, Inc. + * Copyright (c) 2018, 2022 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -15,6 +15,7 @@ import java.util.Set; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.util.CodeActionHandler; +import org.springframework.ide.vscode.commons.languageserver.util.DocumentSymbolHandler; import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler; import org.springframework.ide.vscode.commons.util.text.LanguageId; @@ -24,4 +25,5 @@ public interface LanguageServerComponents { default Optional getReconcileEngine() { return Optional.empty(); } HoverHandler getHoverProvider(); default Optional getCodeActionProvider() { return Optional.empty(); } + default Optional getDocumentSymbolProvider() { return Optional.empty(); } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java index c7d44ec3f..3bdc86c30 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/app/BootLanguageServerInitializer.java @@ -172,6 +172,8 @@ public class BootLanguageServerInitializer implements InitializingBean { components.getCodeActionProvider().ifPresent(documents::onCodeAction); + components.getDocumentSymbolProvider().ifPresent(documents::onDocumentSymbol); + config.addListener(evt -> reconcile()); if (recipesRepo != null) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java index 478f98cc2..68e353e78 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/BootJavaLanguageServerComponents.java @@ -30,7 +30,6 @@ import org.springframework.ide.vscode.boot.java.conditionals.ConditionalsLiveHov import org.springframework.ide.vscode.boot.java.handlers.BootJavaCodeActionProvider; import org.springframework.ide.vscode.boot.java.handlers.BootJavaCodeLensEngine; import org.springframework.ide.vscode.boot.java.handlers.BootJavaDocumentHighlightEngine; -import org.springframework.ide.vscode.boot.java.handlers.BootJavaDocumentSymbolHandler; import org.springframework.ide.vscode.boot.java.handlers.BootJavaHoverProvider; import org.springframework.ide.vscode.boot.java.handlers.BootJavaReconcileEngine; import org.springframework.ide.vscode.boot.java.handlers.BootJavaReferencesHandler; @@ -72,6 +71,7 @@ import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcil import org.springframework.ide.vscode.commons.languageserver.util.CodeActionHandler; import org.springframework.ide.vscode.commons.languageserver.util.CodeLensHandler; import org.springframework.ide.vscode.commons.languageserver.util.DocumentHighlightHandler; +import org.springframework.ide.vscode.commons.languageserver.util.DocumentSymbolHandler; import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler; import org.springframework.ide.vscode.commons.languageserver.util.ReferencesHandler; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; @@ -116,6 +116,7 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent private DocumentHighlightHandler highlightsEngine; private BootJavaReconcileEngine reconcileEngine; private BootJavaCodeActionProvider codeActionProvider; + private DocumentSymbolHandler docSymbolProvider; private SpringProcessTracker liveProcessTracker; @@ -165,7 +166,9 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent // SpringSymbolIndex indexer = appContext.getBean(SpringSymbolIndex.class); - documents.onDocumentSymbol(new BootJavaDocumentSymbolHandler(this, indexer)); + + docSymbolProvider = params -> indexer.getSymbols(params.getTextDocument().getUri()); + workspaceService.onWorkspaceSymbol(new BootJavaWorkspaceSymbolHandler(indexer, new LiveAppURLSymbolProvider(liveDataProvider))); @@ -254,6 +257,11 @@ public class BootJavaLanguageServerComponents implements LanguageServerComponent return Optional.of(reconcileEngine); } + @Override + public Optional getDocumentSymbolProvider() { + return Optional.of(docSymbolProvider); + } + private void initialized() { this.liveProcessTracker.start(); this.liveChangeDetectionWatchdog.start(); diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentSymbolHandler.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentSymbolHandler.java deleted file mode 100644 index c99274cb6..000000000 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/handlers/BootJavaDocumentSymbolHandler.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2017, 2022 Pivotal, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Pivotal, Inc. - initial API and implementation - *******************************************************************************/ -package org.springframework.ide.vscode.boot.java.handlers; - -import java.util.Collections; -import java.util.List; - -import org.eclipse.lsp4j.DocumentSymbolParams; -import org.eclipse.lsp4j.WorkspaceSymbol; -import org.springframework.ide.vscode.boot.app.SpringSymbolIndex; -import org.springframework.ide.vscode.boot.java.BootJavaLanguageServerComponents; -import org.springframework.ide.vscode.commons.languageserver.util.DocumentSymbolHandler; -import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; -import org.springframework.ide.vscode.commons.util.text.TextDocument; - -/** - * @author Martin Lippert - */ -public class BootJavaDocumentSymbolHandler implements DocumentSymbolHandler { - - private SpringSymbolIndex indexer; - private BootJavaLanguageServerComponents server; - - public BootJavaDocumentSymbolHandler(BootJavaLanguageServerComponents server, SpringSymbolIndex indexer) { - this.server = server; - this.indexer = indexer; - } - - @Override - public List handle(DocumentSymbolParams params) { - SimpleTextDocumentService documents = server.getTextDocumentService(); - TextDocument doc = documents.getLatestSnapshot(params.getTextDocument().getUri()); - - if (server.getInterestingLanguages().contains(doc.getLanguageId())) { - return indexer.getSymbols(params.getTextDocument().getUri()); - } - - return Collections.emptyList(); - } - -} diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLLanguageServerComponents.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLLanguageServerComponents.java index db1bd6c96..e56168e6b 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLLanguageServerComponents.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/xml/SpringXMLLanguageServerComponents.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2019 Pivotal, Inc. + * Copyright (c) 2019, 2022 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -19,6 +19,7 @@ import org.springframework.ide.vscode.boot.app.SpringSymbolIndex; import org.springframework.ide.vscode.commons.languageserver.composable.LanguageServerComponents; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; +import org.springframework.ide.vscode.commons.languageserver.util.DocumentSymbolHandler; import org.springframework.ide.vscode.commons.languageserver.util.HoverHandler; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.util.text.LanguageId; @@ -34,6 +35,7 @@ public class SpringXMLLanguageServerComponents implements LanguageServerComponen private final JavaProjectFinder projectFinder; private final SpringXMLReconcileEngine reconcileEngine; + private final DocumentSymbolHandler docSymbolProvider; public SpringXMLLanguageServerComponents( SimpleLanguageServer server, @@ -42,6 +44,7 @@ public class SpringXMLLanguageServerComponents implements LanguageServerComponen BootJavaConfig config) { this.projectFinder = serverParams.projectFinder; + this.docSymbolProvider = params -> springIndexer.getSymbols(params.getTextDocument().getUri()); server.doOnInitialized(this::initialized); server.onShutdown(this::shutdown); @@ -63,6 +66,11 @@ public class SpringXMLLanguageServerComponents implements LanguageServerComponen public Optional getReconcileEngine() { return Optional.of(this.reconcileEngine); } + + @Override + public Optional getDocumentSymbolProvider() { + return Optional.of(docSymbolProvider); + } @Override public HoverHandler getHoverProvider() {