From af64ba01d378f7a549312c44b34ff396015e79a9 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Mon, 7 Nov 2016 17:29:54 -0800 Subject: [PATCH] Update to lsp4j --- .../SpringPropertiesIndexManager.java | 2 - .../completions/AbstractPropertyProposal.java | 3 +- .../PropertyCompletionFactory.java | 3 +- .../commons/commons-java/.classpath | 10 ++ .../commons-language-server/.classpath | 10 ++ .../commons/commons-language-server/pom.xml | 16 +- .../languageserver/LaunguageServerApp.java | 154 ++++++++++++++++++ .../completion/DocumentEdits.java | 3 +- .../completion/ICompletionProposal.java | 2 +- .../completion/VscodeCompletionEngine.java | 6 +- .../VscodeCompletionEngineAdapter.java | 31 ++-- .../util/CompletionHandler.java | 4 +- .../util/CompletionResolveHandler.java | 2 +- .../util/ShowMessageException.java | 9 +- .../util/SimpleLanguageServer.java | 97 ++++++----- .../util/SimpleTextDocumentService.java | 101 ++++++------ .../util/SimpleWorkspaceService.java | 13 +- .../languageserver/util/TextDocument.java | 17 +- .../util/TextDocumentContentChange.java | 2 +- .../commons/commons-util/.classpath | 10 ++ .../commons/commons-yaml/.classpath | 10 ++ .../completion/DefaultCompletionFactory.java | 3 +- .../language-server-test-harness/.classpath | 10 ++ .../language-server-test-harness/pom.xml | 16 +- .../languageserver/testharness/Editor.java | 17 +- .../testharness/LanguageServerHarness.java | 113 ++++++++----- .../testharness/TextDocumentInfo.java | 21 ++- vscode-extensions/commons/pom.xml | 27 ++- .../test/harness/AbstractPropsEditorTest.java | 5 +- .../ApplicationPropertiesLanguageServer.java | 10 +- .../vscode/application/properties/Main.java | 135 ++------------- .../ReplaceDeprecatedPropertyQuickfix.java | 3 +- .../test/ApplicationPropertiesEditorTest.java | 4 +- ...plicationPropertiesLanguageServerTest.java | 7 +- .../yaml/ApplicationYamlLanguageServer.java | 13 +- .../ide/vscode/application/yaml/Main.java | 111 ++----------- .../ReplaceDeprecatedYamlQuickfix.java | 21 +-- .../yaml/ApplicationYamlEditorTest.java | 4 +- .../ApplicationYamlLanguageServerTests.java | 8 +- .../ide/vscode/manifest/yaml/Main.java | 97 +---------- .../yaml/ManifestYamlLanguageServer.java | 13 +- .../yaml/ManifestYamlLanguageServerTest.java | 6 +- 42 files changed, 534 insertions(+), 615 deletions(-) create mode 100644 vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LaunguageServerApp.java diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertiesIndexManager.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertiesIndexManager.java index 24e594679..fd3c6b41c 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertiesIndexManager.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/SpringPropertiesIndexManager.java @@ -10,14 +10,12 @@ *******************************************************************************/ package org.springframework.ide.vscode.application.properties.metadata; -import java.nio.file.Path; import java.util.HashMap; import java.util.Map; import org.springframework.ide.vscode.application.properties.metadata.util.FuzzyMap; import org.springframework.ide.vscode.application.properties.metadata.util.Listener; import org.springframework.ide.vscode.application.properties.metadata.util.ListenerManager; -import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; /** diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/completions/AbstractPropertyProposal.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/completions/AbstractPropertyProposal.java index c7f4675fb..a9d38b0e5 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/completions/AbstractPropertyProposal.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/completions/AbstractPropertyProposal.java @@ -10,13 +10,12 @@ *******************************************************************************/ package org.springframework.ide.vscode.application.properties.metadata.completions; +import org.eclipse.lsp4j.CompletionItemKind; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.ScoreableProposal; import org.springframework.ide.vscode.commons.languageserver.util.IDocument; import org.springframework.ide.vscode.commons.yaml.schema.YType; -import io.typefox.lsapi.CompletionItemKind; - public abstract class AbstractPropertyProposal extends ScoreableProposal { protected final IDocument fDoc; diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/completions/PropertyCompletionFactory.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/completions/PropertyCompletionFactory.java index 8682fbb2e..360aedab3 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/completions/PropertyCompletionFactory.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/completions/PropertyCompletionFactory.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.springframework.ide.vscode.application.properties.metadata.completions; +import org.eclipse.lsp4j.CompletionItemKind; import org.springframework.ide.vscode.application.properties.metadata.PropertyInfo; import org.springframework.ide.vscode.application.properties.metadata.hints.ValueHintHoverInfo; import org.springframework.ide.vscode.application.properties.metadata.types.Type; @@ -24,8 +25,6 @@ import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFin import org.springframework.ide.vscode.commons.languageserver.util.IDocument; import org.springframework.ide.vscode.commons.yaml.schema.YType; -import io.typefox.lsapi.CompletionItemKind; - public class PropertyCompletionFactory { diff --git a/vscode-extensions/commons/commons-java/.classpath b/vscode-extensions/commons/commons-java/.classpath index af1430be1..8433ca6cd 100644 --- a/vscode-extensions/commons/commons-java/.classpath +++ b/vscode-extensions/commons/commons-java/.classpath @@ -22,5 +22,15 @@ + + + + + + + + + + diff --git a/vscode-extensions/commons/commons-language-server/.classpath b/vscode-extensions/commons/commons-language-server/.classpath index af1430be1..8433ca6cd 100644 --- a/vscode-extensions/commons/commons-language-server/.classpath +++ b/vscode-extensions/commons/commons-language-server/.classpath @@ -22,5 +22,15 @@ + + + + + + + + + + diff --git a/vscode-extensions/commons/commons-language-server/pom.xml b/vscode-extensions/commons/commons-language-server/pom.xml index f1d920758..9d24a1516 100644 --- a/vscode-extensions/commons/commons-language-server/pom.xml +++ b/vscode-extensions/commons/commons-language-server/pom.xml @@ -30,19 +30,9 @@ - io.typefox.lsapi - io.typefox.lsapi - ${lsapi-version} - - - io.typefox.lsapi - io.typefox.lsapi.services - ${lsapi-version} - - - io.typefox.lsapi - io.typefox.lsapi.annotations - ${lsapi-version} + org.eclipse.lsp4j + org.eclipse.lsp4j + ${lsp4j-version} diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LaunguageServerApp.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LaunguageServerApp.java new file mode 100644 index 000000000..0caed326d --- /dev/null +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/LaunguageServerApp.java @@ -0,0 +1,154 @@ +package org.springframework.ide.vscode.commons.languageserver; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.net.Socket; +import java.util.logging.Level; +import java.util.logging.Logger; + +import org.eclipse.lsp4j.jsonrpc.Launcher; +import org.eclipse.lsp4j.services.LanguageClient; +import org.eclipse.lsp4j.services.LanguageClientAware; +import org.eclipse.lsp4j.services.LanguageServer; +import org.springframework.ide.vscode.commons.languageserver.util.LoggingFormat; + +import com.google.inject.Provider; + +/** + * Abstract class meant to minimize the amount of code needed to + * write to create suitable 'main' method to launch a language server. + *

+ * The easiest way to use this is to create your own static main method. + * Then call this class's start method with a Provider as + * a argument. + *

+ * Alternatively, you can also subclass it and implement the abstract + * `createServer` method. + * + * @author Kris De Volder + */ +public abstract class LaunguageServerApp { + + public static void start(Provider languageServerFactory) throws IOException { + LaunguageServerApp app = new LaunguageServerApp() { + @Override + protected LanguageServer createServer() { + return languageServerFactory.get(); + } + }; + app.start(); + } + + protected static class Connection { + final InputStream in; + final OutputStream out; + final Socket socket; + + private Connection(InputStream in, OutputStream out, Socket socket) { + this.in = in; + this.out = out; + this.socket = socket; + } + + void dispose() { + if (in != null) { + try { + in.close(); + } catch (IOException e) { + LOG.log(Level.SEVERE, e.getMessage(), e); + } + } + if (out != null) { + try { + out.close(); + } catch (IOException e) { + LOG.log(Level.SEVERE, e.getMessage(), e); + } + } + if (socket != null) { + try { + socket.close(); + } catch (IOException e) { + LOG.log(Level.SEVERE, e.getMessage(), e); + } + } + } + } + + public void start() throws IOException { + LOG.info("Starting LS"); + Connection connection = null; + try { + LoggingFormat.startLogging(); + + connection = connectToNode(); + + run(connection); + } catch (Throwable t) { + LOG.log(Level.SEVERE, t.getMessage(), t); + System.exit(1); + } finally { + if (connection != null) { + connection.dispose(); + } + } + } + + private static Connection connectToNode() throws IOException { + String port = System.getProperty("server.port"); + + if (port != null) { + Socket socket = new Socket("localhost", Integer.parseInt(port)); + + InputStream in = socket.getInputStream(); + OutputStream out = socket.getOutputStream(); + + OutputStream intercept = new OutputStream() { + + @Override + public void write(int b) throws IOException { + out.write(b); + } + }; + + LOG.info("Connected to parent using socket on port " + port); + + return new Connection(in, intercept, socket); + } + else { + InputStream in = System.in; + PrintStream out = System.out; + + LOG.info("Connected to parent using stdio"); + + return new Connection(in, out, null); + } + } + + protected static final Logger LOG = Logger.getLogger("main"); + + /** + * Listen for requests from the parent node process. + * Send replies asynchronously. + * When the request stream is closed, wait for 5s for all outstanding responses to compute, then return. + */ + protected void run(Connection connection) { + LanguageServer server = createServer(); + boolean validate = false; // not totally sure what it does, disabling it for now. + Launcher launcher = Launcher.createLauncher(server, LanguageClient.class, connection.in, connection.out, validate, new PrintWriter(System.out)); + + if (server instanceof LanguageClientAware) { + LanguageClient client = launcher.getRemoteProxy(); + ((LanguageClientAware) server).connect(client); + } + + launcher.startListening(); + } + + protected abstract LanguageServer createServer(); + + +} diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/DocumentEdits.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/DocumentEdits.java index 5a667bba7..eb4803198 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/DocumentEdits.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/DocumentEdits.java @@ -12,6 +12,7 @@ package org.springframework.ide.vscode.commons.languageserver.completion; import java.util.ArrayList; +import org.eclipse.lsp4j.TextEdit; import org.springframework.ide.vscode.commons.languageserver.util.BadLocationException; import org.springframework.ide.vscode.commons.languageserver.util.IDocument; import org.springframework.ide.vscode.commons.languageserver.util.IRegion; @@ -19,8 +20,6 @@ import org.springframework.ide.vscode.commons.languageserver.util.Region; import org.springframework.ide.vscode.commons.languageserver.util.TextDocument; import org.springframework.ide.vscode.commons.util.Assert; -import io.typefox.lsapi.TextEdit; - /** * Helper to make it easier to create composite modifications to IDocument. *

diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/ICompletionProposal.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/ICompletionProposal.java index aa0f7e919..c2aaa9022 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/ICompletionProposal.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/ICompletionProposal.java @@ -1,6 +1,6 @@ package org.springframework.ide.vscode.commons.languageserver.completion; -import io.typefox.lsapi.CompletionItemKind; +import org.eclipse.lsp4j.CompletionItemKind; /** * Replaces STS/Eclipse's ICompletionProposal diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngine.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngine.java index 3b31ce17c..95c0cd26e 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngine.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngine.java @@ -2,9 +2,9 @@ package org.springframework.ide.vscode.commons.languageserver.completion; import java.util.concurrent.CompletableFuture; -import io.typefox.lsapi.CompletionItem; -import io.typefox.lsapi.CompletionList; -import io.typefox.lsapi.TextDocumentPositionParams; +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.CompletionList; +import org.eclipse.lsp4j.TextDocumentPositionParams; /** * Interface that needs to be implemented by a 'completion engine' which can be easily diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngineAdapter.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngineAdapter.java index ef10ea366..fde865c7f 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngineAdapter.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/completion/VscodeCompletionEngineAdapter.java @@ -5,6 +5,11 @@ import java.util.Collections; import java.util.List; import java.util.concurrent.CompletableFuture; +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.CompletionList; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.TextDocumentPositionParams; +import org.eclipse.lsp4j.TextEdit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits.TextReplace; @@ -15,14 +20,6 @@ import org.springframework.ide.vscode.commons.languageserver.util.TextDocument; import org.springframework.ide.vscode.commons.util.Futures; import org.springframework.ide.vscode.commons.util.StringUtil; -import io.typefox.lsapi.CompletionItem; -import io.typefox.lsapi.CompletionList; -import io.typefox.lsapi.TextDocumentPositionParams; -import io.typefox.lsapi.impl.CompletionItemImpl; -import io.typefox.lsapi.impl.CompletionListImpl; -import io.typefox.lsapi.impl.PositionImpl; -import io.typefox.lsapi.impl.TextEditImpl; - /** * Adapts a {@link ICompletionEngine}, wrapping it, to implement {@link VscodeCompletionEngine} */ @@ -54,15 +51,15 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { int offset = doc.toOffset(params.getPosition()); List completions = new ArrayList<>(engine.getCompletions(doc, offset)); Collections.sort(completions, ScoreableProposal.COMPARATOR); - CompletionListImpl list = new CompletionListImpl(); - list.setIncomplete(false); - List items = new ArrayList<>(completions.size()); + CompletionList list = new CompletionList(); + list.setIsIncomplete(false); + List items = new ArrayList<>(completions.size()); SortKeys sortkeys = new SortKeys(); int count = 0; for (ICompletionProposal c : completions) { count++; if (count>MAX_COMPLETIONS) { - list.setIncomplete(true); + list.setIsIncomplete(true); break; } try { @@ -80,8 +77,8 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { return SimpleTextDocumentService.NO_COMPLETIONS; } - private CompletionItemImpl adaptItem(TextDocument doc, ICompletionProposal completion, SortKeys sortkeys) throws Exception { - CompletionItemImpl item = new CompletionItemImpl(); + private CompletionItem adaptItem(TextDocument doc, ICompletionProposal completion, SortKeys sortkeys) throws Exception { + CompletionItem item = new CompletionItem(); item.setLabel(completion.getLabel()); item.setKind(completion.getKind()); item.setSortText(sortkeys.next()); @@ -90,7 +87,7 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { return item; } - private void adaptEdits(CompletionItemImpl item, TextDocument doc, DocumentEdits edits) throws Exception { + private void adaptEdits(CompletionItem item, TextDocument doc, DocumentEdits edits) throws Exception { TextReplace replaceEdit = edits.asReplacement(doc); if (replaceEdit==null) { //The original edit does nothing. @@ -98,7 +95,7 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { } else { TextDocument newDoc = doc.copy(); edits.apply(newDoc); - TextEditImpl vscodeEdit = new TextEditImpl(); + TextEdit vscodeEdit = new TextEdit(); vscodeEdit.setRange(newDoc.toRange(replaceEdit.start, replaceEdit.end-replaceEdit.start)); vscodeEdit.setNewText(vscodeIndentFix(vscodeEdit.getRange().getStart(), replaceEdit.newText)); //TODO: cursor offset within newText? for now we assume its always at the end. @@ -106,7 +103,7 @@ public class VscodeCompletionEngineAdapter implements VscodeCompletionEngine { } } - private String vscodeIndentFix(PositionImpl start, String newText) { + private String vscodeIndentFix(Position start, String newText) { //Vscode applies some magic indent to a multi-line edit text. We do everything ourself so we have adjust for the magic // and do some kind of 'inverse magic' here. int vscodeMagicIndent = start.getCharacter(); diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CompletionHandler.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CompletionHandler.java index 39e4d127a..5dc738bb7 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CompletionHandler.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CompletionHandler.java @@ -2,8 +2,8 @@ package org.springframework.ide.vscode.commons.languageserver.util; import java.util.concurrent.CompletableFuture; -import io.typefox.lsapi.CompletionList; -import io.typefox.lsapi.TextDocumentPositionParams; +import org.eclipse.lsp4j.CompletionList; +import org.eclipse.lsp4j.TextDocumentPositionParams; @FunctionalInterface public interface CompletionHandler { diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CompletionResolveHandler.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CompletionResolveHandler.java index 50d0ef3d9..d68fe4c9d 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CompletionResolveHandler.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/CompletionResolveHandler.java @@ -2,7 +2,7 @@ package org.springframework.ide.vscode.commons.languageserver.util; import java.util.concurrent.CompletableFuture; -import io.typefox.lsapi.CompletionItem; +import org.eclipse.lsp4j.CompletionItem; @FunctionalInterface public interface CompletionResolveHandler { diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/ShowMessageException.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/ShowMessageException.java index d87572564..6c936a5fc 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/ShowMessageException.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/ShowMessageException.java @@ -1,8 +1,7 @@ package org.springframework.ide.vscode.commons.languageserver.util; -import io.typefox.lsapi.MessageParams; -import io.typefox.lsapi.impl.MessageParamsImpl; -import io.typefox.lsapi.MessageType; +import org.eclipse.lsp4j.MessageParams; +import org.eclipse.lsp4j.MessageType; public class ShowMessageException extends RuntimeException { @@ -22,9 +21,9 @@ public class ShowMessageException extends RuntimeException { public static ShowMessageException warning(String message, Exception cause) { return create(MessageType.Warning, message, cause); } - + private static ShowMessageException create(MessageType warning, String message, Exception cause) { - MessageParamsImpl m = new MessageParamsImpl(); + MessageParams m = new MessageParams(); m.setMessage(message); m.setType(warning); diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java index 72b011d1a..1923c2b88 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleLanguageServer.java @@ -9,23 +9,21 @@ import java.util.function.Consumer; import java.util.logging.Level; import java.util.logging.Logger; +import org.eclipse.lsp4j.Diagnostic; +import org.eclipse.lsp4j.DiagnosticSeverity; +import org.eclipse.lsp4j.InitializeParams; +import org.eclipse.lsp4j.InitializeResult; +import org.eclipse.lsp4j.MessageParams; +import org.eclipse.lsp4j.MessageType; +import org.eclipse.lsp4j.ServerCapabilities; +import org.eclipse.lsp4j.services.LanguageClient; +import org.eclipse.lsp4j.services.LanguageClientAware; +import org.eclipse.lsp4j.services.LanguageServer; 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.reconcile.ProblemSeverity; import org.springframework.ide.vscode.commons.languageserver.reconcile.ReconcileProblem; - -import io.typefox.lsapi.DiagnosticSeverity; -import io.typefox.lsapi.InitializeParams; -import io.typefox.lsapi.InitializeResult; -import io.typefox.lsapi.MessageParams; -import io.typefox.lsapi.MessageType; -import io.typefox.lsapi.ShowMessageRequestParams; -import io.typefox.lsapi.impl.DiagnosticImpl; -import io.typefox.lsapi.impl.InitializeResultImpl; -import io.typefox.lsapi.impl.MessageParamsImpl; -import io.typefox.lsapi.impl.ServerCapabilitiesImpl; -import io.typefox.lsapi.services.LanguageServer; -import io.typefox.lsapi.services.WindowService; +import org.springframework.ide.vscode.commons.util.Futures; /** * Abstract base class to implement LanguageServer. Bits and pieces copied from @@ -33,7 +31,7 @@ import io.typefox.lsapi.services.WindowService; * here so we can try to keep the subclass itself more 'clutter free' and focus on * what its really doing and not the 'wiring and plumbing'. */ -public abstract class SimpleLanguageServer implements LanguageServer { +public abstract class SimpleLanguageServer implements LanguageServer, LanguageClientAware { private static final Logger LOG = Logger.getLogger(SimpleLanguageServer.class.getName()); @@ -45,6 +43,13 @@ public abstract class SimpleLanguageServer implements LanguageServer { private SimpleWorkspaceService workspace; + private LanguageClient client; + + @Override + public void connect(LanguageClient client) { + this.client = client; + } + @Override public CompletableFuture initialize(InitializeParams params) { // LOG.info("Initializing"); @@ -56,33 +61,35 @@ public abstract class SimpleLanguageServer implements LanguageServer { // LOG.info("workspaceRoot = "+workspaceRoot); } - InitializeResultImpl result = new InitializeResultImpl(); + InitializeResult result = new InitializeResult(); - ServerCapabilitiesImpl cap = getServerCapabilities(); + ServerCapabilities cap = getServerCapabilities(); result.setCapabilities(cap); return CompletableFuture.completedFuture(result); } - @Override - public WindowService getWindowService() { - return new WindowService() { - @Override - public void onShowMessage(Consumer callback) { - showMessage = callback; - } + //TODO: What happened to WindowService? Seems to be removed in lsp4j. So how can we show messages? - @Override - public void onShowMessageRequest(Consumer callback) { - - } - - @Override - public void onLogMessage(Consumer callback) { - - } - }; - } +// @Override +// public WindowService getWindowService() { +// return new WindowService() { +// @Override +// public void onShowMessage(Consumer callback) { +// showMessage = callback; +// } +// +// @Override +// public void onShowMessageRequest(Consumer callback) { +// +// } +// +// @Override +// public void onLogMessage(Consumer callback) { +// +// } +// }; +// } public void onError(String message, Throwable error) { if (error instanceof ShowMessageException) @@ -90,7 +97,7 @@ public abstract class SimpleLanguageServer implements LanguageServer { else { LOG.log(Level.SEVERE, message, error); - MessageParamsImpl m = new MessageParamsImpl(); + MessageParams m = new MessageParams(); m.setMessage(message); m.setType(MessageType.Error); @@ -99,10 +106,11 @@ public abstract class SimpleLanguageServer implements LanguageServer { } } - protected abstract ServerCapabilitiesImpl getServerCapabilities(); + protected abstract ServerCapabilities getServerCapabilities(); @Override - public void shutdown() { + public CompletableFuture shutdown() { + return Futures.of(null); } @Override @@ -123,7 +131,7 @@ public abstract class SimpleLanguageServer implements LanguageServer { } protected SimpleTextDocumentService createTextDocumentService() { - return new SimpleTextDocumentService(); + return new SimpleTextDocumentService(this); } public SimpleWorkspaceService createWorkspaceService() { @@ -138,11 +146,6 @@ public abstract class SimpleLanguageServer implements LanguageServer { return workspace; } - @Override - public void onTelemetryEvent(Consumer callback) { - //TODO: not sure what this is for exactly. We just stub it and do nothing for now. - } - /** * Convenience method. Subclasses can call this to use a {@link IReconcileEngine} ported * from old STS codebase to validate a given {@link TextDocument} and publish Diagnostics. @@ -152,7 +155,7 @@ public abstract class SimpleLanguageServer implements LanguageServer { SimpleTextDocumentService documents = getTextDocumentService(); IProblemCollector problems = new IProblemCollector() { - private List diagnostics = new ArrayList<>(); + private List diagnostics = new ArrayList<>(); @Override public void endCollecting() { @@ -168,7 +171,7 @@ public abstract class SimpleLanguageServer implements LanguageServer { public void accept(ReconcileProblem problem) { DiagnosticSeverity severity = getDiagnosticSeverity(problem); if (severity!=null) { - DiagnosticImpl d = new DiagnosticImpl(); + Diagnostic d = new Diagnostic(); d.setCode(problem.getCode()); d.setMessage(problem.getMessage()); d.setRange(doc.toRange(problem.getOffset(), problem.getLength())); @@ -193,4 +196,8 @@ public abstract class SimpleLanguageServer implements LanguageServer { }; engine.reconcile(doc, problems); } + + public LanguageClient getClient() { + return client; + } } diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java index 29eeaa5c8..1afe6bb6d 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleTextDocumentService.java @@ -10,53 +10,54 @@ import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; import java.util.logging.Logger; +import org.eclipse.lsp4j.CodeActionParams; +import org.eclipse.lsp4j.CodeLens; +import org.eclipse.lsp4j.CodeLensParams; +import org.eclipse.lsp4j.Command; +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.CompletionList; +import org.eclipse.lsp4j.Diagnostic; +import org.eclipse.lsp4j.DidChangeTextDocumentParams; +import org.eclipse.lsp4j.DidCloseTextDocumentParams; +import org.eclipse.lsp4j.DidOpenTextDocumentParams; +import org.eclipse.lsp4j.DidSaveTextDocumentParams; +import org.eclipse.lsp4j.DocumentFormattingParams; +import org.eclipse.lsp4j.DocumentHighlight; +import org.eclipse.lsp4j.DocumentOnTypeFormattingParams; +import org.eclipse.lsp4j.DocumentRangeFormattingParams; +import org.eclipse.lsp4j.DocumentSymbolParams; +import org.eclipse.lsp4j.Hover; +import org.eclipse.lsp4j.Location; +import org.eclipse.lsp4j.PublishDiagnosticsParams; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.ReferenceParams; +import org.eclipse.lsp4j.RenameParams; +import org.eclipse.lsp4j.SignatureHelp; +import org.eclipse.lsp4j.SymbolInformation; +import org.eclipse.lsp4j.TextDocumentContentChangeEvent; +import org.eclipse.lsp4j.TextDocumentPositionParams; +import org.eclipse.lsp4j.TextEdit; +import org.eclipse.lsp4j.VersionedTextDocumentIdentifier; +import org.eclipse.lsp4j.WorkspaceEdit; +import org.eclipse.lsp4j.services.LanguageClient; +import org.eclipse.lsp4j.services.TextDocumentService; import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.util.Futures; -import io.typefox.lsapi.CodeActionParams; -import io.typefox.lsapi.CodeLens; -import io.typefox.lsapi.CodeLensParams; -import io.typefox.lsapi.Command; -import io.typefox.lsapi.CompletionItem; -import io.typefox.lsapi.CompletionList; -import io.typefox.lsapi.DidChangeTextDocumentParams; -import io.typefox.lsapi.DidCloseTextDocumentParams; -import io.typefox.lsapi.DidOpenTextDocumentParams; -import io.typefox.lsapi.DidSaveTextDocumentParams; -import io.typefox.lsapi.DocumentFormattingParams; -import io.typefox.lsapi.DocumentHighlight; -import io.typefox.lsapi.DocumentOnTypeFormattingParams; -import io.typefox.lsapi.DocumentRangeFormattingParams; -import io.typefox.lsapi.DocumentSymbolParams; -import io.typefox.lsapi.Hover; -import io.typefox.lsapi.Location; -import io.typefox.lsapi.PublishDiagnosticsParams; -import io.typefox.lsapi.Range; -import io.typefox.lsapi.ReferenceParams; -import io.typefox.lsapi.RenameParams; -import io.typefox.lsapi.SignatureHelp; -import io.typefox.lsapi.SymbolInformation; -import io.typefox.lsapi.TextDocumentContentChangeEvent; -import io.typefox.lsapi.TextDocumentPositionParams; -import io.typefox.lsapi.TextEdit; -import io.typefox.lsapi.VersionedTextDocumentIdentifier; -import io.typefox.lsapi.WorkspaceEdit; -import io.typefox.lsapi.impl.CompletionListImpl; -import io.typefox.lsapi.impl.DiagnosticImpl; -import io.typefox.lsapi.impl.PublishDiagnosticsParamsImpl; -import io.typefox.lsapi.services.TextDocumentService; - public class SimpleTextDocumentService implements TextDocumentService { - private static final Logger LOG = Logger.getLogger(SimpleTextDocumentService.class.getName()); - - private Consumer publishDiagnostics = (p) -> {}; + private static final Logger LOG = Logger.getLogger(SimpleTextDocumentService.class.getName()); + final private SimpleLanguageServer server; private Map documents = new HashMap<>(); private ListenerList documentChangeListeners = new ListenerList<>(); private CompletionHandler completionHandler = null; private CompletionResolveHandler completionResolveHandler = null; + public SimpleTextDocumentService(SimpleLanguageServer server) { + this.server = server; + } + public synchronized void onCompletion(CompletionHandler h) { Assert.isNull("A completion handler is already set, multiple handlers not supported yet", completionHandler); this.completionHandler = h; @@ -158,7 +159,7 @@ public class SimpleTextDocumentService implements TextDocumentService { } public final static CompletableFuture NO_COMPLETIONS = Futures.of( - new CompletionListImpl(false, Collections.emptyList())); + new CompletionList(false, Collections.emptyList())); @Override @@ -203,12 +204,6 @@ public class SimpleTextDocumentService implements TextDocumentService { return null; } - @Override - public CompletableFuture documentHighlight(TextDocumentPositionParams position) { - // TODO Auto-generated method stub - return null; - } - @Override public CompletableFuture> documentSymbol(DocumentSymbolParams params) { // TODO Auto-generated method stub @@ -263,17 +258,13 @@ public class SimpleTextDocumentService implements TextDocumentService { } - @Override - public synchronized void onPublishDiagnostics(Consumer callback) { - publishDiagnostics = publishDiagnostics.andThen(callback); - } - - public void publishDiagnostics(TextDocument doc, List diagnostics) { - if (diagnostics!=null) { - PublishDiagnosticsParamsImpl params = new PublishDiagnosticsParamsImpl(); + public void publishDiagnostics(TextDocument doc, List diagnostics) { + LanguageClient client = server.getClient(); + if (client!=null && diagnostics!=null) { + PublishDiagnosticsParams params = new PublishDiagnosticsParams(); params.setUri(doc.getUri()); params.setDiagnostics(diagnostics); - publishDiagnostics.accept(params); + client.publishDiagnostics(params); } } @@ -281,4 +272,10 @@ public class SimpleTextDocumentService implements TextDocumentService { return documents.get(params.getTextDocument().getUri()); } + @Override + public CompletableFuture> documentHighlight(TextDocumentPositionParams position) { + // TODO Auto-generated method stub + return null; + } + } diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleWorkspaceService.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleWorkspaceService.java index 2de8347a8..bd9353164 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleWorkspaceService.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/SimpleWorkspaceService.java @@ -4,11 +4,11 @@ import java.util.List; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; -import io.typefox.lsapi.DidChangeConfigurationParams; -import io.typefox.lsapi.DidChangeWatchedFilesParams; -import io.typefox.lsapi.SymbolInformation; -import io.typefox.lsapi.WorkspaceSymbolParams; -import io.typefox.lsapi.services.WorkspaceService; +import org.eclipse.lsp4j.DidChangeConfigurationParams; +import org.eclipse.lsp4j.DidChangeWatchedFilesParams; +import org.eclipse.lsp4j.SymbolInformation; +import org.eclipse.lsp4j.WorkspaceSymbolParams; +import org.eclipse.lsp4j.services.WorkspaceService; public class SimpleWorkspaceService implements WorkspaceService { @@ -21,7 +21,7 @@ public class SimpleWorkspaceService implements WorkspaceService { } @Override - public void didChangeConfiguraton(DidChangeConfigurationParams params) { + public void didChangeConfiguration(DidChangeConfigurationParams params) { configurationListeners.fire(new Settings(params.getSettings())); } @@ -35,4 +35,5 @@ public class SimpleWorkspaceService implements WorkspaceService { configurationListeners.add(l); } + } diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocument.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocument.java index 5eaea2f9d..99a764ef2 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocument.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocument.java @@ -5,11 +5,9 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import io.typefox.lsapi.Position; -import io.typefox.lsapi.Range; -import io.typefox.lsapi.TextDocumentContentChangeEvent; -import io.typefox.lsapi.impl.PositionImpl; -import io.typefox.lsapi.impl.RangeImpl; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.TextDocumentContentChangeEvent; public class TextDocument implements IDocument { @@ -34,6 +32,7 @@ public class TextDocument implements IDocument { this._lineStarts = other._lineStarts; //no need to reparse lines. } + @Override public String getUri() { return uri; } @@ -67,9 +66,9 @@ public class TextDocument implements IDocument { * TextDocument because it requires splitting document into lines to determine * line numbers from offsets. */ - public RangeImpl toRange(int offset, int length) { + public Range toRange(int offset, int length) { int end = offset + length; - RangeImpl range = new RangeImpl(); + Range range = new Range(); range.setStart(toPosition(offset)); range.setEnd(toPosition(end)); return range; @@ -93,11 +92,11 @@ public class TextDocument implements IDocument { } - public PositionImpl toPosition(int offset) { + public Position toPosition(int offset) { int line = lineNumber(offset); int startOfLine = startOfLine(line); int column = offset - startOfLine; - PositionImpl pos = new PositionImpl(); + Position pos = new Position(); pos.setCharacter(column); pos.setLine(line); return pos; diff --git a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocumentContentChange.java b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocumentContentChange.java index f63515f55..3609203d3 100644 --- a/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocumentContentChange.java +++ b/vscode-extensions/commons/commons-language-server/src/main/java/org/springframework/ide/vscode/commons/languageserver/util/TextDocumentContentChange.java @@ -1,6 +1,6 @@ package org.springframework.ide.vscode.commons.languageserver.util; -import io.typefox.lsapi.TextDocumentContentChangeEvent; +import org.eclipse.lsp4j.TextDocumentContentChangeEvent; public class TextDocumentContentChange { diff --git a/vscode-extensions/commons/commons-util/.classpath b/vscode-extensions/commons/commons-util/.classpath index af1430be1..8433ca6cd 100644 --- a/vscode-extensions/commons/commons-util/.classpath +++ b/vscode-extensions/commons/commons-util/.classpath @@ -22,5 +22,15 @@ + + + + + + + + + + diff --git a/vscode-extensions/commons/commons-yaml/.classpath b/vscode-extensions/commons/commons-yaml/.classpath index af1430be1..8433ca6cd 100644 --- a/vscode-extensions/commons/commons-yaml/.classpath +++ b/vscode-extensions/commons/commons-yaml/.classpath @@ -22,5 +22,15 @@ + + + + + + + + + + diff --git a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/DefaultCompletionFactory.java b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/DefaultCompletionFactory.java index 3465ac071..d5092f145 100644 --- a/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/DefaultCompletionFactory.java +++ b/vscode-extensions/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/completion/DefaultCompletionFactory.java @@ -1,5 +1,6 @@ package org.springframework.ide.vscode.commons.yaml.completion; +import org.eclipse.lsp4j.CompletionItemKind; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; import org.springframework.ide.vscode.commons.languageserver.completion.ScoreableProposal; @@ -8,8 +9,6 @@ import org.springframework.ide.vscode.commons.yaml.schema.YType; import org.springframework.ide.vscode.commons.yaml.schema.YTypeUtil; import org.springframework.ide.vscode.commons.yaml.schema.YTypedProperty; -import io.typefox.lsapi.CompletionItemKind; - public class DefaultCompletionFactory implements CompletionFactory { public static class BeanPropertyProposal extends ScoreableProposal { diff --git a/vscode-extensions/commons/language-server-test-harness/.classpath b/vscode-extensions/commons/language-server-test-harness/.classpath index af1430be1..8433ca6cd 100644 --- a/vscode-extensions/commons/language-server-test-harness/.classpath +++ b/vscode-extensions/commons/language-server-test-harness/.classpath @@ -22,5 +22,15 @@ + + + + + + + + + + diff --git a/vscode-extensions/commons/language-server-test-harness/pom.xml b/vscode-extensions/commons/language-server-test-harness/pom.xml index 76b81e7c5..eecb6c90f 100644 --- a/vscode-extensions/commons/language-server-test-harness/pom.xml +++ b/vscode-extensions/commons/language-server-test-harness/pom.xml @@ -15,19 +15,9 @@ - io.typefox.lsapi - io.typefox.lsapi - ${lsapi-version} - - - io.typefox.lsapi - io.typefox.lsapi.services - ${lsapi-version} - - - io.typefox.lsapi - io.typefox.lsapi.annotations - ${lsapi-version} + org.eclipse.lsp4j + org.eclipse.lsp4j + ${lsp4j-version} org.springframework.ide.vscode diff --git a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java index 27713dfaa..134e16670 100644 --- a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java +++ b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java @@ -13,18 +13,17 @@ import java.util.stream.Collectors; import javax.swing.text.BadLocationException; +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.CompletionList; +import org.eclipse.lsp4j.Diagnostic; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.PublishDiagnosticsParams; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.TextEdit; import org.junit.Assert; import com.google.common.base.Strings; -import io.typefox.lsapi.CompletionItem; -import io.typefox.lsapi.CompletionList; -import io.typefox.lsapi.Diagnostic; -import io.typefox.lsapi.Position; -import io.typefox.lsapi.PublishDiagnosticsParams; -import io.typefox.lsapi.Range; -import io.typefox.lsapi.TextEdit; - public class Editor { static class EditorState { @@ -206,7 +205,7 @@ public class Editor { // test harness. PublishDiagnosticsParams diagnostics = harness.getDiagnostics(document); if (diagnostics!=null) { - return (List) diagnostics.getDiagnostics(); + return diagnostics.getDiagnostics(); } return Collections.emptyList(); } diff --git a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java index 61c4a8c11..bd90c7065 100644 --- a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java +++ b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/LanguageServerHarness.java @@ -13,29 +13,32 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.concurrent.Callable; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import org.assertj.core.api.Condition; - -import io.typefox.lsapi.CompletionItem; -import io.typefox.lsapi.CompletionList; -import io.typefox.lsapi.Diagnostic; -import io.typefox.lsapi.DiagnosticSeverity; -import io.typefox.lsapi.InitializeResult; -import io.typefox.lsapi.Position; -import io.typefox.lsapi.PublishDiagnosticsParams; -import io.typefox.lsapi.Range; -import io.typefox.lsapi.TextDocumentSyncKind; -import io.typefox.lsapi.impl.ClientCapabilitiesImpl; -import io.typefox.lsapi.impl.DidChangeTextDocumentParamsImpl; -import io.typefox.lsapi.impl.DidOpenTextDocumentParamsImpl; -import io.typefox.lsapi.impl.InitializeParamsImpl; -import io.typefox.lsapi.impl.PositionImpl; -import io.typefox.lsapi.impl.TextDocumentContentChangeEventImpl; -import io.typefox.lsapi.impl.TextDocumentItemImpl; -import io.typefox.lsapi.impl.TextDocumentPositionParamsImpl; -import io.typefox.lsapi.impl.VersionedTextDocumentIdentifierImpl; -import io.typefox.lsapi.services.LanguageServer; +import org.eclipse.lsp4j.ClientCapabilities; +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.CompletionList; +import org.eclipse.lsp4j.Diagnostic; +import org.eclipse.lsp4j.DiagnosticSeverity; +import org.eclipse.lsp4j.DidChangeTextDocumentParams; +import org.eclipse.lsp4j.DidOpenTextDocumentParams; +import org.eclipse.lsp4j.InitializeParams; +import org.eclipse.lsp4j.InitializeResult; +import org.eclipse.lsp4j.MessageParams; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.PublishDiagnosticsParams; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.ShowMessageRequestParams; +import org.eclipse.lsp4j.TextDocumentContentChangeEvent; +import org.eclipse.lsp4j.TextDocumentItem; +import org.eclipse.lsp4j.TextDocumentPositionParams; +import org.eclipse.lsp4j.TextDocumentSyncKind; +import org.eclipse.lsp4j.VersionedTextDocumentIdentifier; +import org.eclipse.lsp4j.services.LanguageClient; +import org.eclipse.lsp4j.services.LanguageClientAware; +import org.eclipse.lsp4j.services.LanguageServer; public class LanguageServerHarness { @@ -68,7 +71,7 @@ public class LanguageServerHarness { public TextDocumentInfo readFile(File file) throws Exception { byte[] encoded = Files.readAllBytes(file.toPath()); String content = new String(encoded, getEncoding()); - TextDocumentItemImpl document = new TextDocumentItemImpl(); + TextDocumentItem document = new TextDocumentItem(); document.setText(content); document.setUri(file.toURI().toString()); document.setVersion(getFirstVersion()); @@ -76,9 +79,9 @@ public class LanguageServerHarness { return new TextDocumentInfo(document); } - private synchronized TextDocumentItemImpl setDocumentContent(String uri, String newContent) { + private synchronized TextDocumentItem setDocumentContent(String uri, String newContent) { TextDocumentInfo o = documents.get(uri); - TextDocumentItemImpl n = new TextDocumentItemImpl(); + TextDocumentItem n = new TextDocumentItem(); n.setLanguageId(o.getLanguageId()); n.setText(newContent); n.setVersion(o.getVersion()+1); @@ -106,19 +109,50 @@ public class LanguageServerHarness { public InitializeResult intialize(File workspaceRoot) throws Exception { server = factory.call(); int parentPid = random.nextInt(40000)+1000; - InitializeParamsImpl initParams = new InitializeParamsImpl(); + InitializeParams initParams = new InitializeParams(); initParams.setRootPath(workspaceRoot== null?null:workspaceRoot.toString()); initParams.setProcessId(parentPid); - ClientCapabilitiesImpl clientCap = new ClientCapabilitiesImpl(); + ClientCapabilities clientCap = new ClientCapabilities(); initParams.setCapabilities(clientCap); initResult = server.initialize(initParams).get(); + if (server instanceof LanguageClientAware) { + ((LanguageClientAware) server).connect(new LanguageClient() { + @Override + public void telemetryEvent(Object object) { + // TODO Auto-generated method stub - server.getTextDocumentService().onPublishDiagnostics(this::receiveDiagnostics); + } + + @Override + public CompletableFuture showMessageRequest(ShowMessageRequestParams requestParams) { + // TODO Auto-generated method stub + return null; + } + + @Override + public void showMessage(MessageParams messageParams) { + // TODO Auto-generated method stub + + } + + @Override + public void publishDiagnostics(PublishDiagnosticsParams diagnostics) { + receiveDiagnostics(diagnostics); + } + + @Override + public void logMessage(MessageParams message) { + // TODO Auto-generated method stub + + } + }); + + } return initResult; } public TextDocumentInfo openDocument(TextDocumentInfo documentInfo) throws Exception { - DidOpenTextDocumentParamsImpl didOpen = new DidOpenTextDocumentParamsImpl(); + DidOpenTextDocumentParams didOpen = new DidOpenTextDocumentParams(); didOpen.setTextDocument(documentInfo.getDocument()); didOpen.setText(documentInfo.getText()); didOpen.setUri(documentInfo.getUri()); @@ -133,9 +167,9 @@ public class LanguageServerHarness { } public TextDocumentInfo changeDocument(String uri, String newContent) throws Exception { - TextDocumentItemImpl textDocument = setDocumentContent(uri, newContent); - DidChangeTextDocumentParamsImpl didChange = new DidChangeTextDocumentParamsImpl(); - VersionedTextDocumentIdentifierImpl version = new VersionedTextDocumentIdentifierImpl(); + TextDocumentItem textDocument = setDocumentContent(uri, newContent); + DidChangeTextDocumentParams didChange = new DidChangeTextDocumentParams(); + VersionedTextDocumentIdentifier version = new VersionedTextDocumentIdentifier(); version.setUri(uri); version.setVersion(textDocument.getVersion()); didChange.setTextDocument(version); @@ -145,7 +179,7 @@ public class LanguageServerHarness { case Incremental: throw new IllegalStateException("Incremental sync not yet supported by this test harness"); case Full: - TextDocumentContentChangeEventImpl change = new TextDocumentContentChangeEventImpl(); + TextDocumentContentChangeEvent change = new TextDocumentContentChangeEvent(); change.setText(newContent); didChange.setContentChanges(Collections.singletonList(change)); break; @@ -202,23 +236,12 @@ public class LanguageServerHarness { } public CompletionList getCompletions(TextDocumentInfo doc, Position cursor) throws Exception { - TextDocumentPositionParamsImpl params = new TextDocumentPositionParamsImpl(); - params.setPosition(toImpl(cursor)); + TextDocumentPositionParams params = new TextDocumentPositionParams(); + params.setPosition(cursor); params.setTextDocument(doc.getId()); return server.getTextDocumentService().completion(params).get(); } - private PositionImpl toImpl(Position pos) { - if (pos instanceof PositionImpl) { - return (PositionImpl) pos; - } else { - PositionImpl imp = new PositionImpl(); - imp.setCharacter(pos.getCharacter()); - imp.setLine(pos.getLine()); - return imp; - } - } - private CompletionItem resolveCompletionItem(CompletionItem unresolved) { try { return server.getTextDocumentService().resolveCompletionItem(unresolved).get(); @@ -238,7 +261,7 @@ public class LanguageServerHarness { } public synchronized TextDocumentInfo createWorkingCopy(String contents) throws Exception { - TextDocumentItemImpl doc = new TextDocumentItemImpl(); + TextDocumentItem doc = new TextDocumentItem(); doc.setLanguageId(getLanguageId()); doc.setText(contents); doc.setUri(createTempUri()); diff --git a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/TextDocumentInfo.java b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/TextDocumentInfo.java index 015d30ee6..85e285b2a 100644 --- a/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/TextDocumentInfo.java +++ b/vscode-extensions/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/TextDocumentInfo.java @@ -5,11 +5,10 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import io.typefox.lsapi.Position; -import io.typefox.lsapi.Range; -import io.typefox.lsapi.impl.PositionImpl; -import io.typefox.lsapi.impl.TextDocumentIdentifierImpl; -import io.typefox.lsapi.impl.TextDocumentItemImpl; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.TextDocumentItem; /** * Deprecated, we should get rid of this class and use {@link TextDocument}. @@ -19,11 +18,11 @@ public class TextDocumentInfo { Pattern NEWLINE = Pattern.compile("\\r|\\n|\\r\\n|\\n\\r"); - private final TextDocumentItemImpl document; + private final TextDocumentItem document; private int[] _lineStarts; - public TextDocumentInfo(TextDocumentItemImpl document) { + public TextDocumentInfo(TextDocumentItem document) { this.document = document; } @@ -43,7 +42,7 @@ public class TextDocumentInfo { return getDocument().getUri(); } - public TextDocumentItemImpl getDocument() { + public TextDocumentItem getDocument() { return document; } @@ -103,7 +102,7 @@ public class TextDocumentInfo { int line = lineNumber(offset); int startOfLine = startOfLine(line); int column = offset - startOfLine; - PositionImpl pos = new PositionImpl(); + Position pos = new Position(); pos.setCharacter(column); pos.setLine(line); return pos; @@ -126,8 +125,8 @@ public class TextDocumentInfo { return lineNumber; } - public TextDocumentIdentifierImpl getId() { - TextDocumentIdentifierImpl id = new TextDocumentIdentifierImpl(); + public TextDocumentIdentifier getId() { + TextDocumentIdentifier id = new TextDocumentIdentifier(); id.setUri(getUri()); return id; } diff --git a/vscode-extensions/commons/pom.xml b/vscode-extensions/commons/pom.xml index 85f060c76..ecb25f2a4 100644 --- a/vscode-extensions/commons/pom.xml +++ b/vscode-extensions/commons/pom.xml @@ -22,6 +22,31 @@ properties-editor-test-harness + + + lsp4j-snapshots-repo + lsp4j-snapshots-repo + http://services.typefox.io/open-source/jenkins/job/lsp4j/lastSuccessfulBuild/artifact/build/maven-repository/ + + true + + + true + + + + sonatype-nexus-snapshots + Sonatype Nexus Snapshots + https://oss.sonatype.org/content/repositories/snapshots + + true + + + true + + + + 1.17 4.11 @@ -30,7 +55,7 @@ 19.0 2.5.0 2.10 - 0.3.0 + 0.1.0-SNAPSHOT 3.0.2.RELEASE diff --git a/vscode-extensions/commons/properties-editor-test-harness/src/main/java/org/springframework/ide/vscode/properties/editor/test/harness/AbstractPropsEditorTest.java b/vscode-extensions/commons/properties-editor-test-harness/src/main/java/org/springframework/ide/vscode/properties/editor/test/harness/AbstractPropsEditorTest.java index 15a4813f6..0c99ebd97 100644 --- a/vscode-extensions/commons/properties-editor-test-harness/src/main/java/org/springframework/ide/vscode/properties/editor/test/harness/AbstractPropsEditorTest.java +++ b/vscode-extensions/commons/properties-editor-test-harness/src/main/java/org/springframework/ide/vscode/properties/editor/test/harness/AbstractPropsEditorTest.java @@ -9,6 +9,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; +import org.eclipse.lsp4j.CompletionItem; import org.junit.Before; import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil; @@ -20,10 +21,8 @@ import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguage import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject; import org.springframework.ide.vscode.languageserver.testharness.Editor; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; -import org.springframework.ide.vscode.properties.editor.test.harness.PropertyIndexHarness.ItemConfigurer; import org.springframework.ide.vscode.project.harness.ProjectsHarness; - -import io.typefox.lsapi.CompletionItem; +import org.springframework.ide.vscode.properties.editor.test.harness.PropertyIndexHarness.ItemConfigurer; public abstract class AbstractPropsEditorTest { diff --git a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/ApplicationPropertiesLanguageServer.java b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/ApplicationPropertiesLanguageServer.java index d788c0a09..4c8e61357 100644 --- a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/ApplicationPropertiesLanguageServer.java +++ b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/ApplicationPropertiesLanguageServer.java @@ -10,10 +10,11 @@ *******************************************************************************/ package org.springframework.ide.vscode.application.properties; +import org.eclipse.lsp4j.ServerCapabilities; +import org.eclipse.lsp4j.TextDocumentSyncKind; import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtilProvider; import org.springframework.ide.vscode.application.properties.reconcile.SpringPropertiesReconcileEngine; -import org.springframework.ide.vscode.commons.languageserver.reconcile.BadWordReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; @@ -22,9 +23,6 @@ import org.springframework.ide.vscode.java.properties.antlr.parser.AntlrParser; import org.springframework.ide.vscode.java.properties.parser.ParseResults; import org.springframework.ide.vscode.java.properties.parser.Parser; -import io.typefox.lsapi.TextDocumentSyncKind; -import io.typefox.lsapi.impl.ServerCapabilitiesImpl; - /** * Language Server for Spring Boot Application Properties files * @@ -88,8 +86,8 @@ public class ApplicationPropertiesLanguageServer extends SimpleLanguageServer { // } @Override - protected ServerCapabilitiesImpl getServerCapabilities() { - ServerCapabilitiesImpl c = new ServerCapabilitiesImpl(); + protected ServerCapabilities getServerCapabilities() { + ServerCapabilities c = new ServerCapabilities(); c.setTextDocumentSync(TextDocumentSyncKind.Full); diff --git a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/Main.java b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/Main.java index 0f81bb463..0ccbe37f1 100644 --- a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/Main.java +++ b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/Main.java @@ -6,146 +6,39 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * Pivotal, Inc. - initial API and implementation + * Pivotal, Inc. - initial API and implementation *******************************************************************************/ package org.springframework.ide.vscode.application.properties; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.util.concurrent.ExecutionException; -import java.util.logging.Level; import java.util.logging.Logger; +import org.eclipse.lsp4j.services.LanguageServer; import org.springframework.ide.vscode.application.properties.metadata.DefaultSpringPropertyIndexProvider; import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtilProvider; +import org.springframework.ide.vscode.commons.languageserver.LaunguageServerApp; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.util.IDocument; -import org.springframework.ide.vscode.commons.languageserver.util.LoggingFormat; - -import io.typefox.lsapi.services.json.LoggingJsonAdapter; /** * Starts up Language Server process * * @author Alex Boyko + * @author Kris De Volder * */ public class Main { - private static final Logger LOG = Logger.getLogger("main"); + + public static void main(String[] args) throws IOException { + LaunguageServerApp.start(() -> { + JavaProjectFinder javaProjectFinder = JavaProjectFinder.DEFAULT; + SpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectFinder); + TypeUtilProvider typeUtilProvider = (IDocument doc) -> new TypeUtil(javaProjectFinder.find(doc)); + LanguageServer server = new ApplicationPropertiesLanguageServer(indexProvider, typeUtilProvider); + return server; + }); + } - public static void main(String[] args) throws IOException { - LOG.info("Starting LS"); - Connection connection = null; - try { - LoggingFormat.startLogging(); - - connection = connectToNode(); - - run(connection); - } catch (Throwable t) { - LOG.log(Level.SEVERE, t.getMessage(), t); - System.exit(1); - } finally { - if (connection != null) { - connection.dispose(); - } - } - } - - private static Connection connectToNode() throws IOException { - String port = System.getProperty("server.port"); - - if (port != null) { - Socket socket = new Socket("localhost", Integer.parseInt(port)); - - InputStream in = socket.getInputStream(); - OutputStream out = socket.getOutputStream(); - - OutputStream intercept = new OutputStream() { - - @Override - public void write(int b) throws IOException { - out.write(b); - } - }; - - LOG.info("Connected to parent using socket on port " + port); - - return new Connection(in, intercept, socket); - } - else { - InputStream in = System.in; - PrintStream out = System.out; - - LOG.info("Connected to parent using stdio"); - - return new Connection(in, out, null); - } - } - - private static class Connection { - final InputStream in; - final OutputStream out; - final Socket socket; - - private Connection(InputStream in, OutputStream out, Socket socket) { - this.in = in; - this.out = out; - this.socket = socket; - } - - void dispose() { - if (in != null) { - try { - in.close(); - } catch (IOException e) { - LOG.log(Level.SEVERE, e.getMessage(), e); - } - } - if (out != null) { - try { - out.close(); - } catch (IOException e) { - LOG.log(Level.SEVERE, e.getMessage(), e); - } - } - if (socket != null) { - try { - socket.close(); - } catch (IOException e) { - LOG.log(Level.SEVERE, e.getMessage(), e); - } - } - } - } - - /** - * Listen for requests from the parent node process. - * Send replies asynchronously. - * When the request stream is closed, wait for 5s for all outstanding responses to compute, then return. - */ - public static void run(Connection connection) { - JavaProjectFinder javaProjectFinder = JavaProjectFinder.DEFAULT; - SpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectFinder); - TypeUtilProvider typeUtilProvider = (IDocument doc) -> new TypeUtil(javaProjectFinder.find(doc)); - - ApplicationPropertiesLanguageServer server = new ApplicationPropertiesLanguageServer(indexProvider, typeUtilProvider); - - LoggingJsonAdapter jsonServer = new LoggingJsonAdapter(server); - jsonServer.setMessageLog(new PrintWriter(System.out)); - - jsonServer.connect(connection.in, connection.out); - jsonServer.getProtocol().addErrorListener((message, err) -> { - LOG.log(Level.SEVERE, message, err); - - server.onError(message, err); - }); - jsonServer.join(); - } } diff --git a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/quickfix/ReplaceDeprecatedPropertyQuickfix.java b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/quickfix/ReplaceDeprecatedPropertyQuickfix.java index b55ca8af1..9edde6cdf 100644 --- a/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/quickfix/ReplaceDeprecatedPropertyQuickfix.java +++ b/vscode-extensions/vscode-application-properties/src/main/java/org/springframework/ide/vscode/application/properties/quickfix/ReplaceDeprecatedPropertyQuickfix.java @@ -10,12 +10,11 @@ *******************************************************************************/ package org.springframework.ide.vscode.application.properties.quickfix; +import org.eclipse.lsp4j.CompletionItemKind; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; import org.springframework.ide.vscode.commons.languageserver.quickfix.ProblemFixer; -import io.typefox.lsapi.CompletionItemKind; - public class ReplaceDeprecatedPropertyQuickfix implements ICompletionProposal { public static ProblemFixer FIXER = (context, problem, proposals) -> { diff --git a/vscode-extensions/vscode-application-properties/src/test/java/org/springframework/ide/vscode/application/properties/test/ApplicationPropertiesEditorTest.java b/vscode-extensions/vscode-application-properties/src/test/java/org/springframework/ide/vscode/application/properties/test/ApplicationPropertiesEditorTest.java index d78c8a358..a8b892ef2 100644 --- a/vscode-extensions/vscode-application-properties/src/test/java/org/springframework/ide/vscode/application/properties/test/ApplicationPropertiesEditorTest.java +++ b/vscode-extensions/vscode-application-properties/src/test/java/org/springframework/ide/vscode/application/properties/test/ApplicationPropertiesEditorTest.java @@ -36,8 +36,8 @@ import org.springframework.ide.vscode.properties.editor.test.harness.StyledStrin import com.google.common.collect.ImmutableList; import com.google.common.io.Files; -import io.typefox.lsapi.CompletionItem; -import io.typefox.lsapi.Diagnostic; +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.Diagnostic; /** * Boot App Properties Editor tests diff --git a/vscode-extensions/vscode-application-properties/src/test/java/org/springframework/ide/vscode/application/properties/test/ApplicationPropertiesLanguageServerTest.java b/vscode-extensions/vscode-application-properties/src/test/java/org/springframework/ide/vscode/application/properties/test/ApplicationPropertiesLanguageServerTest.java index 5f1f2f5a4..c59cfa767 100644 --- a/vscode-extensions/vscode-application-properties/src/test/java/org/springframework/ide/vscode/application/properties/test/ApplicationPropertiesLanguageServerTest.java +++ b/vscode-extensions/vscode-application-properties/src/test/java/org/springframework/ide/vscode/application/properties/test/ApplicationPropertiesLanguageServerTest.java @@ -17,14 +17,13 @@ import java.net.URISyntaxException; import java.nio.file.Paths; import java.util.concurrent.Callable; +import org.eclipse.lsp4j.InitializeResult; +import org.eclipse.lsp4j.TextDocumentSyncKind; +import org.eclipse.lsp4j.services.LanguageServer; import org.junit.Test; import org.springframework.ide.vscode.application.properties.ApplicationPropertiesLanguageServer; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; -import io.typefox.lsapi.InitializeResult; -import io.typefox.lsapi.TextDocumentSyncKind; -import io.typefox.lsapi.services.LanguageServer; - /** * Boot app properties file language server tests * diff --git a/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlLanguageServer.java b/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlLanguageServer.java index cbc075b41..d2603823e 100644 --- a/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlLanguageServer.java +++ b/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlLanguageServer.java @@ -1,5 +1,8 @@ package org.springframework.ide.vscode.application.yaml; +import org.eclipse.lsp4j.CompletionOptions; +import org.eclipse.lsp4j.ServerCapabilities; +import org.eclipse.lsp4j.TextDocumentSyncKind; import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.application.properties.metadata.completions.RelaxedNameConfig; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtilProvider; @@ -18,10 +21,6 @@ import org.springframework.ide.vscode.commons.yaml.ast.YamlParser; import org.springframework.ide.vscode.commons.yaml.completion.YamlCompletionEngine; import org.yaml.snakeyaml.Yaml; -import io.typefox.lsapi.TextDocumentSyncKind; -import io.typefox.lsapi.impl.CompletionOptionsImpl; -import io.typefox.lsapi.impl.ServerCapabilitiesImpl; - public class ApplicationYamlLanguageServer extends SimpleLanguageServer { private Yaml yaml = new Yaml(); @@ -68,12 +67,12 @@ public class ApplicationYamlLanguageServer extends SimpleLanguageServer { } @Override - protected ServerCapabilitiesImpl getServerCapabilities() { - ServerCapabilitiesImpl c = new ServerCapabilitiesImpl(); + protected ServerCapabilities getServerCapabilities() { + ServerCapabilities c = new ServerCapabilities(); c.setTextDocumentSync(TextDocumentSyncKind.Full); - CompletionOptionsImpl completionProvider = new CompletionOptionsImpl(); + CompletionOptions completionProvider = new CompletionOptions(); completionProvider.setResolveProvider(false); c.setCompletionProvider(completionProvider); diff --git a/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/Main.java b/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/Main.java index 97c853dac..c60dcb225 100644 --- a/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/Main.java +++ b/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/Main.java @@ -1,111 +1,28 @@ package org.springframework.ide.vscode.application.yaml; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.util.logging.Level; -import java.util.logging.Logger; import org.springframework.ide.vscode.application.properties.metadata.DefaultSpringPropertyIndexProvider; import org.springframework.ide.vscode.application.properties.metadata.SpringPropertyIndexProvider; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtil; import org.springframework.ide.vscode.application.properties.metadata.types.TypeUtilProvider; +import org.springframework.ide.vscode.commons.languageserver.LaunguageServerApp; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.util.IDocument; -import org.springframework.ide.vscode.commons.languageserver.util.LoggingFormat; - -import io.typefox.lsapi.services.json.LoggingJsonAdapter; public class Main { - private static final Logger LOG = Logger.getLogger("main"); - public static void main(String[] args) throws IOException { - LOG.info("Starting LS"); - try { - LoggingFormat.startLogging(); - - Connection connection = connectToNode(); - - run(connection); - } catch (Throwable t) { - LOG.log(Level.SEVERE, t.getMessage(), t); - - System.exit(1); - } - } - - private static Connection connectToNode() throws IOException { - String port = System.getProperty("server.port"); - - if (port != null) { - Socket socket = new Socket("localhost", Integer.parseInt(port)); - - InputStream in = socket.getInputStream(); - OutputStream out = socket.getOutputStream(); - - OutputStream intercept = new OutputStream() { - - @Override - public void write(int b) throws IOException { - out.write(b); - } - }; - - LOG.info("Connected to parent using socket on port " + port); - - return new Connection(in, intercept); - } - else { - InputStream in = System.in; - PrintStream out = System.out; - - LOG.info("Connected to parent using stdio"); - - return new Connection(in, out); - } - } - - private static class Connection { - final InputStream in; - final OutputStream out; - - private Connection(InputStream in, OutputStream out) { - this.in = in; - this.out = out; - } - } - - /** - * Listen for requests from the parent node process. - * Send replies asynchronously. - * When the request stream is closed, wait for 5s for all outstanding responses to compute, then return. - */ - public static void run(Connection connection) { - JavaProjectFinder javaProjectFinder = JavaProjectFinder.DEFAULT; - //TODO: proper TypeUtilProvider and IndexProvider that somehow determine classpath that should be - // in effect for given IDocument and provide TypeUtil or SpringPropertyIndex parsed from that classpath. - // Note that the provider is responsible for doing some kind of sensible caching so that indexes are not - // rebuilt every time the index is being used. - SpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectFinder); - TypeUtilProvider typeUtilProvider = (IDocument doc) -> new TypeUtil(javaProjectFinder.find(doc)); - ApplicationYamlLanguageServer server = new ApplicationYamlLanguageServer(indexProvider, typeUtilProvider, javaProjectFinder); - LoggingJsonAdapter jsonServer = new LoggingJsonAdapter(server); - jsonServer.setMessageLog(new PrintWriter(System.out)); - - jsonServer.connect(connection.in, connection.out); - jsonServer.getProtocol().addErrorListener((message, err) -> { - LOG.log(Level.SEVERE, message, err); - - server.onError(message, err); - }); - - try { - jsonServer.join(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } + public static void main(String[] args) throws IOException { + LaunguageServerApp.start(() -> { + JavaProjectFinder javaProjectFinder = JavaProjectFinder.DEFAULT; + //TODO: proper TypeUtilProvider and IndexProvider that somehow determine classpath that should be + // in effect for given IDocument and provide TypeUtil or SpringPropertyIndex parsed from that classpath. + // Note that the provider is responsible for doing some kind of sensible caching so that indexes are not + // rebuilt every time the index is being used. + SpringPropertyIndexProvider indexProvider = new DefaultSpringPropertyIndexProvider(javaProjectFinder); + TypeUtilProvider typeUtilProvider = (IDocument doc) -> new TypeUtil(javaProjectFinder.find(doc)); + ApplicationYamlLanguageServer server = new ApplicationYamlLanguageServer(indexProvider, typeUtilProvider, javaProjectFinder); + return server; + }); + } } diff --git a/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/quickfix/ReplaceDeprecatedYamlQuickfix.java b/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/quickfix/ReplaceDeprecatedYamlQuickfix.java index 85d01a303..5d1731578 100644 --- a/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/quickfix/ReplaceDeprecatedYamlQuickfix.java +++ b/vscode-extensions/vscode-application-yaml/src/main/java/org/springframework/ide/vscode/application/yaml/quickfix/ReplaceDeprecatedYamlQuickfix.java @@ -10,30 +10,11 @@ *******************************************************************************/ package org.springframework.ide.vscode.application.yaml.quickfix; -import java.awt.Image; -import java.awt.Point; - -import org.springframework.ide.vscode.application.yaml.reconcile.SpringPropertyProblem; +import org.eclipse.lsp4j.CompletionItemKind; import org.springframework.ide.vscode.commons.languageserver.completion.DocumentEdits; import org.springframework.ide.vscode.commons.languageserver.completion.ICompletionProposal; -import org.springframework.ide.vscode.commons.languageserver.completion.ProposalApplier; import org.springframework.ide.vscode.commons.languageserver.quickfix.ProblemFixer; -import org.springframework.ide.vscode.commons.languageserver.quickfix.QuickfixContext; -import org.springframework.ide.vscode.commons.languageserver.util.IDocument; -import org.springframework.ide.vscode.commons.util.Log; -import org.springframework.ide.vscode.commons.yaml.completion.YamlPathEdits; -import org.springframework.ide.vscode.commons.yaml.path.YamlPath; -import org.springframework.ide.vscode.commons.yaml.structure.YamlDocument; -import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvider; -import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SChildBearingNode; -import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SDocNode; -import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SKeyNode; -import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SNode; -import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureParser.SNodeType; -import io.typefox.lsapi.CompletionItemKind; - -@SuppressWarnings("restriction") public class ReplaceDeprecatedYamlQuickfix implements ICompletionProposal { public static ProblemFixer FIXER = (context, problem, proposals) -> { diff --git a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java index 77ebaac6e..13fa5ea07 100644 --- a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java +++ b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java @@ -28,8 +28,8 @@ import org.springframework.ide.vscode.languageserver.testharness.Editor; import org.springframework.ide.vscode.properties.editor.test.harness.AbstractPropsEditorTest; import org.springframework.ide.vscode.properties.editor.test.harness.StyledStringMatcher; -import io.typefox.lsapi.CompletionItem; -import io.typefox.lsapi.Diagnostic; +import org.eclipse.lsp4j.CompletionItem; +import org.eclipse.lsp4j.Diagnostic; /** * This class is a placeholder where we will attempt to copy and port diff --git a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlLanguageServerTests.java b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlLanguageServerTests.java index 5d6cc2a5e..0d520c96c 100644 --- a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlLanguageServerTests.java +++ b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlLanguageServerTests.java @@ -7,14 +7,12 @@ import java.net.URISyntaxException; import java.nio.file.Paths; import java.util.concurrent.Callable; +import org.eclipse.lsp4j.InitializeResult; +import org.eclipse.lsp4j.TextDocumentSyncKind; +import org.eclipse.lsp4j.services.LanguageServer; import org.junit.Test; -import org.springframework.ide.vscode.application.yaml.ApplicationYamlLanguageServer; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; -import io.typefox.lsapi.InitializeResult; -import io.typefox.lsapi.TextDocumentSyncKind; -import io.typefox.lsapi.services.LanguageServer; - public class ApplicationYamlLanguageServerTests { public static File getTestResource(String name) throws URISyntaxException { diff --git a/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/Main.java b/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/Main.java index 0af7ee6f2..7876bd711 100644 --- a/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/Main.java +++ b/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/Main.java @@ -1,99 +1,14 @@ package org.springframework.ide.vscode.manifest.yaml; import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.PrintStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.util.logging.Level; -import java.util.logging.Logger; -import org.springframework.ide.vscode.commons.languageserver.util.LoggingFormat; +import org.springframework.ide.vscode.commons.languageserver.LaunguageServerApp; import org.springframework.ide.vscode.commons.languageserver.util.SimpleLanguageServer; -import io.typefox.lsapi.services.json.LoggingJsonAdapter; - public class Main { - private static final Logger LOG = Logger.getLogger("main"); - - public static void main(String[] args) throws IOException { - LOG.info("Starting LS"); - try { - LoggingFormat.startLogging(); - - Connection connection = connectToNode(); - - run(connection); - } catch (Throwable t) { - LOG.log(Level.SEVERE, t.getMessage(), t); - - System.exit(1); - } - } - - private static Connection connectToNode() throws IOException { - String port = System.getProperty("server.port"); - - if (port != null) { - Socket socket = new Socket("localhost", Integer.parseInt(port)); - - InputStream in = socket.getInputStream(); - OutputStream out = socket.getOutputStream(); - - OutputStream intercept = new OutputStream() { - - @Override - public void write(int b) throws IOException { - out.write(b); - } - }; - - LOG.info("Connected to parent using socket on port " + port); - - return new Connection(in, intercept); - } - else { - InputStream in = System.in; - PrintStream out = System.out; - - LOG.info("Connected to parent using stdio"); - - return new Connection(in, out); - } - } - - private static class Connection { - final InputStream in; - final OutputStream out; - - private Connection(InputStream in, OutputStream out) { - this.in = in; - this.out = out; - } - } - - /** - * Listen for requests from the parent node process. - * Send replies asynchronously. - * When the request stream is closed, wait for 5s for all outstanding responses to compute, then return. - */ - public static void run(Connection connection) { - SimpleLanguageServer server = new ManifestYamlLanguageServer(); - LoggingJsonAdapter jsonServer = new LoggingJsonAdapter(server); - jsonServer.setMessageLog(new PrintWriter(System.out)); - - jsonServer.connect(connection.in, connection.out); - jsonServer.getProtocol().addErrorListener((message, err) -> { - LOG.log(Level.SEVERE, message, err); - - server.onError(message, err); - }); - -// try { - jsonServer.join(); -// } catch (InterruptedException | ExecutionException e) { -// throw new RuntimeException(e); -// } - } + SimpleLanguageServer server = new ManifestYamlLanguageServer(); + + public static void main(String[] args) throws IOException { + LaunguageServerApp.start(ManifestYamlLanguageServer::new); + } } diff --git a/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java b/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java index 4fc912c15..16de543ca 100644 --- a/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java +++ b/vscode-extensions/vscode-manifest-yaml/src/main/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServer.java @@ -4,6 +4,9 @@ import java.util.Collection; import javax.inject.Provider; +import org.eclipse.lsp4j.CompletionOptions; +import org.eclipse.lsp4j.ServerCapabilities; +import org.eclipse.lsp4j.TextDocumentSyncKind; import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngine; import org.springframework.ide.vscode.commons.languageserver.completion.VscodeCompletionEngineAdapter; import org.springframework.ide.vscode.commons.languageserver.reconcile.IReconcileEngine; @@ -23,10 +26,6 @@ import org.yaml.snakeyaml.Yaml; import com.google.common.collect.ImmutableList; -import io.typefox.lsapi.TextDocumentSyncKind; -import io.typefox.lsapi.impl.CompletionOptionsImpl; -import io.typefox.lsapi.impl.ServerCapabilitiesImpl; - public class ManifestYamlLanguageServer extends SimpleLanguageServer { private static final Provider> NO_BUILDPACKS = () -> ImmutableList.of(); @@ -70,12 +69,12 @@ public class ManifestYamlLanguageServer extends SimpleLanguageServer { } @Override - protected ServerCapabilitiesImpl getServerCapabilities() { - ServerCapabilitiesImpl c = new ServerCapabilitiesImpl(); + protected ServerCapabilities getServerCapabilities() { + ServerCapabilities c = new ServerCapabilities(); c.setTextDocumentSync(TextDocumentSyncKind.Full); - CompletionOptionsImpl completionProvider = new CompletionOptionsImpl(); + CompletionOptions completionProvider = new CompletionOptions(); completionProvider.setResolveProvider(false); c.setCompletionProvider(completionProvider); diff --git a/vscode-extensions/vscode-manifest-yaml/src/test/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerTest.java b/vscode-extensions/vscode-manifest-yaml/src/test/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerTest.java index 56daeb2f6..bcbb7d475 100644 --- a/vscode-extensions/vscode-manifest-yaml/src/test/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerTest.java +++ b/vscode-extensions/vscode-manifest-yaml/src/test/java/org/springframework/ide/vscode/manifest/yaml/ManifestYamlLanguageServerTest.java @@ -6,12 +6,10 @@ import java.io.File; import java.net.URISyntaxException; import java.nio.file.Paths; +import org.eclipse.lsp4j.InitializeResult; +import org.eclipse.lsp4j.TextDocumentSyncKind; import org.junit.Test; import org.springframework.ide.vscode.languageserver.testharness.LanguageServerHarness; -import org.springframework.ide.vscode.manifest.yaml.ManifestYamlLanguageServer; - -import io.typefox.lsapi.InitializeResult; -import io.typefox.lsapi.TextDocumentSyncKind; public class ManifestYamlLanguageServerTest {