From f58130e6e7df32aa7924423551b75fe91f5d7770 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Wed, 12 Apr 2017 11:25:01 -0700 Subject: [PATCH] Reorganize how server capabilites are determined in SimpleLanguageServer Compute it based on registered handlers and quickfixes.instead of handcrafting it for every subclass. --- .../boot/java/BootJavaLanguageServer.java | 29 ++-------- .../boot/BootPropertiesLanguageServer.java | 39 ++++--------- .../quickfix/QuickfixRegistry.java | 4 +- .../util/SimpleLanguageServer.java | 55 ++++++++++++++++--- .../util/SimpleTextDocumentService.java | 8 +++ .../concourse/ConcourseLanguageServer.java | 18 ------ .../yaml/ManifestYamlLanguageServer.java | 17 ------ .../yaml/ManifestYmlValueParsers.java | 5 -- 8 files changed, 74 insertions(+), 101 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 bf8f00f2d..b07e1e981 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 @@ -10,9 +10,6 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java; -import org.eclipse.lsp4j.CompletionOptions; -import org.eclipse.lsp4j.ServerCapabilities; -import org.eclipse.lsp4j.TextDocumentSyncKind; import org.springframework.ide.vscode.boot.java.completions.BootJavaCompletionEngine; import org.springframework.ide.vscode.boot.java.completions.BootJavaReconcileEngine; import org.springframework.ide.vscode.boot.java.hover.BootJavaHoverProvider; @@ -37,11 +34,11 @@ import org.springframework.ide.vscode.commons.util.text.TextDocument; /** * Language Server for Spring Boot Application Properties files - * + * * @author Martin Lippert */ public class BootJavaLanguageServer extends SimpleLanguageServer { - + public static final JavaProjectFinder DEFAULT_PROJECT_FINDER = new DefaultJavaProjectFinder(new IJavaProjectFinderStrategy[] { new MavenProjectFinderStrategy(MavenCore.getDefault()), new GradleProjectFinderStrategy(GradleCore.getDefault()), @@ -49,7 +46,7 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { }); private final VscodeCompletionEngineAdapter completionEngine; - + public BootJavaLanguageServer(JavaProjectFinder javaProjectFinder, SpringPropertyIndexProvider indexProvider) { SimpleTextDocumentService documents = getTextDocumentService(); @@ -58,7 +55,7 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { TextDocument doc = params.getDocument(); validateWith(doc, reconcileEngine); }); - + ICompletionEngine bootCompletionEngine = new BootJavaCompletionEngine(javaProjectFinder, indexProvider); completionEngine = new VscodeCompletionEngineAdapter(this, bootCompletionEngine); completionEngine.setMaxCompletionsNumber(100); @@ -67,7 +64,7 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { HoverHandler hoverInfoProvider = new BootJavaHoverProvider(this, javaProjectFinder); documents.onHover(hoverInfoProvider); - + ReferencesHandler referencesHandler = new BootJavaReferencesHandler(this, javaProjectFinder); documents.onReferences(referencesHandler); } @@ -75,19 +72,5 @@ public class BootJavaLanguageServer extends SimpleLanguageServer { public void setMaxCompletionsNumber(int number) { completionEngine.setMaxCompletionsNumber(number); } - - @Override - protected ServerCapabilities getServerCapabilities() { - ServerCapabilities c = new ServerCapabilities(); - - c.setTextDocumentSync(TextDocumentSyncKind.Incremental); - CompletionOptions completionProvider = new CompletionOptions(); - completionProvider.setResolveProvider(false); - c.setCompletionProvider(completionProvider); - c.setHoverProvider(true); - c.setReferencesProvider(true); - - return c; - } - + } diff --git a/headless-services/boot-properties-language-server/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java b/headless-services/boot-properties-language-server/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java index 067c2c145..2561eebfe 100644 --- a/headless-services/boot-properties-language-server/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java +++ b/headless-services/boot-properties-language-server/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java @@ -10,9 +10,6 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot; -import org.eclipse.lsp4j.CompletionOptions; -import org.eclipse.lsp4j.ServerCapabilities; -import org.eclipse.lsp4j.TextDocumentSyncKind; import org.springframework.ide.vscode.boot.common.PropertyCompletionFactory; import org.springframework.ide.vscode.boot.common.RelaxedNameConfig; import org.springframework.ide.vscode.boot.metadata.PropertyInfo; @@ -56,12 +53,12 @@ import com.google.common.collect.ImmutableList; /** * Language Server for Spring Boot Application Properties files - * + * * @author Alex Boyko * */ public class BootPropertiesLanguageServer extends SimpleLanguageServer { - + public static final JavaProjectFinder DEFAULT_PROJECT_FINDER = new DefaultJavaProjectFinder(new IJavaProjectFinderStrategy[] { new MavenProjectFinderStrategy(MavenCore.getDefault()), new GradleProjectFinderStrategy(GradleCore.getDefault()), @@ -77,7 +74,7 @@ public class BootPropertiesLanguageServer extends SimpleLanguageServer { private final VscodeCompletionEngineAdapter completionEngine; private final VscodeHoverEngineAdapter hoverEngine; private final RelaxedNameConfig relaxedNameConfig = RelaxedNameConfig.COMPLETION_DEFAULTS; - + private final PropertyCompletionFactory completionFactory; // For yaml @@ -85,7 +82,7 @@ public class BootPropertiesLanguageServer extends SimpleLanguageServer { private final YamlASTProvider parser = new YamlParser(yaml); private final YamlStructureProvider yamlStructureProvider= YamlStructureProvider.DEFAULT; private YamlAssistContextProvider yamlAssistContextProvider; - + public BootPropertiesLanguageServer(SpringPropertyIndexProvider indexProvider, TypeUtilProvider typeUtilProvider, JavaProjectFinder javaProjectFinder) { this.indexProvider = indexProvider; this.typeUtilProvider = typeUtilProvider; @@ -107,13 +104,13 @@ public class BootPropertiesLanguageServer extends SimpleLanguageServer { TextDocument doc = params.getDocument(); validateWith(doc, reconcileEngine); }); - + ICompletionEngine propertiesCompletionEngine = getCompletionEngine(); completionEngine = new VscodeCompletionEngineAdapter(this, propertiesCompletionEngine); completionEngine.setMaxCompletionsNumber(100); documents.onCompletion(completionEngine::getCompletions); documents.onCompletionResolve(completionEngine::resolveCompletion); - + HoverInfoProvider hoverInfoProvider = getHoverProvider(); hoverEngine = new VscodeHoverEngineAdapter(this, hoverInfoProvider); documents.onHover(hoverEngine::getHover); @@ -138,7 +135,7 @@ public class BootPropertiesLanguageServer extends SimpleLanguageServer { protected HoverInfoProvider getHoverProvider() { HoverInfoProvider propertiesHovers = new PropertiesHoverInfoProvider(indexProvider, typeUtilProvider, javaProjectFinder); HoverInfoProvider ymlHovers = new YamlHoverInfoProvider(parser, yamlStructureProvider, yamlAssistContextProvider); - + return (IDocument document, int offset) -> { String uri = document.getUri(); if (uri!=null) { @@ -151,33 +148,19 @@ public class BootPropertiesLanguageServer extends SimpleLanguageServer { return null; }; } - + public void setMaxCompletionsNumber(int number) { completionEngine.setMaxCompletionsNumber(number); } - + public void setHoverType(HoverType type) { hoverEngine.setHoverType(type); } - - @Override - protected ServerCapabilities getServerCapabilities() { - ServerCapabilities c = new ServerCapabilities(); - - c.setTextDocumentSync(TextDocumentSyncKind.Incremental); - CompletionOptions completionProvider = new CompletionOptions(); - completionProvider.setResolveProvider(false); - c.setCompletionProvider(completionProvider); - - c.setHoverProvider(true); - - return c; - } - + protected IReconcileEngine getReconcileEngine() { IReconcileEngine propertiesReconciler = new SpringPropertiesReconcileEngine(indexProvider, typeUtilProvider); IReconcileEngine ymlReconciler = new ApplicationYamlReconcileEngine(parser, indexProvider, typeUtilProvider); - + return (doc, problemCollector) -> { String uri = doc.getUri(); if (uri!=null) { diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/quickfix/QuickfixRegistry.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/quickfix/QuickfixRegistry.java index fd277bba7..ef1afda51 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/quickfix/QuickfixRegistry.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/quickfix/QuickfixRegistry.java @@ -59,5 +59,7 @@ public class QuickfixRegistry { }).toFuture(); } - + public boolean hasFixes() { + return !registry.isEmpty(); + } } 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 48cefac09..58aa2af0d 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 @@ -18,6 +18,7 @@ import java.util.concurrent.CompletableFuture; import java.util.logging.Level; import java.util.logging.Logger; +import org.eclipse.lsp4j.CompletionOptions; import org.eclipse.lsp4j.Diagnostic; import org.eclipse.lsp4j.DiagnosticSeverity; import org.eclipse.lsp4j.InitializeParams; @@ -26,6 +27,7 @@ import org.eclipse.lsp4j.MessageParams; import org.eclipse.lsp4j.MessageType; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.ServerCapabilities; +import org.eclipse.lsp4j.TextDocumentSyncKind; import org.eclipse.lsp4j.WorkspaceEdit; import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; import org.eclipse.lsp4j.services.LanguageClient; @@ -129,17 +131,52 @@ public abstract class SimpleLanguageServer implements LanguageServer, LanguageCl } } - protected abstract ServerCapabilities getServerCapabilities(); + protected final ServerCapabilities getServerCapabilities() { + ServerCapabilities c = new ServerCapabilities(); - @Override - public CompletableFuture shutdown() { - return CompletableFuture.completedFuture(new Object()); - } + c.setTextDocumentSync(TextDocumentSyncKind.Incremental); + c.setHoverProvider(true); - @Override - public void exit() { - System.exit(0); - } + CompletionOptions completionProvider = new CompletionOptions(); + completionProvider.setResolveProvider(false); + c.setCompletionProvider(completionProvider); + + if (hasQuickFixes()) { + c.setCodeActionProvider(true); + } + + if (hasDefinitionHandler()) { + c.setDefinitionProvider(true); + } + + if (hasReferencesHandler()) { + c.setReferencesProvider(true); + } + + return c; + } + + private boolean hasReferencesHandler() { + return getTextDocumentService().hasReferencesHandler(); + } + + private boolean hasDefinitionHandler() { + return getTextDocumentService().hasDefinitionHandler(); + } + + private boolean hasQuickFixes() { + return quickfixRegistry!=null && quickfixRegistry.hasFixes(); + } + + @Override + public CompletableFuture shutdown() { + return CompletableFuture.completedFuture(new Object()); + } + + @Override + public void exit() { + System.exit(0); + } public Path getWorkspaceRoot() { return workspaceRoot; diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java index 4a0bab55f..6084c7153 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java @@ -352,4 +352,12 @@ public class SimpleTextDocumentService implements TextDocumentService { return CompletableFuture.completedFuture(Collections.emptyList()); } + public boolean hasDefinitionHandler() { + return definitionHandler!=null; + } + + public boolean hasReferencesHandler() { + return this.referencesHandler!=null; + } + } diff --git a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java index 67f3a81da..1208c5f55 100644 --- a/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java +++ b/headless-services/concourse-language-server/src/main/java/org/springframework/ide/vscode/concourse/ConcourseLanguageServer.java @@ -147,22 +147,4 @@ public class ConcourseLanguageServer extends SimpleLanguageServer { return this; } - @Override - protected ServerCapabilities getServerCapabilities() { - ServerCapabilities c = new ServerCapabilities(); - - c.setTextDocumentSync(TextDocumentSyncKind.Incremental); - c.setHoverProvider(true); - - CompletionOptions completionProvider = new CompletionOptions(); - completionProvider.setResolveProvider(false); - c.setCompletionProvider(completionProvider); - - c.setDefinitionProvider(true); - - c.setCodeActionProvider(true); - - return c; - } - } diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java index 35f89328e..df11cb914 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java @@ -13,9 +13,6 @@ package org.springframework.ide.vscode.manifest.yaml; import java.util.Collection; import java.util.concurrent.Callable; -import org.eclipse.lsp4j.CompletionOptions; -import org.eclipse.lsp4j.ServerCapabilities; -import org.eclipse.lsp4j.TextDocumentSyncKind; import org.springframework.ide.vscode.commons.cloudfoundry.client.ClientTimeouts; import org.springframework.ide.vscode.commons.cloudfoundry.client.CloudFoundryClientFactory; import org.springframework.ide.vscode.commons.cloudfoundry.client.cftarget.CFTargetCache; @@ -46,7 +43,6 @@ import org.yaml.snakeyaml.Yaml; public class ManifestYamlLanguageServer extends SimpleLanguageServer { - private Yaml yaml = new Yaml(); private YamlSchema schema; private CFTargetCache cfTargetCache; @@ -142,17 +138,4 @@ public class ManifestYamlLanguageServer extends SimpleLanguageServer { return new ManifestYamlCFDomainsProvider(getCfTargetCache()); } - @Override - protected ServerCapabilities getServerCapabilities() { - ServerCapabilities c = new ServerCapabilities(); - - c.setTextDocumentSync(TextDocumentSyncKind.Incremental); - c.setHoverProvider(true); - - CompletionOptions completionProvider = new CompletionOptions(); - completionProvider.setResolveProvider(false); - c.setCompletionProvider(completionProvider); - - return c; - } } diff --git a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYmlValueParsers.java b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYmlValueParsers.java index 612f5aa70..b04a47124 100644 --- a/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYmlValueParsers.java +++ b/headless-services/manifest-yaml-language-server/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYmlValueParsers.java @@ -10,17 +10,12 @@ *******************************************************************************/ package org.springframework.ide.vscode.manifest.yaml; -import java.util.Collection; import java.util.Set; -import java.util.concurrent.Callable; import org.springframework.ide.vscode.commons.util.Assert; -import org.springframework.ide.vscode.commons.util.EnumValueParser; import org.springframework.ide.vscode.commons.util.ValueParser; -import org.springframework.ide.vscode.commons.yaml.schema.YValueHint; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSet.Builder; import com.google.common.collect.Sets; /**