Show symbols in file for spring XML config files

This commit is contained in:
aboyko
2022-10-20 12:32:18 -04:00
parent 2cb7b921d5
commit 4618a07968
6 changed files with 52 additions and 54 deletions

View File

@@ -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<? extends WorkspaceSymbol> 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<IReconcileEngine> getReconcileEngine() {
return Optional.ofNullable(reconcileEngine);
}
@Override
public Optional<DocumentSymbolHandler> getDocumentSymbolProvider() {
return Optional.ofNullable(docSymbolHandler);
}
@SuppressWarnings("unchecked")
public <C extends LanguageServerComponents> C get(Class<C> subComponentsType) {
for (LanguageServerComponents subcomp : this.componentsByLanguageId.values()) {

View File

@@ -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<IReconcileEngine> getReconcileEngine() { return Optional.empty(); }
HoverHandler getHoverProvider();
default Optional<CodeActionHandler> getCodeActionProvider() { return Optional.empty(); }
default Optional<DocumentSymbolHandler> getDocumentSymbolProvider() { return Optional.empty(); }
}

View File

@@ -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) {

View File

@@ -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<DocumentSymbolHandler> getDocumentSymbolProvider() {
return Optional.of(docSymbolProvider);
}
private void initialized() {
this.liveProcessTracker.start();
this.liveChangeDetectionWatchdog.start();

View File

@@ -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<? extends WorkspaceSymbol> 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();
}
}

View File

@@ -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<IReconcileEngine> getReconcileEngine() {
return Optional.of(this.reconcileEngine);
}
@Override
public Optional<DocumentSymbolHandler> getDocumentSymbolProvider() {
return Optional.of(docSymbolProvider);
}
@Override
public HoverHandler getHoverProvider() {