diff --git a/ide/lsp.client/external/binaries-list b/ide/lsp.client/external/binaries-list
index a8dc71e61870..c89b3b0ea7fb 100644
--- a/ide/lsp.client/external/binaries-list
+++ b/ide/lsp.client/external/binaries-list
@@ -15,9 +15,9 @@
# specific language governing permissions and limitations
# under the License.
-4FF29B93C50F6768C9A73040AE818E96EB2E68DB org.eclipse.lsp4j:org.eclipse.lsp4j:0.9.0
-DA453B2A6C9BBD9369DE41365C59E88574EC1F0B org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.9.0
-1CF7FCE1E2F4DFA76C3B91E4C2D72EA0C6899945 org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.9.0
+419B5181A4B2D054BF8FF764FCEB67DF09D87E7D org.eclipse.lsp4j:org.eclipse.lsp4j:0.12.0
+80607078CEB77F92C6BFEC3CDEC050D3222EFDFF org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.12.0
+8A80D1368F19A2F6E328E41B9BC68E53C628C68B org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.12.0
751B324BED8C077BF6B7B8C2055595EB8C28509D org.eclipse.xtend:org.eclipse.xtend.lib:2.19.0
F3626A047A3ABFA47CF62D76BDEF1D246F7985F6 org.eclipse.xtend:org.eclipse.xtend.lib.macro:2.19.0
997BA9935D0069B3F1CD2F93B56B91D24E9C60A0 org.eclipse.xtext:org.eclipse.xtext.xbase.lib:2.19.0
diff --git a/ide/lsp.client/external/lsp4j-0.9.0-license.txt b/ide/lsp.client/external/lsp4j-0.12.0-license.txt
similarity index 99%
rename from ide/lsp.client/external/lsp4j-0.9.0-license.txt
rename to ide/lsp.client/external/lsp4j-0.12.0-license.txt
index 208dfb7daf50..7151ac57688c 100644
--- a/ide/lsp.client/external/lsp4j-0.9.0-license.txt
+++ b/ide/lsp.client/external/lsp4j-0.12.0-license.txt
@@ -1,10 +1,10 @@
Name: Eclipse Language Server Protocol Library
Origin: Eclipse
-Version: 0.9.0
+Version: 0.12.0
License: EPL-v20
URL: http://www.eclipse.org/
Description: Eclipse Language Server Protocol Library
-Files: org.eclipse.lsp4j-0.9.0.jar org.eclipse.lsp4j.generator-0.9.0.jar org.eclipse.lsp4j.jsonrpc-0.9.0.jar
+Files: org.eclipse.lsp4j-0.12.0.jar org.eclipse.lsp4j.generator-0.12.0.jar org.eclipse.lsp4j.jsonrpc-0.12.0.jar
Eclipse Public License - v 2.0
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (“AGREEMENT”). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
diff --git a/ide/lsp.client/nbproject/project.properties b/ide/lsp.client/nbproject/project.properties
index f6a201b811d1..f2bd513dc11f 100644
--- a/ide/lsp.client/nbproject/project.properties
+++ b/ide/lsp.client/nbproject/project.properties
@@ -18,9 +18,9 @@
javac.source=1.8
javac.compilerargs=-Xlint -Xlint:-serial
javadoc.arch=${basedir}/arch.xml
-release.external/org.eclipse.lsp4j-0.9.0.jar=modules/ext/org.eclipse.lsp4j-0.9.0.jar
-release.external/org.eclipse.lsp4j.generator-0.9.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.9.0.jar
-release.external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.9.0.jar
+release.external/org.eclipse.lsp4j-0.12.0.jar=modules/ext/org.eclipse.lsp4j-0.12.0.jar
+release.external/org.eclipse.lsp4j.generator-0.12.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.12.0.jar
+release.external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.12.0.jar
release.external/org.eclipse.xtend.lib-2.19.0.jar=modules/ext/org.eclipse.xtend.lib-2.19.0.jar
release.external/org.eclipse.xtend.lib.macro-2.19.0.jar=modules/ext/org.eclipse.xtend.lib.macro-2.19.0.jar
release.external/org.eclipse.xtext.xbase.lib-2.19.0.jar=modules/ext/org.eclipse.xtext.xbase.lib-2.19.0.jar
diff --git a/ide/lsp.client/nbproject/project.xml b/ide/lsp.client/nbproject/project.xml
index 031be986c457..ffd8417b0106 100644
--- a/ide/lsp.client/nbproject/project.xml
+++ b/ide/lsp.client/nbproject/project.xml
@@ -414,16 +414,16 @@
org.netbeans.modules.lsp.client.spi
- ext/org.eclipse.lsp4j-0.9.0.jar
- external/org.eclipse.lsp4j-0.9.0.jar
+ ext/org.eclipse.lsp4j-0.12.0.jar
+ external/org.eclipse.lsp4j-0.12.0.jar
ext/org.eclipse.xtend.lib.macro-2.19.0.jar
external/org.eclipse.xtend.lib.macro-2.19.0.jar
- ext/org.eclipse.lsp4j.generator-0.9.0.jar
- external/org.eclipse.lsp4j.generator-0.9.0.jar
+ ext/org.eclipse.lsp4j.generator-0.12.0.jar
+ external/org.eclipse.lsp4j.generator-0.12.0.jar
ext/org.eclipse.xtend.lib-2.19.0.jar
@@ -434,8 +434,8 @@
external/org.eclipse.xtext.xbase.lib-2.19.0.jar
- ext/org.eclipse.lsp4j.jsonrpc-0.9.0.jar
- external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar
+ ext/org.eclipse.lsp4j.jsonrpc-0.12.0.jar
+ external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
index 88f85006fee5..4b196dba6c5d 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
@@ -18,6 +18,7 @@
*/
package org.netbeans.modules.lsp.client;
+import com.google.gson.InstanceCreator;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -25,6 +26,7 @@
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
+import java.lang.reflect.Type;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URI;
@@ -48,10 +50,13 @@
import java.util.stream.Collectors;
import javax.swing.event.ChangeListener;
import org.eclipse.lsp4j.ClientCapabilities;
+import org.eclipse.lsp4j.CompletionCapabilities;
import org.eclipse.lsp4j.DocumentSymbolCapabilities;
import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.ResourceOperationKind;
+import org.eclipse.lsp4j.SemanticTokens;
+import org.eclipse.lsp4j.SemanticTokensLegend;
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.SymbolCapabilities;
import org.eclipse.lsp4j.SymbolKind;
@@ -268,7 +273,23 @@ private static LSPBindings buildBindings(ServerDescription inDescription, Projec
InputStream in = LanguageServerProviderAccessor.getINSTANCE().getInputStream(desc);
OutputStream out = LanguageServerProviderAccessor.getINSTANCE().getOutputStream(desc);
Process p = LanguageServerProviderAccessor.getINSTANCE().getProcess(desc);
- Launcher launcher = LSPLauncher.createClientLauncher(lci, in, out);
+ Launcher launcher = new LSPLauncher.Builder()
+ .setLocalService(lci)
+ .setRemoteInterface(LanguageServer.class)
+ .setInput(in)
+ .setOutput(out)
+ .configureGson(gson -> {
+ gson.registerTypeAdapter(SemanticTokensLegend.class, new InstanceCreator() {
+ @Override public SemanticTokensLegend createInstance(Type type) {
+ return new SemanticTokensLegend(Collections.emptyList(), Collections.emptyList());
+ }
+ });
+ gson.registerTypeAdapter(SemanticTokens.class, new InstanceCreator() {
+ @Override public SemanticTokens createInstance(Type type) {
+ return new SemanticTokens(Collections.emptyList());
+ }
+ });
+ }).create();
launcher.startListening();
LanguageServer server = launcher.getRemoteProxy();
InitializeResult result = initServer(p, server, dir); //XXX: what if a different root is expected????
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
index 746eff437ff9..9301f0aa56bf 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
@@ -301,4 +301,8 @@ public static void open(String targetUri, Range targetRange) {
public static boolean isTrue(Boolean b) {
return b != null && b;
}
+ public static boolean isEnabled(Either settings) {
+ return settings != null && (settings.isLeft() ? isTrue(settings.getLeft())
+ : settings.getRight() != null);
+ }
}
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
index 8e6cf96e265b..90f84532a483 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/BreadcrumbsImpl.java
@@ -337,7 +337,7 @@ private void update() {
LSPBindings bindings = file != null ? LSPBindings.getBindings(file) : null;
Runnable r;
- if (bindings != null && Utils.isTrue(bindings.getInitResult().getCapabilities().getDocumentSymbolProvider())) {
+ if (bindings != null && Utils.isEnabled(bindings.getInitResult().getCapabilities().getDocumentSymbolProvider())) {
r = () -> {
setPreferredSize(sidebar.getPreferredSize());
setMaximumSize(sidebar.getMaximumSize());
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
index 92fcd2210849..0fba1fc27299 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/CompletionProviderImpl.java
@@ -189,7 +189,13 @@ public void defaultAction(JTextComponent jtc) {
commit("");
}
private void commit(String appendText) {
- TextEdit te = i.getTextEdit();
+ if (i.getTextEdit().isRight()) {
+ //TODO: the NetBeans client does not current support InsertReplaceEdits, should not happen
+ Completion.get().hideDocumentation();
+ Completion.get().hideCompletion();
+ return ;
+ }
+ TextEdit te = i.getTextEdit().getLeft();
NbDocument.runAtomic((StyledDocument) doc, () -> {
try {
int endPos;
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/Formatter.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/Formatter.java
index 045e490050b7..f56b0859b1ce 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/Formatter.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/Formatter.java
@@ -73,11 +73,11 @@ public void reformat() throws BadLocationException {
if (file != null) {
LSPBindings bindings = LSPBindings.getBindings(file);
if (bindings != null) {
- Boolean documentFormatting = bindings.getInitResult().getCapabilities().getDocumentFormattingProvider();
- Boolean rangeFormatting = bindings.getInitResult().getCapabilities().getDocumentRangeFormattingProvider();
- if (rangeFormatting != null && rangeFormatting) {
+ boolean documentFormatting = Utils.isEnabled(bindings.getInitResult().getCapabilities().getDocumentFormattingProvider());
+ boolean rangeFormatting = Utils.isEnabled(bindings.getInitResult().getCapabilities().getDocumentRangeFormattingProvider());
+ if (rangeFormatting) {
rangeFormat(file, bindings);
- } else if (documentFormatting != null && documentFormatting) {
+ } else if (documentFormatting) {
documentFormat(file, bindings);
}
}
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
index f655fa013ae6..0fada4a6a139 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java
@@ -27,6 +27,7 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumMap;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@@ -35,6 +36,7 @@
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
+import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.StyledDocument;
@@ -52,14 +54,21 @@
import org.eclipse.lsp4j.ExecuteCommandParams;
import org.eclipse.lsp4j.MessageActionItem;
import org.eclipse.lsp4j.MessageParams;
+import org.eclipse.lsp4j.ProgressParams;
import org.eclipse.lsp4j.PublishDiagnosticsParams;
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.ShowMessageRequestParams;
import org.eclipse.lsp4j.TextDocumentIdentifier;
import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.WorkDoneProgressBegin;
+import org.eclipse.lsp4j.WorkDoneProgressCreateParams;
+import org.eclipse.lsp4j.WorkDoneProgressEnd;
+import org.eclipse.lsp4j.WorkDoneProgressNotification;
+import org.eclipse.lsp4j.WorkDoneProgressReport;
import org.eclipse.lsp4j.WorkspaceEdit;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.eclipse.lsp4j.services.LanguageClient;
+import org.netbeans.api.progress.*;
import org.netbeans.modules.lsp.client.LSPBindings;
import org.netbeans.modules.lsp.client.Utils;
import org.netbeans.spi.editor.hints.ChangeInfo;
@@ -74,6 +83,7 @@
import org.openide.filesystems.URLMapper;
import org.openide.text.NbDocument;
import org.openide.util.Exceptions;
+import org.openide.util.NbBundle.Messages;
import org.openide.util.RequestProcessor;
/**
@@ -100,6 +110,53 @@ public void telemetryEvent(Object arg0) {
System.err.println("telemetry: " + arg0);
}
+ @Override
+ public CompletableFuture createProgress(WorkDoneProgressCreateParams params) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ private final Map