From 0ca361f0984ce98231b02a7606e0b3cb9c92ad3f Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Thu, 20 Apr 2017 11:47:33 -0700 Subject: [PATCH] Simplify quickfix support (no dynamic command registration) --- .../languageserver/STS4LanguageClient.java | 18 -------- .../util/SimpleLanguageServer.java | 46 ++++++------------- .../testharness/LanguageServerHarness.java | 5 -- 3 files changed, 13 insertions(+), 56 deletions(-) diff --git a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/STS4LanguageClient.java b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/STS4LanguageClient.java index 620a031c6..5c9bec553 100644 --- a/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/STS4LanguageClient.java +++ b/headless-services/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/STS4LanguageClient.java @@ -11,11 +11,7 @@ package org.springframework.ide.vscode.commons.languageserver; -import java.util.concurrent.CompletableFuture; - -import org.eclipse.lsp4j.RegistrationParams; import org.eclipse.lsp4j.jsonrpc.services.JsonNotification; -import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; import org.eclipse.lsp4j.services.LanguageClient; /** @@ -28,18 +24,4 @@ public interface STS4LanguageClient extends LanguageClient { @JsonNotification("sts/progress") void progress(ProgressParams progressEvent); - /** - * The client/registerCapability request is sent from the server to the client - * to register for a new capability on the client side. - * Not all clients need to support dynamic capability registration. - * A client opts in via the ClientCapabilities.dynamicRegistration property - *

- * WARNING: This method doesn't formally exist in the LSP. It is actually - * called client/registerCapability. The reason we added it here is because - * of this: https://github.com/Microsoft/vscode-languageserver-node/issues/199 - */ - @JsonRequest("client/registerFeature") - CompletableFuture registerFeature(RegistrationParams params); - - } 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 88c37e256..a3db5cc8a 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.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; -import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; @@ -29,8 +28,6 @@ import org.eclipse.lsp4j.InitializeResult; import org.eclipse.lsp4j.MessageParams; import org.eclipse.lsp4j.MessageType; import org.eclipse.lsp4j.Range; -import org.eclipse.lsp4j.Registration; -import org.eclipse.lsp4j.RegistrationParams; import org.eclipse.lsp4j.ServerCapabilities; import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.TextDocumentSyncKind; @@ -120,31 +117,6 @@ public abstract class SimpleLanguageServer implements LanguageServer, LanguageCl this.CODE_ACTION_COMMAND_ID = "sts."+EXTENSION_ID+".codeAction"; } - @Override - public void initialized() { - Log.info("Initialized!"); - if (hasExecuteCommandSupport) { - RegistrationParams params = new RegistrationParams(ImmutableList.of( - new Registration( - UUID.randomUUID().toString(), - "workspace/executeCommand", - new ExecuteCommandOptions(ImmutableList.of( - CODE_ACTION_COMMAND_ID - )) - ) - )); - getWorkspaceService().onExecuteCommand(this::executeCommand); - Log.info("Registering capabilitie: "+params); - Mono.fromFuture(client.registerCapability(params)) - .otherwise((e) -> { - Log.warn("registerCapability failed, using non-standard 'registerFeature' instead.", e); - return Mono.fromFuture(client.registerFeature(params)); - }) - .doOnError(Log::log) - .subscribe(); - } - } - protected CompletableFuture executeCommand(ExecuteCommandParams params) { if (CODE_ACTION_COMMAND_ID.equals(params.getCommand())) { Assert.isLegal(params.getArguments().size()==2); @@ -175,23 +147,26 @@ public abstract class SimpleLanguageServer implements LanguageServer, LanguageCl this.workspaceRoot= Paths.get(rootPath).toAbsolutePath().normalize(); } this.hasCompletionSnippetSupport = safeGet(false, () -> params.getCapabilities().getTextDocument().getCompletion().getCompletionItem().getSnippetSupport()); - this.hasExecuteCommandSupport = safeGet(false, () -> params.getCapabilities().getWorkspace().getExecuteCommand().getDynamicRegistration()); + this.hasExecuteCommandSupport = safeGet(false, () -> params.getCapabilities().getWorkspace().getExecuteCommand()!=null); Log.info("workspaceRoot = "+workspaceRoot); Log.info("hasCompletionSnippetSupport = "+hasCompletionSnippetSupport); Log.info("hasExecuteCommandSupport = "+hasExecuteCommandSupport); InitializeResult result = new InitializeResult(); + if (hasExecuteCommandSupport) { + getWorkspaceService().onExecuteCommand(this::executeCommand); + } ServerCapabilities cap = getServerCapabilities(); result.setCapabilities(cap); return CompletableFuture.completedFuture(result); } - /** - * Get some info safely. If there's any kind of exception, ignore it - * and retutn default value instead. - */ + /** + * Get some info safely. If there's any kind of exception, ignore it + * and retutn default value instead. + */ private static T safeGet(T deflt, Callable getter) { try { T x = getter.call(); @@ -242,6 +217,11 @@ public abstract class SimpleLanguageServer implements LanguageServer, LanguageCl if (hasDocumentSymbolHandler()) { c.setDocumentSymbolProvider(true); } + if (hasExecuteCommandSupport && quickfixRegistry.hasFixes()) { + c.setExecuteCommandProvider(new ExecuteCommandOptions(ImmutableList.of( + CODE_ACTION_COMMAND_ID + ))); + } return c; } diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java index 32a2a8304..9280423c9 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java @@ -229,11 +229,6 @@ public class LanguageServerHarness { // TODO Auto-generated method stub } - - @Override - public CompletableFuture registerFeature(RegistrationParams params) { - return CompletableFuture.completedFuture(null); - } }); }