diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java index 166cd84d6..910a1dca8 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java @@ -14,7 +14,6 @@ import java.lang.management.ManagementFactory; import java.net.URI; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -133,10 +132,9 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC private LanguageServerTestListener testListener; private boolean hasCompletionSnippetSupport; - private boolean hasExecuteCommandSupport; - private boolean hasFileWatcherRegistrationSupport; + private boolean hasHierarchicalDocumentSymbolSupport; private Consumer initializeHandler; private CompletableFuture initialized = new CompletableFuture(); @@ -157,6 +155,7 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC private String completionTriggerCharacters = null; + @Override public void connect(LanguageClient _client) { this.client = (STS4LanguageClient) _client; @@ -260,6 +259,7 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC this.hasCompletionSnippetSupport = safeGet(false, () -> params.getCapabilities().getTextDocument().getCompletion().getCompletionItem().getSnippetSupport()); this.hasExecuteCommandSupport = safeGet(false, () -> params.getCapabilities().getWorkspace().getExecuteCommand()!=null); this.hasFileWatcherRegistrationSupport = safeGet(false, () -> params.getCapabilities().getWorkspace().getDidChangeWatchedFiles().getDynamicRegistration()); + this.hasHierarchicalDocumentSymbolSupport = safeGet(false, () -> params.getCapabilities().getTextDocument().getDocumentSymbol().getHierarchicalDocumentSymbolSupport()); log.debug("workspaceRoots = "+getWorkspaceService().getWorkspaceRoots()); log.debug("hasCompletionSnippetSupport = "+hasCompletionSnippetSupport); log.debug("hasExecuteCommandSupport = "+hasExecuteCommandSupport); @@ -425,6 +425,9 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC public final boolean hasLazyCompletionResolver() { return completionResolver!=null; } + public boolean hasHierarchicalDocumentSymbolSupport() { + return hasHierarchicalDocumentSymbolSupport; + } private boolean hasDocumentSymbolHandler() { return getTextDocumentService().hasDocumentSymbolHandler(); @@ -479,25 +482,6 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC return getWorkspaceService().getWorkspaceRoots(); } -// /** -// * Deprecated, shouldn't use and should be removed. Anyone calling this -// * will have problems handling multi-root workspaces. -// *

-// * Use getWorkspaceRoots instead. -// */ -// @Deprecated -// public Path getWorkspaceRoot() { -// try { -// Optional firstRoot = getWorkspaceRoots().stream().findFirst(); -// if (firstRoot.isPresent()) { -// return new File(new URI(firstRoot.get().getUri())).toPath(); -// } -// } catch (Exception e) { -// Log.log(e); -// } -// return null; -// } - @Override public synchronized SimpleTextDocumentService getTextDocumentService() { if (tds==null) { @@ -728,4 +712,5 @@ public final class SimpleLanguageServer implements Sts4LanguageServer, LanguageC public void setCompletionTriggerCharacters(String completionTriggerCharacters) { this.completionTriggerCharacters = completionTriggerCharacters; } + } diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/TypeBasedYamlSymbolHandler.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/TypeBasedYamlSymbolHandler.java index 92e952a83..9622ddfb5 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/TypeBasedYamlSymbolHandler.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/reconcile/TypeBasedYamlSymbolHandler.java @@ -15,10 +15,15 @@ import java.util.List; import java.util.Map.Entry; import java.util.Set; +import javax.inject.Provider; + +import org.eclipse.lsp4j.DocumentSymbol; import org.eclipse.lsp4j.DocumentSymbolParams; import org.eclipse.lsp4j.Location; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.SymbolKind; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; 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.Assert; @@ -30,6 +35,7 @@ import org.springframework.ide.vscode.commons.yaml.ast.NodeUtil; import org.springframework.ide.vscode.commons.yaml.schema.YType; import org.yaml.snakeyaml.nodes.Node; +import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.ImmutableSet; @@ -44,15 +50,19 @@ import com.google.common.collect.ImmutableSet; */ public class TypeBasedYamlSymbolHandler implements DocumentSymbolHandler { + final static Logger logger = LoggerFactory.getLogger(TypeBasedYamlSymbolHandler.class); + private ASTTypeCache astTypeCache; private Set definitionTypes; private SimpleTextDocumentService documents; + private Supplier hiearchicalSymbolSupport; - public TypeBasedYamlSymbolHandler(SimpleTextDocumentService documents, ASTTypeCache astTypeCache, Collection definitionTypes) { + public TypeBasedYamlSymbolHandler(SimpleTextDocumentService documents, ASTTypeCache astTypeCache, Collection definitionTypes, Supplier hasHierarchicalSymbolSupport) { Assert.isTrue(!definitionTypes.isEmpty()); // If there's no interesting types then you are better of using DocumentSymbolHandler.NO_SYMBOLS this.documents = documents; this.astTypeCache = astTypeCache; this.definitionTypes = ImmutableSet.copyOf(definitionTypes); + this.hiearchicalSymbolSupport = hasHierarchicalSymbolSupport; for (YType yType : definitionTypes) { astTypeCache.addInterestingType(yType); } @@ -67,7 +77,7 @@ public class TypeBasedYamlSymbolHandler implements DocumentSymbolHandler { try { builder.add(createSymbol(doc, entry.getKey(), entry.getValue())); } catch (Exception e) { - Log.log(e); + logger.error("", e); } } } diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerInitializer.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerInitializer.java index 1f695d659..ad29d8b29 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerInitializer.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServerInitializer.java @@ -79,7 +79,7 @@ public class ConcourseLanguageServerInitializer implements InitializingBean { reconcileEngine.setTypeCollector(models.getAstTypeCache()); this.symbolHandler = CollectionUtil.hasElements(definitionTypes) - ? new TypeBasedYamlSymbolHandler(server.getTextDocumentService(), models.getAstTypeCache(), definitionTypes) + ? new TypeBasedYamlSymbolHandler(server.getTextDocumentService(), models.getAstTypeCache(), definitionTypes, server::hasHierarchicalDocumentSymbolSupport) : DocumentSymbolHandler.NO_SYMBOLS; } diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java index 1ee4d68d3..4e552f1f6 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerInitializer.java @@ -93,7 +93,7 @@ public class ManifestYamlLanguageServerInitializer implements InitializingBean { ASTTypeCache astTypeCache = new ASTTypeCache(); engine.setTypeCollector(astTypeCache); - documents.onDocumentSymbol(new TypeBasedYamlSymbolHandler(documents, astTypeCache, schema.getDefinitionTypes())); + documents.onDocumentSymbol(new TypeBasedYamlSymbolHandler(documents, astTypeCache, schema.getDefinitionTypes(), server::hasHierarchicalDocumentSymbolSupport)); documents.onDidChangeContent(params -> { validateOnDocumentChange(engine, params.getDocument());