From c768a6eb9fb4b8d5b1b24999d24668a77cb98526 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 25 Dec 2020 21:35:07 +0100 Subject: [PATCH 1/9] A first version of semantic highlighting for the LSP client and Java LSP server. --- ide/lsp.client/external/binaries-list | 6 +- ...0-license.txt => lsp4j-0.10.0-license.txt} | 4 +- ide/lsp.client/nbproject/project.properties | 6 +- ide/lsp.client/nbproject/project.xml | 12 +- .../modules/lsp/client/LSPBindings.java | 22 ++- .../client/bindings/LanguageClientImpl.java | 51 ++++++ ...xtDocumentSyncServerCapabilityHandler.java | 5 + .../textmate/lexer/resources/fontsColors.xml | 36 +++++ java/java.lsp.server/external/binaries-list | 10 +- ...0-license.txt => lsp4j-0.10.0-license.txt} | 4 +- .../nbproject/project.properties | 10 +- java/java.lsp.server/nbproject/project.xml | 20 +-- .../java/lsp/server/protocol/Server.java | 62 +++++++- .../protocol/TextDocumentServiceImpl.java | 148 ++++++++++++++++++ .../java/lsp/server/protocol/ServerTest.java | 96 ++++++++++++ java/java.lsp.server/vscode/package-lock.json | 87 +++++----- java/java.lsp.server/vscode/package.json | 4 +- java/java.lsp.server/vscode/src/extension.ts | 7 +- java/java.lsp.server/vscode/src/protocol.ts | 6 +- 19 files changed, 511 insertions(+), 85 deletions(-) rename ide/lsp.client/external/{lsp4j-0.9.0-license.txt => lsp4j-0.10.0-license.txt} (99%) rename java/java.lsp.server/external/{lsp4j-0.9.0-license.txt => lsp4j-0.10.0-license.txt} (98%) diff --git a/ide/lsp.client/external/binaries-list b/ide/lsp.client/external/binaries-list index a8dc71e61870..8bdfe7308759 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 +271665493A1E35FB4C2D1DBABF19363C8AD27819 org.eclipse.lsp4j:org.eclipse.lsp4j:0.10.0 +ED2D6D876578B139AEA24289422435148FEF6B45 org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.10.0 +42CA44A49315A490804A3DED67163123748C1F19 org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.10.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.10.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.10.0-license.txt index 208dfb7daf50..41c05be3d7a8 100644 --- a/ide/lsp.client/external/lsp4j-0.9.0-license.txt +++ b/ide/lsp.client/external/lsp4j-0.10.0-license.txt @@ -1,10 +1,10 @@ Name: Eclipse Language Server Protocol Library Origin: Eclipse -Version: 0.9.0 +Version: 0.10.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.10.0.jar org.eclipse.lsp4j.generator-0.10.0.jar org.eclipse.lsp4j.jsonrpc-0.10.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 59d7c511cb28..17bdc0de782b 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.10.0.jar=modules/ext/org.eclipse.lsp4j-0.10.0.jar +release.external/org.eclipse.lsp4j.generator-0.10.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.10.0.jar +release.external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.10.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 f74efcdccddc..fae954d87838 100644 --- a/ide/lsp.client/nbproject/project.xml +++ b/ide/lsp.client/nbproject/project.xml @@ -396,16 +396,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.10.0.jar + external/org.eclipse.lsp4j-0.10.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.10.0.jar + external/org.eclipse.lsp4j.generator-0.10.0.jar ext/org.eclipse.xtend.lib-2.19.0.jar @@ -416,8 +416,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.10.0.jar + external/org.eclipse.lsp4j.jsonrpc-0.10.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 8d87af36a16a..8fcae5bfbf98 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,12 +18,14 @@ */ package org.netbeans.modules.lsp.client; +import com.google.gson.InstanceCreator; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; 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; @@ -51,6 +53,8 @@ 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; @@ -233,7 +237,23 @@ private static LSPBindings buildBindings(Project prj, String mt, FileObject dir, 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/bindings/LanguageClientImpl.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/LanguageClientImpl.java index f655fa013ae6..a672ecdee907 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,20 @@ 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.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 +82,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 +109,48 @@ public void telemetryEvent(Object arg0) { System.err.println("telemetry: " + arg0); } + @Override + public CompletableFuture createProgress(WorkDoneProgressCreateParams params) { + return CompletableFuture.completedFuture(null); + } + + private final Map key2Progress = new HashMap<>(); + + public void notifyProgress(ProgressParams params) { + SwingUtilities.invokeLater(() -> { + switch (params.getValue().getKind()) { + case begin: { + WorkDoneProgressBegin progress = (WorkDoneProgressBegin) params.getValue(); + ProgressHandle handle = ProgressHandle.createHandle(progress.getTitle()); + key2Progress.put(params.getToken().get(), handle); + handle.start(); + handle.progress(progress.getMessage()); + break; + } + case report: { + WorkDoneProgressReport progress = (WorkDoneProgressReport) params.getValue(); + ProgressHandle handle = key2Progress.get(params.getToken().get()); + if (progress.getPercentage() != null) { + handle.switchToDeterminate(100); + handle.progress(progress.getPercentage()); + } else { + handle.switchToIndeterminate(); + } + if (progress.getMessage() != null) { + handle.progress(progress.getMessage()); + } + break; + } + case end: { + WorkDoneProgressEnd progress = (WorkDoneProgressEnd) params.getValue(); + ProgressHandle handle = key2Progress.get(params.getToken().get()); + handle.finish(); + break; + } + } + }); + } + @Override public void publishDiagnostics(PublishDiagnosticsParams pdp) { try { diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java index 4522c45449ec..13b2c3bde6e4 100644 --- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java +++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/TextDocumentSyncServerCapabilityHandler.java @@ -336,6 +336,11 @@ private void registerBackgroundTasks(JTextComponent c) { LSPBindings.addBackgroundTask(file, bi); c.putClientProperty(BreadcrumbsImpl.class, bi); } + if (c.getClientProperty(SemanticHighlight.class) == null) { + SemanticHighlight sh = new SemanticHighlight(c); + LSPBindings.addBackgroundTask(file, sh); + c.putClientProperty(SemanticHighlight.class, sh); + } }); }); } diff --git a/ide/textmate.lexer/src/org/netbeans/modules/textmate/lexer/resources/fontsColors.xml b/ide/textmate.lexer/src/org/netbeans/modules/textmate/lexer/resources/fontsColors.xml index be6e6320f24e..27acc9bba4e8 100644 --- a/ide/textmate.lexer/src/org/netbeans/modules/textmate/lexer/resources/fontsColors.xml +++ b/ide/textmate.lexer/src/org/netbeans/modules/textmate/lexer/resources/fontsColors.xml @@ -53,4 +53,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/java/java.lsp.server/external/binaries-list b/java/java.lsp.server/external/binaries-list index 05e0a74e1045..39d428fe4750 100644 --- a/java/java.lsp.server/external/binaries-list +++ b/java/java.lsp.server/external/binaries-list @@ -15,11 +15,11 @@ # specific language governing permissions and limitations # under the License. -4FF29B93C50F6768C9A73040AE818E96EB2E68DB org.eclipse.lsp4j:org.eclipse.lsp4j:0.9.0 -E5F9B4D2A6DDE53FA2CEAD6F0D51CABC73E3C850 org.eclipse.lsp4j:org.eclipse.lsp4j.debug: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 -DAF59D5711756C35B6BF9537EB1A6EDDF52EF452 org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc.debug:0.9.0 +271665493A1E35FB4C2D1DBABF19363C8AD27819 org.eclipse.lsp4j:org.eclipse.lsp4j:0.10.0 +18621C63F8D8587C0CC5EEB9CB945E49E9B5C900 org.eclipse.lsp4j:org.eclipse.lsp4j.debug:0.10.0 +ED2D6D876578B139AEA24289422435148FEF6B45 org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.10.0 +42CA44A49315A490804A3DED67163123748C1F19 org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.10.0 +30A70C7AC5E722F25843669F124CDACA9772B9C8 org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc.debug:0.10.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/java/java.lsp.server/external/lsp4j-0.9.0-license.txt b/java/java.lsp.server/external/lsp4j-0.10.0-license.txt similarity index 98% rename from java/java.lsp.server/external/lsp4j-0.9.0-license.txt rename to java/java.lsp.server/external/lsp4j-0.10.0-license.txt index 90fb32515dd2..d90f3165e852 100644 --- a/java/java.lsp.server/external/lsp4j-0.9.0-license.txt +++ b/java/java.lsp.server/external/lsp4j-0.10.0-license.txt @@ -1,10 +1,10 @@ Name: Eclipse Language Server Protocol Library Origin: Eclipse -Version: 0.9.0 +Version: 0.10.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.debug-0.9.0.jar org.eclipse.lsp4j.generator-0.9.0.jar org.eclipse.lsp4j.jsonrpc-0.9.0.jar org.eclipse.lsp4j.jsonrpc.debug-0.9.0.jar +Files: org.eclipse.lsp4j-0.10.0.jar org.eclipse.lsp4j.debug-0.10.0.jar org.eclipse.lsp4j.generator-0.10.0.jar org.eclipse.lsp4j.jsonrpc-0.10.0.jar org.eclipse.lsp4j.jsonrpc.debug-0.10.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/java/java.lsp.server/nbproject/project.properties b/java/java.lsp.server/nbproject/project.properties index eb87dff8d574..b4a10fc91d44 100644 --- a/java/java.lsp.server/nbproject/project.properties +++ b/java/java.lsp.server/nbproject/project.properties @@ -23,11 +23,11 @@ lsp.build.dir=vscode/nbcode test.unit.run.cp.extra= cp.extra=${tools.jar} -release.external/org.eclipse.lsp4j-0.9.0.jar=modules/ext/org.eclipse.lsp4j-0.9.0.jar -release.external/org.eclipse.lsp4j.debug-0.9.0.jar=modules/ext/org.eclipse.lsp4j.debug-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.jsonrpc.debug-0.9.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc.debug-0.9.0.jar +release.external/org.eclipse.lsp4j-0.10.0.jar=modules/ext/org.eclipse.lsp4j-0.10.0.jar +release.external/org.eclipse.lsp4j.debug-0.10.0.jar=modules/ext/org.eclipse.lsp4j.debug-0.10.0.jar +release.external/org.eclipse.lsp4j.generator-0.10.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.10.0.jar +release.external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.10.0.jar +release.external/org.eclipse.lsp4j.jsonrpc.debug-0.10.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc.debug-0.10.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/java/java.lsp.server/nbproject/project.xml b/java/java.lsp.server/nbproject/project.xml index 287f215148bd..7ab80f9b838b 100644 --- a/java/java.lsp.server/nbproject/project.xml +++ b/java/java.lsp.server/nbproject/project.xml @@ -528,24 +528,24 @@ org.netbeans.modules.java.lsp.server.ui - ext/org.eclipse.lsp4j.debug-0.9.0.jar - external/org.eclipse.lsp4j.debug-0.9.0.jar + ext/org.eclipse.lsp4j.debug-0.10.0.jar + external/org.eclipse.lsp4j.debug-0.10.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.10.0.jar + external/org.eclipse.lsp4j.generator-0.10.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.10.0.jar + external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar - ext/org.eclipse.lsp4j.jsonrpc.debug-0.9.0.jar - external/org.eclipse.lsp4j.jsonrpc.debug-0.9.0.jar + ext/org.eclipse.lsp4j.jsonrpc.debug-0.10.0.jar + external/org.eclipse.lsp4j.jsonrpc.debug-0.10.0.jar ext/org.eclipse.xtend.lib-2.19.0.jar @@ -556,8 +556,8 @@ external/org.eclipse.xtext.xbase.lib-2.19.0.jar - ext/org.eclipse.lsp4j-0.9.0.jar - external/org.eclipse.lsp4j-0.9.0.jar + ext/org.eclipse.lsp4j-0.10.0.jar + external/org.eclipse.lsp4j-0.10.0.jar ext/commons-io-2.5.jar diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java index 65de5fff3503..130292e5b980 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java @@ -18,14 +18,24 @@ */ package org.netbeans.modules.java.lsp.server.protocol; +import com.google.gson.Gson; +import com.google.gson.InstanceCreator; +import com.google.gson.TypeAdapter; +import com.google.gson.TypeAdapterFactory; +import com.google.gson.reflect.TypeToken; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.io.PrintWriter; +import java.lang.reflect.Type; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -42,8 +52,12 @@ import org.eclipse.lsp4j.MessageParams; import org.eclipse.lsp4j.MessageType; import org.eclipse.lsp4j.PublishDiagnosticsParams; +import org.eclipse.lsp4j.RenameCapabilities; +import org.eclipse.lsp4j.SemanticTokensCapabilities; +import org.eclipse.lsp4j.SemanticTokensParams; import org.eclipse.lsp4j.ServerCapabilities; import org.eclipse.lsp4j.ShowMessageRequestParams; +import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.TextDocumentSyncKind; import org.eclipse.lsp4j.WorkspaceFolder; import org.eclipse.lsp4j.jsonrpc.JsonRpcException; @@ -118,9 +132,48 @@ private static Launcher createLauncher(LanguageServerImpl .setInput(in) .setOutput(out) .wrapMessages(processor) + .configureGson(gb -> { + gb.registerTypeAdapter(SemanticTokensCapabilities.class, new InstanceCreator() { + @Override public SemanticTokensCapabilities createInstance(Type type) { + return new SemanticTokensCapabilities(null); + } + }); + gb.registerTypeAdapter(SemanticTokensParams.class, new InstanceCreator() { + @Override public SemanticTokensParams createInstance(Type type) { + return new SemanticTokensParams(new TextDocumentIdentifier("")); + } + }); + gb.registerTypeAdapterFactory(new TypeAdapterFactory() { + @Override + public TypeAdapter create(Gson gson, TypeToken type) { + if (RenameCapabilities.class.equals(type.getRawType())) { + return new TypeAdapter() { + @Override + public void write(JsonWriter out, T value) throws IOException { + throw new UnsupportedOperationException("Not supported."); + } + + @Override + public T read(JsonReader in) throws IOException { + //a bug in LSP4J: RenameCapabilities expects + //prepareSupportDefaultBehavior to have type boolean, + //but the final protocol says it should be an int: + Map props = gson.fromJson(in, Map.class); + if (props.containsKey("prepareSupportDefaultBehavior")) { + props.put("prepareSupportDefaultBehavior", "true"); + } + return (T) new Gson().fromJson(gson.toJson(props), RenameCapabilities.class); + } + }; + } + return null; + } + }); + }) + .traceMessages(new PrintWriter(System.err)) .create(); } - + static final ThreadLocal DISPATCHERS = new ThreadLocal<>(); /** @@ -164,7 +217,7 @@ private static class LanguageServerImpl implements LanguageServer, LanguageClien private static final Logger LOG = Logger.getLogger(LanguageServerImpl.class.getName()); private NbCodeClientWrapper client; - private final TextDocumentService textDocumentService = new TextDocumentServiceImpl(); + private final TextDocumentServiceImpl textDocumentService = new TextDocumentServiceImpl(); private final WorkspaceService workspaceService = new WorkspaceServiceImpl(); private final InstanceContent sessionServices = new InstanceContent(); private final Lookup sessionLookup = new ProxyLookup( @@ -242,7 +295,7 @@ private void showStatusBarMessage(final MessageType type, final String msg, int } } - private InitializeResult constructInitResponse(JavaSource src) { + private InitializeResult constructInitResponse(InitializeParams init, JavaSource src) { ServerCapabilities capabilities = new ServerCapabilities(); if (src != null) { capabilities.setTextDocumentSync(TextDocumentSyncKind.Incremental); @@ -262,6 +315,7 @@ private InitializeResult constructInitResponse(JavaSource src) { } capabilities.setExecuteCommandProvider(new ExecuteCommandOptions(commands)); capabilities.setWorkspaceSymbolProvider(true); + textDocumentService.init(init.getCapabilities(), capabilities); } return new InitializeResult(capabilities); } @@ -298,7 +352,7 @@ public CompletableFuture initialize(InitializeParams init) { return fProjects. thenApply(this::showIndexingCompleted). - thenApply(this::constructInitResponse); + thenApply(js -> constructInitResponse(init, js)); } @Override diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java index b7c0bb001069..e7438e75d879 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java @@ -41,9 +41,13 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; import java.util.Set; +import java.util.TreeMap; import java.util.concurrent.Callable; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -51,6 +55,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.BiConsumer; import java.util.prefs.Preferences; +import java.util.stream.Collectors; import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; @@ -65,6 +70,7 @@ import javax.swing.text.BadLocationException; import javax.swing.text.Document; import javax.swing.text.StyledDocument; +import org.eclipse.lsp4j.ClientCapabilities; import org.eclipse.lsp4j.CodeAction; import org.eclipse.lsp4j.CodeActionKind; import org.eclipse.lsp4j.CodeActionParams; @@ -103,6 +109,13 @@ import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.ReferenceParams; import org.eclipse.lsp4j.RenameParams; +import org.eclipse.lsp4j.SemanticTokens; +import org.eclipse.lsp4j.SemanticTokensCapabilities; +import org.eclipse.lsp4j.SemanticTokensLegend; +import org.eclipse.lsp4j.SemanticTokensParams; +import org.eclipse.lsp4j.SemanticTokensServerFull; +import org.eclipse.lsp4j.SemanticTokensWithRegistrationOptions; +import org.eclipse.lsp4j.ServerCapabilities; import org.eclipse.lsp4j.SignatureHelp; import org.eclipse.lsp4j.SignatureHelpParams; import org.eclipse.lsp4j.SymbolInformation; @@ -133,6 +146,7 @@ import org.netbeans.api.java.source.support.ReferencesCount; import org.netbeans.api.java.source.ui.ElementJavadoc; import org.netbeans.api.lexer.TokenSequence; +import org.netbeans.api.lexer.Token; import org.netbeans.modules.editor.java.GoToSupport; import org.netbeans.modules.editor.java.GoToSupport.Context; import org.netbeans.modules.editor.java.GoToSupport.GoToTarget; @@ -140,8 +154,11 @@ import org.netbeans.modules.java.completion.JavaCompletionTask; import org.netbeans.modules.java.completion.JavaCompletionTask.Options; import org.netbeans.modules.java.completion.JavaDocumentationTask; +import org.netbeans.modules.java.editor.base.semantic.ColoringAttributes; import org.netbeans.modules.java.editor.base.semantic.MarkOccurrencesHighlighterBase; import org.netbeans.modules.java.editor.codegen.GeneratorUtils; +import org.netbeans.modules.java.editor.base.semantic.SemanticHighlighterBase; +import org.netbeans.modules.java.editor.base.semantic.SemanticHighlighterBase.ErrorDescriptionSetter; import org.netbeans.modules.java.editor.options.MarkOccurencesSettings; import org.netbeans.modules.java.hints.errors.ImportClass; import org.netbeans.modules.java.hints.infrastructure.CreatorBasedLazyFixList; @@ -174,6 +191,7 @@ import org.openide.text.PositionBounds; import org.openide.util.Exceptions; import org.openide.util.Lookup; +import org.openide.util.Pair; import org.openide.util.RequestProcessor; import org.openide.util.lookup.Lookups; @@ -263,6 +281,47 @@ public void connect(LanguageClient client) { this.client = (NbCodeLanguageClient)client; } + private int[] coloring2TokenType; + private int[] coloring2TokenModifier; + + { + coloring2TokenType = new int[ColoringAttributes.values().length]; + Arrays.fill(coloring2TokenType, -1); + coloring2TokenModifier = new int[ColoringAttributes.values().length]; + Arrays.fill(coloring2TokenModifier, -1); + } + + public void init(ClientCapabilities clientCapabilities, ServerCapabilities severCapabilities) { + SemanticTokensCapabilities semanticTokens = clientCapabilities != null && clientCapabilities.getTextDocument() != null ? clientCapabilities.getTextDocument().getSemanticTokens() : null; + if (semanticTokens != null) { + SemanticTokensWithRegistrationOptions cap = new SemanticTokensWithRegistrationOptions(); + cap.setFull(new SemanticTokensServerFull(false)); + Set knownTokenTypes = semanticTokens.getTokenTypes() != null ? new HashSet<>(semanticTokens.getTokenTypes()) : Collections.emptySet(); + Map tokenLegend = new LinkedHashMap<>(); + for (Entry> e : COLORING_TO_TOKEN_TYPE_CANDIDATES.entrySet()) { + for (String candidate : e.getValue()) { + if (knownTokenTypes.contains(candidate)) { + coloring2TokenType[e.getKey().ordinal()] = tokenLegend.computeIfAbsent(candidate, c -> tokenLegend.size()); + break; + } + } + } + Set knownTokenModifiers = semanticTokens.getTokenModifiers() != null ? new HashSet<>(semanticTokens.getTokenModifiers()) : Collections.emptySet(); + Map modifiersLegend = new LinkedHashMap<>(); + for (Entry> e : COLORING_TO_TOKEN_MODIFIERS_CANDIDATES.entrySet()) { + for (String candidate : e.getValue()) { + if (knownTokenModifiers.contains(candidate)) { + coloring2TokenModifier[e.getKey().ordinal()] = modifiersLegend.computeIfAbsent(candidate, c -> 1 << modifiersLegend.size()); + break; + } + } + } + SemanticTokensLegend legend = new SemanticTokensLegend(new ArrayList<>(tokenLegend.keySet()), new ArrayList<>(modifiersLegend.keySet())); + cap.setLegend(legend); + severCapabilities.setSemanticTokensProvider(cap); + } + } + private static class ItemFactoryImpl implements JavaCompletionTask.ItemFactory { private final LanguageClient client; @@ -1386,4 +1445,93 @@ private static void reportNotificationDone(String s, Object parameter) { * this hook, if defined, with the method name and parameter. */ static BiConsumer HOOK_NOTIFICATION = null; + + private static final Map> COLORING_TO_TOKEN_TYPE_CANDIDATES = new HashMap>() {{ + put(ColoringAttributes.FIELD, Arrays.asList("member")); + put(ColoringAttributes.RECORD_COMPONENT, Arrays.asList("member")); + put(ColoringAttributes.LOCAL_VARIABLE, Arrays.asList("variable")); + put(ColoringAttributes.PARAMETER, Arrays.asList("parameter")); + put(ColoringAttributes.METHOD, Arrays.asList("method", "function")); + put(ColoringAttributes.CONSTRUCTOR, Arrays.asList("method", "function")); + put(ColoringAttributes.CLASS, Arrays.asList("class")); + put(ColoringAttributes.RECORD, Arrays.asList("class")); + put(ColoringAttributes.INTERFACE, Arrays.asList("interface")); + put(ColoringAttributes.ANNOTATION_TYPE, Arrays.asList("interface")); + put(ColoringAttributes.ENUM, Arrays.asList("enum")); + put(ColoringAttributes.TYPE_PARAMETER_DECLARATION, Arrays.asList("typeParameter")); + }}; + + private static final Map> COLORING_TO_TOKEN_MODIFIERS_CANDIDATES = new HashMap>() {{ + put(ColoringAttributes.ABSTRACT, Arrays.asList("abstract")); + put(ColoringAttributes.DECLARATION, Arrays.asList("declaration")); + put(ColoringAttributes.DEPRECATED, Arrays.asList("deprecated")); + put(ColoringAttributes.STATIC, Arrays.asList("static")); + }}; + + @Override + public CompletableFuture semanticTokensFull(SemanticTokensParams params) { + JavaSource js = getSource(params.getTextDocument().getUri()); + List result = new ArrayList<>(); + try { + js.runUserActionTask(cc -> { + cc.toPhase(JavaSource.Phase.RESOLVED); + Document doc = cc.getSnapshot().getSource().getDocument(true); + new SemanticHighlighterBase() { + @Override + protected boolean process(CompilationInfo info, Document doc) { + process(info, doc, new ErrorDescriptionSetter() { + @Override + public void setHighlights(Document doc, Collection> highlights, Map preText) { + //...nothing + } + + @Override + public void setColorings(Document doc, Map colorings) { + int line = 0; + long column = 0; + int lastLine = 0; + long currentLineStart = 0; + long nextLineStart = info.getCompilationUnit().getLineMap().getStartPosition(line + 2); + Map ordered = new TreeMap<>((t1, t2) -> t1.offset(null) - t2.offset(null)); + ordered.putAll(colorings); + for (Entry e : ordered.entrySet()) { + int currentOffset = e.getKey().offset(null); + while (nextLineStart < currentOffset) { + line++; + currentLineStart = nextLineStart; + nextLineStart = info.getCompilationUnit().getLineMap().getStartPosition(line + 2); + column = 0; + } + Optional tokenType = e.getValue().stream().map(c -> coloring2TokenType[c.ordinal()]).collect(Collectors.maxBy((v1, v2) -> v1.intValue() - v2.intValue())); + int modifiers = 0; + for (ColoringAttributes c : e.getValue()) { + int mod = coloring2TokenModifier[c.ordinal()]; + if (mod != (-1)) { + modifiers |= mod; + } + } + if (tokenType.isPresent()) { + result.add(line - lastLine); + result.add((int) (currentOffset - currentLineStart - column)); + result.add(e.getKey().length()); + result.add(tokenType.get()); + result.add(modifiers); + lastLine = line; + column = currentOffset - currentLineStart; + } + } + } + }); + return true; + } + }.process(cc, doc); + }, true); + } catch (IOException ex) { + //TODO: include stack trace: + client.logMessage(new MessageParams(MessageType.Error, ex.getMessage())); + } + SemanticTokens tokens = new SemanticTokens(result); + return CompletableFuture.completedFuture(tokens); + } + } diff --git a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java index d80ac25610a8..b2c1d7cf6c8e 100644 --- a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java +++ b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java @@ -39,6 +39,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.TreeSet; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Semaphore; @@ -48,6 +49,7 @@ import javax.swing.text.StyledDocument; import org.eclipse.lsp4j.ApplyWorkspaceEditParams; import org.eclipse.lsp4j.ApplyWorkspaceEditResponse; +import org.eclipse.lsp4j.ClientCapabilities; import org.eclipse.lsp4j.CodeAction; import org.eclipse.lsp4j.CodeActionContext; import org.eclipse.lsp4j.CodeActionKind; @@ -82,8 +84,13 @@ import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.ReferenceContext; import org.eclipse.lsp4j.ReferenceParams; +import org.eclipse.lsp4j.SemanticTokens; +import org.eclipse.lsp4j.SemanticTokensCapabilities; +import org.eclipse.lsp4j.SemanticTokensLegend; +import org.eclipse.lsp4j.SemanticTokensParams; import org.eclipse.lsp4j.ShowMessageRequestParams; import org.eclipse.lsp4j.SymbolInformation; +import org.eclipse.lsp4j.TextDocumentClientCapabilities; import org.eclipse.lsp4j.TextDocumentContentChangeEvent; import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.TextDocumentItem; @@ -2235,6 +2242,95 @@ public NbCodeClientCapabilities getNbCodeCapabilities() { fileChanges.get(1).getNewText()); } + public void testSemanticHighlighting() throws Exception { + File src = new File(getWorkDir(), "Test.java"); + src.getParentFile().mkdirs(); + String code = "public class Test {\n" + + " private static final int C = 0;\n" + + " public int method(int p) {\n" + + " int l = p + method(0);\n" + + " }\n" + + "}\n"; + try (Writer w = new FileWriter(src)) { + w.write(code); + } + FileUtil.refreshFor(getWorkDir()); + Launcher serverLauncher = LSPLauncher.createClientLauncher(new LanguageClient() { + @Override + public void telemetryEvent(Object arg0) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void publishDiagnostics(PublishDiagnosticsParams params) { + } + + @Override + public void showMessage(MessageParams arg0) { + } + + @Override + public CompletableFuture showMessageRequest(ShowMessageRequestParams arg0) { + throw new UnsupportedOperationException("Not supported yet."); + } + + @Override + public void logMessage(MessageParams arg0) { + throw new UnsupportedOperationException("Not supported yet."); + } + }, client.getInputStream(), client.getOutputStream()); + serverLauncher.startListening(); + LanguageServer server = serverLauncher.getRemoteProxy(); + ClientCapabilities clientCaps = new ClientCapabilities(); + TextDocumentClientCapabilities textCaps = new TextDocumentClientCapabilities(); + clientCaps.setTextDocument(textCaps); + SemanticTokensCapabilities sematicTokensCapabilities = new SemanticTokensCapabilities(true); + sematicTokensCapabilities.setTokenTypes(Arrays.asList("member", "variable", "parameter", "method", "function", "class", "interface", "enum","typeParameter")); + sematicTokensCapabilities.setTokenModifiers(Arrays.asList("declaration", "static")); + textCaps.setSemanticTokens(sematicTokensCapabilities); + InitializeParams initParams = new InitializeParams(); + initParams.setCapabilities(clientCaps); + InitializeResult result = server.initialize(initParams).get(); + assertNotNull(result.getCapabilities().getSemanticTokensProvider()); + SemanticTokensLegend legend = result.getCapabilities().getSemanticTokensProvider().getLegend(); + server.getTextDocumentService().didOpen(new DidOpenTextDocumentParams(new TextDocumentItem(toURI(src), "java", 0, code))); + assertColoring(legend, + server.getTextDocumentService().semanticTokensFull(new SemanticTokensParams(new TextDocumentIdentifier(toURI(src)))).get(), + "0:13-17:class:[declaration]", + "1:29-30:member:[declaration, static]", + "2:15-21:method:[declaration]", + "2:26-27:parameter:[declaration]", + "3:12-13:variable:[declaration]", + "3:16-17:parameter:[]", + "3:20-26:method:[]"); + } + + private void assertColoring(SemanticTokensLegend legend, SemanticTokens tokens, String... expected) { + List coloring = new ArrayList<>(); + int line = 0; + int column = 0; + + for (int i = 0; i < tokens.getData().size(); i += 5) { + line += tokens.getData().get(i); + if (tokens.getData().get(i) != 0) { + column = 0; + } + column += tokens.getData().get(i + 1); + int endColumn = column + tokens.getData().get(i + 2); + String tokenType = legend.getTokenTypes().get(tokens.getData().get(i + 3)); + Set modifiers = new TreeSet<>(); + int mods = tokens.getData().get(i + 4); + int pos; + while ((pos = Integer.highestOneBit(mods)) != 0) { + mods &= ~pos; + modifiers.add(legend.getTokenModifiers().get(Integer.numberOfTrailingZeros(pos))); + } + coloring.add("" + line + ":" + column + "-" + endColumn + ":" + tokenType + ":" + modifiers); + } + + assertEquals(Arrays.asList(expected), coloring); + } + private String toString(Location location) { String path = location.getUri(); String simpleName = path.substring(path.lastIndexOf('/') + 1); diff --git a/java/java.lsp.server/vscode/package-lock.json b/java/java.lsp.server/vscode/package-lock.json index 3ed2b2eac138..169bed39552c 100644 --- a/java/java.lsp.server/vscode/package-lock.json +++ b/java/java.lsp.server/vscode/package-lock.json @@ -33,15 +33,15 @@ "dev": true }, "@types/vscode": { - "version": "1.47.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.47.0.tgz", - "integrity": "sha512-nJA37ykkz9FYA0ZOQUSc3OZnhuzEW2vUhUEo4MiduUo82jGwwcLfyvmgd/Q7b0WrZAAceojGhZybg319L24bTA==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.52.0.tgz", + "integrity": "sha512-Kt3bvWzAvvF/WH9YEcrCICDp0Z7aHhJGhLJ1BxeyNP6yRjonWqWnAIh35/pXAjswAnWOABrYlF7SwXR9+1nnLA==", "dev": true }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=", "dev": true, "requires": { "es6-promisify": "^5.0.0" @@ -84,8 +84,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "binary-extensions": { "version": "2.1.0", @@ -96,8 +95,7 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, + "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -115,7 +113,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", "dev": true }, "camelcase": { @@ -205,8 +203,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "decamelize": { "version": "1.2.0", @@ -226,7 +223,7 @@ "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", "dev": true }, "es-abstract": { @@ -262,7 +259,7 @@ "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=", "dev": true }, "es6-promisify": { @@ -364,7 +361,7 @@ "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", "dev": true }, "has": { @@ -397,7 +394,7 @@ "http-proxy-agent": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=", "dev": true, "requires": { "agent-base": "4", @@ -455,7 +452,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", "dev": true }, "is-binary-path": { @@ -555,11 +552,18 @@ "chalk": "^2.4.2" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", "requires": { "brace-expansion": "^1.1.7" } @@ -811,9 +815,12 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "requires": { + "lru-cache": "^6.0.0" + } }, "set-blocking": { "version": "2.0.0", @@ -903,32 +910,33 @@ "integrity": "sha512-nVsfVCat9FZlOso5SYB1LQQiFGifTyOALpkpJdudDlRXGTpI3mSFiDYXWaoFm7UcfqTOzn1SC7Hqw4d89btT0w==" }, "vscode-jsonrpc": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-5.0.1.tgz", - "integrity": "sha512-JvONPptw3GAQGXlVV2utDcHx0BiY34FupW/kI6mZ5x06ER5DdPG/tXWMVHjTNULF5uKPOUUD0SaXg5QaubJL0A==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==" }, "vscode-languageclient": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-6.1.3.tgz", - "integrity": "sha512-YciJxk08iU5LmWu7j5dUt9/1OLjokKET6rME3cI4BRpiF6HZlusm2ZwPt0MYJ0lV5y43sZsQHhyon2xBg4ZJVA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", "requires": { - "semver": "^6.3.0", - "vscode-languageserver-protocol": "^3.15.3" + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" } }, "vscode-languageserver-protocol": { - "version": "3.15.3", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.15.3.tgz", - "integrity": "sha512-zrMuwHOAQRhjDSnflWdJG+O2ztMWss8GqUUB8dXLR/FPenwkiBNkMIJJYfSN6sgskvsF0rHAoBowNQfbyZnnvw==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", "requires": { - "vscode-jsonrpc": "^5.0.1", - "vscode-languageserver-types": "3.15.1" + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" } }, "vscode-languageserver-types": { - "version": "3.15.1", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz", - "integrity": "sha512-+a9MPUQrNGRrGU630OGbYVQ+11iOIovjCkqxajPa9w57Sd5ruK8WQNsslzpa0x/QJqC8kRc2DUxWjIFwoNm4ZQ==" + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" }, "vscode-test": { "version": "1.4.0", @@ -1046,6 +1054,11 @@ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "yargs": { "version": "13.3.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", diff --git a/java/java.lsp.server/vscode/package.json b/java/java.lsp.server/vscode/package.json index be8ee425d779..62f6288c828c 100644 --- a/java/java.lsp.server/vscode/package.json +++ b/java/java.lsp.server/vscode/package.json @@ -175,7 +175,7 @@ "nbjavac": "node ./out/nbcode.js -J-Dnetbeans.close=true --modules --install .*nbjavac.*" }, "devDependencies": { - "@types/vscode": "^1.47.0", + "@types/vscode": "^1.52.0", "@types/glob": "^7.1.1", "@types/mocha": "^7.0.2", "@types/node": "^13.11.0", @@ -185,7 +185,7 @@ "vscode-test": "^1.3.0" }, "dependencies": { - "vscode-languageclient": "6.1.3", + "vscode-languageclient": "7.0.0", "vscode-debugadapter": "1.42.1" } } diff --git a/java/java.lsp.server/vscode/src/extension.ts b/java/java.lsp.server/vscode/src/extension.ts index d0394e39ecdc..3aea3a92d6b3 100644 --- a/java/java.lsp.server/vscode/src/extension.ts +++ b/java/java.lsp.server/vscode/src/extension.ts @@ -21,17 +21,20 @@ import { commands, window, workspace, ExtensionContext, ProgressLocation } from 'vscode'; import { - LanguageClient, LanguageClientOptions, CloseAction, ErrorAction, - StreamInfo, Message, MessageType, LogMessageNotification, HandlerResult } from 'vscode-languageclient'; +import { + LanguageClient, + StreamInfo, +} from 'vscode-languageclient/node'; + import * as net from 'net'; import * as fs from 'fs'; import * as path from 'path'; diff --git a/java/java.lsp.server/vscode/src/protocol.ts b/java/java.lsp.server/vscode/src/protocol.ts index 6f56c6dba6ad..01517bee4593 100644 --- a/java/java.lsp.server/vscode/src/protocol.ts +++ b/java/java.lsp.server/vscode/src/protocol.ts @@ -33,7 +33,7 @@ export interface ShowStatusMessageParams extends ShowMessageParams { } export namespace StatusMessageRequest { - export const type = new NotificationType('window/showStatusBarMessage'); + export const type = new NotificationType('window/showStatusBarMessage'); }; export interface ShowQuickPickParams { @@ -52,7 +52,7 @@ export interface ShowQuickPickParams { } export namespace QuickPickRequest { - export const type = new RequestType('window/showQuickPick'); + export const type = new RequestType('window/showQuickPick'); } export interface ShowInputBoxParams { @@ -67,5 +67,5 @@ export interface ShowInputBoxParams { } export namespace InputBoxRequest { - export const type = new RequestType('window/showInputBox'); + export const type = new RequestType('window/showInputBox'); } From 5dbacc5bfb36a682788bff899fb24a79cdf5b0f3 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Fri, 25 Dec 2020 21:51:25 +0100 Subject: [PATCH 2/9] Adding forgotten file. --- .../client/bindings/SemanticHighlight.java | 207 ++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/SemanticHighlight.java diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/SemanticHighlight.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/SemanticHighlight.java new file mode 100644 index 000000000000..e40323a6ef6c --- /dev/null +++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/SemanticHighlight.java @@ -0,0 +1,207 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.netbeans.modules.lsp.client.bindings; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import javax.swing.text.AttributeSet; +import javax.swing.text.Document; +import javax.swing.text.JTextComponent; +import org.eclipse.lsp4j.Position; +import org.eclipse.lsp4j.SemanticTokens; +import org.eclipse.lsp4j.SemanticTokensLegend; +import org.eclipse.lsp4j.SemanticTokensParams; +import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.eclipse.lsp4j.generator.JsonRpcData; +import org.eclipse.lsp4j.jsonrpc.services.JsonRequest; +import org.netbeans.api.editor.mimelookup.MimeLookup; +import org.netbeans.api.editor.mimelookup.MimePath; +import org.netbeans.api.editor.mimelookup.MimeRegistration; +import org.netbeans.api.editor.settings.AttributesUtilities; +import org.netbeans.api.editor.settings.FontColorSettings; +import org.netbeans.modules.lsp.client.LSPBindings; +import org.netbeans.modules.lsp.client.LSPBindings.BackgroundTask; +import org.netbeans.modules.lsp.client.Utils; +import org.netbeans.spi.editor.highlighting.HighlightsLayer; +import org.netbeans.spi.editor.highlighting.HighlightsLayerFactory; +import org.netbeans.spi.editor.highlighting.ZOrder; +import org.netbeans.spi.editor.highlighting.support.OffsetsBag; +import org.openide.filesystems.FileObject; +import org.openide.util.Exceptions; + +/** + * + * @author lahvac + */ +public class SemanticHighlight implements BackgroundTask { + + private final Document doc; + + public SemanticHighlight(JTextComponent c) { + this.doc = c.getDocument(); + } + + @Override + public void run(LSPBindings bindings, FileObject file) { + try { + OffsetsBag target = new OffsetsBag(doc); + SemanticTokensParams params = new SemanticTokensParams(new TextDocumentIdentifier(Utils.toURI(file))); + SemanticTokens tokens = bindings.getTextDocumentService().semanticTokensFull(params).get(); + List data = tokens.getData(); + int lastLine = 0; + int lastColumn = 0; + int offset = 0; + for (int i = 0; i < data.size(); i += 5) { + int deltaLine = data.get(i).intValue(); + int deltaColumn = data.get(i + 1).intValue(); + if (deltaLine == 0) { + lastColumn += deltaColumn; + offset += deltaColumn; + } else { + lastLine += deltaLine; + lastColumn = deltaColumn; + offset = Utils.getOffset(doc, new Position(lastLine, lastColumn)); + } + if (data.get(i + 2).intValue() <= 0) { + continue; //XXX! + } + AttributeSet tokenHighlight = tokenHighlight(bindings, data.get(i + 3).intValue(), data.get(i + 4).intValue()); + target.addHighlight(offset, offset + data.get(i + 2).intValue(), tokenHighlight); + } + getBag(doc).setHighlights(target); + } catch (InterruptedException | ExecutionException ex) { + Exceptions.printStackTrace(ex); + } + } + + private final Map> tokenId2Highlight = new HashMap<>(); + + private AttributeSet tokenHighlight(LSPBindings bindings, int tokenId, int modifiers) { + return tokenId2Highlight.computeIfAbsent(tokenId, s -> new HashMap<>()) + .computeIfAbsent(modifiers, mods -> { + SemanticTokensLegend legend = bindings.getInitResult().getCapabilities().getSemanticTokensProvider().getLegend(); + List tokenTypes = legend.getTokenTypes(); + if (tokenId >= tokenTypes.size()) { + //invalid token id + return EMPTY; + } + String tokenName = tokenTypes.get(tokenId); + boolean isStatic = false; + boolean isDeclaration = false; + while (mods != 0) { + int mod = Integer.highestOneBit(mods); + switch (legend.getTokenModifiers().get(Integer.numberOfTrailingZeros(mod))) { + case "static": isStatic = true; break; + case "definition": + case "declaration": isDeclaration = true; break; + } + mods &= ~mod; + } + FontColorSettings fcs = MimeLookup.getLookup("text/textmate").lookup(FontColorSettings.class); + + if (fcs == null) { + return EMPTY; + } + + assert fcs != null; + + AttributeSet colors = fcs.getTokenFontColors("mod-" + tokenName + (isDeclaration ? "-declaration" : "")); + AttributeSet statik = isStatic ? fcs.getTokenFontColors("mod-static") : null; + + if (colors != null && statik != null) { + return AttributesUtilities.createComposite(colors, statik); + } else if (colors != null) { + return colors; + } else if (statik != null) { + return statik; + } + + return EMPTY; + }); + } + + private static final AttributeSet EMPTY = AttributesUtilities.createImmutable(); + + private static OffsetsBag getBag(Document doc) { + OffsetsBag bag = (OffsetsBag) doc.getProperty(SemanticHighlight.class); + + if (bag == null) { + doc.putProperty(SemanticHighlight.class, bag = new OffsetsBag(doc)); + } + + return bag; + } + + @MimeRegistration(mimeType="", service=HighlightsLayerFactory.class) + public static final class HighlightsLayerFactoryImpl implements HighlightsLayerFactory { + + @Override + public HighlightsLayer[] createLayers(Context context) { + return new HighlightsLayer[] { + HighlightsLayer.create(SemanticHighlight.class.getName(), ZOrder.SYNTAX_RACK.forPosition(1000), true, getBag(context.getDocument())) + }; + } + + } + +// @JsonRpcData +// public static class SemanticTokensParams { +// +// private TextDocumentIdentifier textDocument; +// +// public SemanticTokensParams() { +// } +// +// public SemanticTokensParams(TextDocumentIdentifier textDocument) { +// this.textDocument = textDocument; +// } +// +// public TextDocumentIdentifier getTextDocument() { +// return textDocument; +// } +// +// public void setTextDocument(TextDocumentIdentifier textDocument) { +// this.textDocument = textDocument; +// } +// +// } +// +// @JsonRpcData +// public static class SemanticTokens { +// private List data; +// +// public List getData() { +// return data; +// } +// +// public void setData(List data) { +// this.data = data; +// } +// +// } +// public interface SemanticService { +// @JsonRequest("textDocument/semanticTokens/full") +// public CompletableFuture semanticTokensFull(SemanticTokensParams params); +// } +} From 598d6146693743d433002fbeb60aa7c73f2872e9 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Sat, 26 Dec 2020 22:47:52 +0100 Subject: [PATCH 3/9] Fixing build. --- java/java.lsp.server/vscode/package.json | 2 +- .../antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java/java.lsp.server/vscode/package.json b/java/java.lsp.server/vscode/package.json index 62f6288c828c..86ff1b334de9 100644 --- a/java/java.lsp.server/vscode/package.json +++ b/java/java.lsp.server/vscode/package.json @@ -21,7 +21,7 @@ "multi-root ready" ], "engines": { - "vscode": "^1.47.0" + "vscode": "^1.52.0" }, "activationEvents": [ "onLanguage:java", diff --git a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps index b952575ccfba..bb732e80aba0 100644 --- a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps +++ b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps @@ -86,9 +86,9 @@ enterprise/javaee7.api/external/jsr181-api-1.0-MR1.jar java/websvc.jaxws21api/ex ide/libs.bytelist/external/jcodings-1.0.18.jar ide/textmate.lexer/external/jcodings-1.0.18.jar # ide/lsp.client and java/java.lsp.server both use LSP libraries, but are independent: -ide/lsp.client/external/org.eclipse.lsp4j-0.9.0.jar java/java.lsp.server/external/org.eclipse.lsp4j-0.9.0.jar -ide/lsp.client/external/org.eclipse.lsp4j.generator-0.9.0.jar java/java.lsp.server/external/org.eclipse.lsp4j.generator-0.9.0.jar -ide/lsp.client/external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar java/java.lsp.server/external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar +ide/lsp.client/external/org.eclipse.lsp4j-0.10.0.jar java/java.lsp.server/external/org.eclipse.lsp4j-0.10.0.jar +ide/lsp.client/external/org.eclipse.lsp4j.generator-0.10.0.jar java/java.lsp.server/external/org.eclipse.lsp4j.generator-0.10.0.jar +ide/lsp.client/external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar java/java.lsp.server/external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar ide/lsp.client/external/org.eclipse.xtend.lib-2.19.0.jar java/java.lsp.server/external/org.eclipse.xtend.lib-2.19.0.jar ide/lsp.client/external/org.eclipse.xtend.lib.macro-2.19.0.jar java/java.lsp.server/external/org.eclipse.xtend.lib.macro-2.19.0.jar ide/lsp.client/external/org.eclipse.xtext.xbase.lib-2.19.0.jar java/java.lsp.server/external/org.eclipse.xtext.xbase.lib-2.19.0.jar From 25217df86496db3a95114cbae3c6a8be6fd30a97 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Mon, 28 Dec 2020 17:37:39 +0100 Subject: [PATCH 4/9] Trying to fix VSCode test problem --- java/java.lsp.server/vscode/package-lock.json | 61 +++++++------------ java/java.lsp.server/vscode/package.json | 2 +- 2 files changed, 22 insertions(+), 41 deletions(-) diff --git a/java/java.lsp.server/vscode/package-lock.json b/java/java.lsp.server/vscode/package-lock.json index 169bed39552c..98682245d471 100644 --- a/java/java.lsp.server/vscode/package-lock.json +++ b/java/java.lsp.server/vscode/package-lock.json @@ -41,7 +41,7 @@ "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha1-gWXwHENgCbzK0LHRIvBe13Dvxu4=", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", "dev": true, "requires": { "es6-promisify": "^5.0.0" @@ -205,6 +205,15 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -259,7 +268,7 @@ "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha1-TrIVlMlyvEBVPSduUQU5FD21Pgo=", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", "dev": true }, "es6-promisify": { @@ -394,28 +403,11 @@ "http-proxy-agent": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha1-5IIb7vWyFCogJr1zkm/lN2McVAU=", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "dev": true, "requires": { "agent-base": "4", "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } } }, "https-proxy-agent": { @@ -426,17 +418,6 @@ "requires": { "agent-base": "^4.3.0", "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, "inflight": { @@ -670,9 +651,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, "node-environment-flags": { @@ -806,9 +787,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" @@ -939,9 +920,9 @@ "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" }, "vscode-test": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.0.tgz", - "integrity": "sha512-Jt7HNGvSE0+++Tvtq5wc4hiXLIr2OjDShz/gbAfM/mahQpy4rKBnmOK33D+MR67ATWviQhl+vpmU3p/qwSH/Pg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.1.tgz", + "integrity": "sha512-Ls7+JyC06cUCuomlTYk4aNJI00Rri09hgtkNl3zfQ1bj6meXglpSPpuzJ/RPNetlUHFMm4eGs0Xr/H5pFPVwfQ==", "dev": true, "requires": { "http-proxy-agent": "^2.1.0", diff --git a/java/java.lsp.server/vscode/package.json b/java/java.lsp.server/vscode/package.json index 86ff1b334de9..fdbf5bc8c591 100644 --- a/java/java.lsp.server/vscode/package.json +++ b/java/java.lsp.server/vscode/package.json @@ -182,7 +182,7 @@ "glob": "^7.1.6", "mocha": "^7.1.2", "typescript": "^3.8.3", - "vscode-test": "^1.3.0" + "vscode-test": "^1.4.1" }, "dependencies": { "vscode-languageclient": "7.0.0", From cf0d617303c2f3c1fabeb1bb14d3eba9bec1087b Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Tue, 29 Dec 2020 13:50:36 +0100 Subject: [PATCH 5/9] Attempting to fix tests. --- java/java.lsp.server/vscode/src/test/runTest.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java.lsp.server/vscode/src/test/runTest.ts b/java/java.lsp.server/vscode/src/test/runTest.ts index 5ed5f50a97e8..0059614df036 100644 --- a/java/java.lsp.server/vscode/src/test/runTest.ts +++ b/java/java.lsp.server/vscode/src/test/runTest.ts @@ -23,7 +23,7 @@ async function main() { // Download VS Code, unzip it and run the integration test await runTests({ - version: "1.50.0", + version: "1.52.0", extensionDevelopmentPath, extensionTestsPath, extensionTestsEnv: { From 2e08f4076ba73541afb6f00fe9ce3414c8e06afa Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Sun, 17 Oct 2021 19:28:09 +0200 Subject: [PATCH 6/9] Fixing implementation of semantic highlight. --- ide/c.google.gson/external/binaries-list | 2 +- ...8.5-license.txt => gson-2.8.8-license.txt} | 2 +- .../nbproject/project.properties | 2 +- ide/c.google.gson/nbproject/project.xml | 2 +- java/java.lsp.server/external/binaries-list | 10 +- ...0-license.txt => lsp4j-0.12.0-license.txt} | 4 +- .../nbproject/project.properties | 10 +- java/java.lsp.server/nbproject/project.xml | 20 +- .../server/progress/LspInternalHandle.java | 8 +- .../lsp/server/progress/OperationContext.java | 26 +- .../server/protocol/NbCodeClientWrapper.java | 6 - .../java/lsp/server/protocol/Server.java | 60 +- .../protocol/TextDocumentServiceImpl.java | 2 +- .../java/lsp/server/protocol/ServerTest.java | 13 +- java/java.lsp.server/vscode/package-lock.json | 1231 ++++++++++++++++- java/java.lsp.server/vscode/package.json | 5 +- java/java.lsp.server/vscode/src/extension.ts | 3 +- java/java.lsp.server/vscode/src/protocol.ts | 10 +- .../java.lsp.server/vscode/src/testAdapter.ts | 2 +- 19 files changed, 1283 insertions(+), 135 deletions(-) rename ide/c.google.gson/external/{gson-2.8.5-license.txt => gson-2.8.8-license.txt} (99%) rename java/java.lsp.server/external/{lsp4j-0.10.0-license.txt => lsp4j-0.12.0-license.txt} (98%) diff --git a/ide/c.google.gson/external/binaries-list b/ide/c.google.gson/external/binaries-list index 3aef65dae49c..11456832492e 100644 --- a/ide/c.google.gson/external/binaries-list +++ b/ide/c.google.gson/external/binaries-list @@ -14,4 +14,4 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -F645ED69D595B24D4CF8B3FBB64CC505BEDE8829 com.google.code.gson:gson:2.8.5 +431FC3CBC0FF81ABDBFDE070062741089C3BA874 com.google.code.gson:gson:2.8.8 diff --git a/ide/c.google.gson/external/gson-2.8.5-license.txt b/ide/c.google.gson/external/gson-2.8.8-license.txt similarity index 99% rename from ide/c.google.gson/external/gson-2.8.5-license.txt rename to ide/c.google.gson/external/gson-2.8.8-license.txt index 4485fea77d42..2d6338bfa770 100644 --- a/ide/c.google.gson/external/gson-2.8.5-license.txt +++ b/ide/c.google.gson/external/gson-2.8.8-license.txt @@ -1,7 +1,7 @@ Name: GSon Description: JSon serialization/deserialization library Origin: GitHub -Version: 2.8.5 +Version: 2.8.8 License: Apache-2.0 Apache License diff --git a/ide/c.google.gson/nbproject/project.properties b/ide/c.google.gson/nbproject/project.properties index 3d88bdf177e2..73a703b6f8c9 100644 --- a/ide/c.google.gson/nbproject/project.properties +++ b/ide/c.google.gson/nbproject/project.properties @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -release.external/gson-2.8.5.jar=modules/com-google-gson.jar +release.external/gson-2.8.8.jar=modules/com-google-gson.jar is.autoload=true javac.compilerargs=-Xlint -Xlint:-serial javac.source=1.8 diff --git a/ide/c.google.gson/nbproject/project.xml b/ide/c.google.gson/nbproject/project.xml index ba0c2f73248c..7b61dc8f6aa3 100644 --- a/ide/c.google.gson/nbproject/project.xml +++ b/ide/c.google.gson/nbproject/project.xml @@ -28,7 +28,7 @@ com-google-gson.jar - external/gson-2.8.5.jar + external/gson-2.8.8.jar diff --git a/java/java.lsp.server/external/binaries-list b/java/java.lsp.server/external/binaries-list index 39d428fe4750..a6d1a8a9ed9d 100644 --- a/java/java.lsp.server/external/binaries-list +++ b/java/java.lsp.server/external/binaries-list @@ -15,11 +15,11 @@ # specific language governing permissions and limitations # under the License. -271665493A1E35FB4C2D1DBABF19363C8AD27819 org.eclipse.lsp4j:org.eclipse.lsp4j:0.10.0 -18621C63F8D8587C0CC5EEB9CB945E49E9B5C900 org.eclipse.lsp4j:org.eclipse.lsp4j.debug:0.10.0 -ED2D6D876578B139AEA24289422435148FEF6B45 org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.10.0 -42CA44A49315A490804A3DED67163123748C1F19 org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.10.0 -30A70C7AC5E722F25843669F124CDACA9772B9C8 org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc.debug:0.10.0 +419B5181A4B2D054BF8FF764FCEB67DF09D87E7D org.eclipse.lsp4j:org.eclipse.lsp4j:0.12.0 +36F085FE35A24CD69A8E3F78F046E91D5DB8F360 org.eclipse.lsp4j:org.eclipse.lsp4j.debug: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 +FB4B99875D4879475FFFD864E3FE94E4E74BEEC1 org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc.debug: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/java/java.lsp.server/external/lsp4j-0.10.0-license.txt b/java/java.lsp.server/external/lsp4j-0.12.0-license.txt similarity index 98% rename from java/java.lsp.server/external/lsp4j-0.10.0-license.txt rename to java/java.lsp.server/external/lsp4j-0.12.0-license.txt index d90f3165e852..d35270897470 100644 --- a/java/java.lsp.server/external/lsp4j-0.10.0-license.txt +++ b/java/java.lsp.server/external/lsp4j-0.12.0-license.txt @@ -1,10 +1,10 @@ Name: Eclipse Language Server Protocol Library Origin: Eclipse -Version: 0.10.0 +Version: 0.12.0 License: EPL-v20 URL: http://www.eclipse.org/ Description: Eclipse Language Server Protocol Library -Files: org.eclipse.lsp4j-0.10.0.jar org.eclipse.lsp4j.debug-0.10.0.jar org.eclipse.lsp4j.generator-0.10.0.jar org.eclipse.lsp4j.jsonrpc-0.10.0.jar org.eclipse.lsp4j.jsonrpc.debug-0.10.0.jar +Files: org.eclipse.lsp4j-0.12.0.jar org.eclipse.lsp4j.debug-0.12.0.jar org.eclipse.lsp4j.generator-0.12.0.jar org.eclipse.lsp4j.jsonrpc-0.12.0.jar org.eclipse.lsp4j.jsonrpc.debug-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/java/java.lsp.server/nbproject/project.properties b/java/java.lsp.server/nbproject/project.properties index befcbed9ac79..bc3fb51d67b1 100644 --- a/java/java.lsp.server/nbproject/project.properties +++ b/java/java.lsp.server/nbproject/project.properties @@ -23,11 +23,11 @@ lsp.build.dir=vscode/nbcode test.unit.run.cp.extra= cp.extra=${tools.jar} -release.external/org.eclipse.lsp4j-0.10.0.jar=modules/ext/org.eclipse.lsp4j-0.10.0.jar -release.external/org.eclipse.lsp4j.debug-0.10.0.jar=modules/ext/org.eclipse.lsp4j.debug-0.10.0.jar -release.external/org.eclipse.lsp4j.generator-0.10.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.10.0.jar -release.external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.10.0.jar -release.external/org.eclipse.lsp4j.jsonrpc.debug-0.10.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc.debug-0.10.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.debug-0.12.0.jar=modules/ext/org.eclipse.lsp4j.debug-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.lsp4j.jsonrpc.debug-0.12.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc.debug-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/java/java.lsp.server/nbproject/project.xml b/java/java.lsp.server/nbproject/project.xml index 0fd387dc4d6e..8ef735e04dc3 100644 --- a/java/java.lsp.server/nbproject/project.xml +++ b/java/java.lsp.server/nbproject/project.xml @@ -680,24 +680,24 @@ org.netbeans.modules.java.lsp.server.ui - ext/org.eclipse.lsp4j.debug-0.10.0.jar - external/org.eclipse.lsp4j.debug-0.10.0.jar + ext/org.eclipse.lsp4j.debug-0.12.0.jar + external/org.eclipse.lsp4j.debug-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.10.0.jar - external/org.eclipse.lsp4j.generator-0.10.0.jar + ext/org.eclipse.lsp4j.generator-0.12.0.jar + external/org.eclipse.lsp4j.generator-0.12.0.jar - ext/org.eclipse.lsp4j.jsonrpc-0.10.0.jar - external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar + ext/org.eclipse.lsp4j.jsonrpc-0.12.0.jar + external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar - ext/org.eclipse.lsp4j.jsonrpc.debug-0.10.0.jar - external/org.eclipse.lsp4j.jsonrpc.debug-0.10.0.jar + ext/org.eclipse.lsp4j.jsonrpc.debug-0.12.0.jar + external/org.eclipse.lsp4j.jsonrpc.debug-0.12.0.jar ext/org.eclipse.xtend.lib-2.19.0.jar @@ -708,8 +708,8 @@ external/org.eclipse.xtext.xbase.lib-2.19.0.jar - ext/org.eclipse.lsp4j-0.10.0.jar - external/org.eclipse.lsp4j-0.10.0.jar + ext/org.eclipse.lsp4j-0.12.0.jar + external/org.eclipse.lsp4j-0.12.0.jar ext/commons-io-2.5.jar diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/progress/LspInternalHandle.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/progress/LspInternalHandle.java index 322a7165816b..b1638310ec28 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/progress/LspInternalHandle.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/progress/LspInternalHandle.java @@ -54,7 +54,7 @@ public final class LspInternalHandle extends InternalHandle { */ private final StackTraceElement[] creatorTrace; - private CompletableFuture> tokenPromise; + private CompletableFuture> tokenPromise; private int reportedPercentage; /** @@ -198,7 +198,7 @@ void sendProgress(ProgressEvent e) { notify(report); } - Either token() { + Either token() { if (tokenPromise == null || tokenPromise.isCompletedExceptionally()) { return null; } else { @@ -213,7 +213,7 @@ void sendFinish(ProgressEvent e) { opContext.removeHandle(token(), this); } - CompletableFuture> findProgressToken() { + CompletableFuture> findProgressToken() { if (tokenPromise != null) { return tokenPromise; } @@ -227,7 +227,7 @@ void notify(WorkDoneProgressNotification msg) { id(), msg ) ); - ProgressParams param = new ProgressParams(token, msg); + ProgressParams param = new ProgressParams(token, Either.forLeft(msg)); lspClient.notifyProgress(param); }); } diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/progress/OperationContext.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/progress/OperationContext.java index bdd726acc84e..514cf8ab5c9d 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/progress/OperationContext.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/progress/OperationContext.java @@ -67,7 +67,7 @@ public final class OperationContext { * Progress token for reporting progress to the client. The token is valid * for a single ProgressHandle created. */ - private Either progressToken; + private Either progressToken; /** * Token to report partial results to the client. @@ -111,8 +111,8 @@ private TaskModel getTaskModel() { * progress on the client, asking it to issue a token. * @return */ - public synchronized Either acquireProgressToken() { - Either t = progressToken; + public synchronized Either acquireProgressToken() { + Either t = progressToken; progressToken = null; return t; } @@ -126,7 +126,7 @@ public String getPartialResultsToken() { * soon. * @param s */ - public void setProgressToken(Either s) { + public void setProgressToken(Either s) { progressToken = s; } @@ -192,7 +192,7 @@ public boolean isActive() { * @param token token * @return handle instance or {@code null} */ - public InternalHandle findActiveHandle(Either token) { + public InternalHandle findActiveHandle(Either token) { if (top != this) { return top.findActiveHandle(token); } @@ -201,12 +201,12 @@ public InternalHandle findActiveHandle(Either token) { } } - private Either addHandle(Either token, InternalHandle h) { + private Either addHandle(Either token, InternalHandle h) { top.registerHandle(token, h); return token; } - void removeHandle(Either token, LspInternalHandle h) { + void removeHandle(Either token, LspInternalHandle h) { if (top != this) { top.unregisterHandle(token, h); } else { @@ -215,9 +215,9 @@ void removeHandle(Either token, LspInternalHandle h) { notifyHandleFinished(h); } - private Map, InternalHandle> handles = new HashMap<>(); + private Map, InternalHandle> handles = new HashMap<>(); - private synchronized void unregisterHandle(Either token, InternalHandle h) { + private synchronized void unregisterHandle(Either token, InternalHandle h) { if (token == null) { handles.values().remove(h); } else { @@ -225,19 +225,19 @@ private synchronized void unregisterHandle(Either token, Interna } } - private synchronized void registerHandle(Either token, InternalHandle h) { + private synchronized void registerHandle(Either token, InternalHandle h) { handles.put(token, h); } - CompletableFuture> acquireOrObtainToken(InternalHandle h) { - Either t = acquireProgressToken(); + CompletableFuture> acquireOrObtainToken(InternalHandle h) { + Either t = acquireProgressToken(); if (t != null) { return CompletableFuture.completedFuture(addHandle(t, h)); } else { WorkDoneProgressCreateParams params = new WorkDoneProgressCreateParams( Either.forLeft(UUID.randomUUID().toString()) ); - CompletableFuture> tokenPromise = client. + CompletableFuture> tokenPromise = client. createProgress(params).thenApply(v -> params.getToken()); return tokenPromise.thenApply((p) -> { synchronized (this) { diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java index 05520e0ee852..ea12c6aff02a 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java @@ -28,7 +28,6 @@ import org.eclipse.lsp4j.ProgressParams; import org.eclipse.lsp4j.PublishDiagnosticsParams; import org.eclipse.lsp4j.RegistrationParams; -import org.eclipse.lsp4j.SemanticHighlightingParams; import org.eclipse.lsp4j.ShowMessageRequestParams; import org.eclipse.lsp4j.UnregistrationParams; import org.eclipse.lsp4j.WorkDoneProgressCreateParams; @@ -130,11 +129,6 @@ public CompletableFuture> configuration(ConfigurationParams configu return remote.configuration(configurationParams); } - @Override - public void semanticHighlighting(SemanticHighlightingParams params) { - remote.semanticHighlighting(params); - } - @Override public CompletableFuture createProgress(WorkDoneProgressCreateParams params) { return remote.createProgress(params); diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java index c6f34a14dcfa..9a1c4288820d 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java @@ -18,10 +18,12 @@ */ package org.netbeans.modules.java.lsp.server.protocol; +import com.google.gson.InstanceCreator; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Method; +import java.lang.reflect.Type; import java.net.MalformedURLException; import java.util.ArrayList; import java.util.Arrays; @@ -55,8 +57,11 @@ import org.eclipse.lsp4j.MessageType; import org.eclipse.lsp4j.PublishDiagnosticsParams; import org.eclipse.lsp4j.RenameOptions; +import org.eclipse.lsp4j.SemanticTokensCapabilities; +import org.eclipse.lsp4j.SemanticTokensParams; import org.eclipse.lsp4j.ServerCapabilities; import org.eclipse.lsp4j.ShowMessageRequestParams; +import org.eclipse.lsp4j.TextDocumentIdentifier; import org.eclipse.lsp4j.TextDocumentSyncKind; import org.eclipse.lsp4j.WorkDoneProgressCancelParams; import org.eclipse.lsp4j.WorkDoneProgressParams; @@ -142,49 +147,18 @@ private static Launcher createLauncher(LanguageServerImpl .setInput(io.first()) .setOutput(io.second()) .wrapMessages(processor) -//<<<<<<< HEAD -// .configureGson(gb -> { -// gb.registerTypeAdapter(SemanticTokensCapabilities.class, new InstanceCreator() { -// @Override public SemanticTokensCapabilities createInstance(Type type) { -// return new SemanticTokensCapabilities(null); -// } -// }); -// gb.registerTypeAdapter(SemanticTokensParams.class, new InstanceCreator() { -// @Override public SemanticTokensParams createInstance(Type type) { -// return new SemanticTokensParams(new TextDocumentIdentifier("")); -// } -// }); -// gb.registerTypeAdapterFactory(new TypeAdapterFactory() { -// @Override -// public TypeAdapter create(Gson gson, TypeToken type) { -// if (RenameCapabilities.class.equals(type.getRawType())) { -// return new TypeAdapter() { -// @Override -// public void write(JsonWriter out, T value) throws IOException { -// throw new UnsupportedOperationException("Not supported."); -// } -// -// @Override -// public T read(JsonReader in) throws IOException { -// //a bug in LSP4J: RenameCapabilities expects -// //prepareSupportDefaultBehavior to have type boolean, -// //but the final protocol says it should be an int: -// Map props = gson.fromJson(in, Map.class); -// if (props.containsKey("prepareSupportDefaultBehavior")) { -// props.put("prepareSupportDefaultBehavior", "true"); -// } -// return (T) new Gson().fromJson(gson.toJson(props), RenameCapabilities.class); -// } -// }; -// } -// return null; -// } -// }); -// }) -// .traceMessages(new PrintWriter(System.err)) -//======= -// .traceMessages(new java.io.PrintWriter(System.err)) -//>>>>>>> master + .configureGson(gb -> { + gb.registerTypeAdapter(SemanticTokensCapabilities.class, new InstanceCreator() { + @Override public SemanticTokensCapabilities createInstance(Type type) { + return new SemanticTokensCapabilities(null); + } + }); + gb.registerTypeAdapter(SemanticTokensParams.class, new InstanceCreator() { + @Override public SemanticTokensParams createInstance(Type type) { + return new SemanticTokensParams(new TextDocumentIdentifier("")); + } + }); + }) .create(); } diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java index bb84e4c5374c..b7cfbe84373c 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/TextDocumentServiceImpl.java @@ -361,7 +361,7 @@ public CompletableFuture, CompletionList>> completio } org.netbeans.api.lsp.TextEdit edit = completion.getTextEdit(); if (edit != null) { - item.setTextEdit(new TextEdit(new Range(Utils.createPosition(file, edit.getStartOffset()), Utils.createPosition(file, edit.getEndOffset())), edit.getNewText())); + item.setTextEdit(Either.forLeft(new TextEdit(new Range(Utils.createPosition(file, edit.getStartOffset()), Utils.createPosition(file, edit.getEndOffset())), edit.getNewText()))); } if (completion.getAdditionalTextEdits() != null && completion.getAdditionalTextEdits().isDone()) { List additionalTextEdits = completion.getAdditionalTextEdits().getNow(null); diff --git a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java index c6f7379442e5..99405eead371 100644 --- a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java +++ b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/protocol/ServerTest.java @@ -1249,7 +1249,8 @@ public void logMessage(MessageParams arg0) { serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeResult result = server.initialize(new InitializeParams()).get(); - assertTrue(result.getCapabilities().getDocumentHighlightProvider()); + assertTrue(result.getCapabilities().getDocumentHighlightProvider().getLeft()); + assertTrue(result.getCapabilities().getDocumentHighlightProvider().getLeft()); server.getTextDocumentService().didOpen(new DidOpenTextDocumentParams(new TextDocumentItem(toURI(src), "java", 0, code))); assertHighlights(server.getTextDocumentService().documentHighlight(new DocumentHighlightParams(new TextDocumentIdentifier(toURI(src)), new Position(1, 13))).get(), ":2:21-2:31", ":3:26-3:35", ":4:13-4:22"); @@ -1299,7 +1300,8 @@ public void logMessage(MessageParams arg0) { serverLauncher.startListening(); LanguageServer server = serverLauncher.getRemoteProxy(); InitializeResult result = server.initialize(new InitializeParams()).get(); - assertTrue(result.getCapabilities().getHoverProvider()); + assertTrue(result.getCapabilities().getHoverProvider().isLeft()); + assertTrue(result.getCapabilities().getHoverProvider().getLeft()); server.getTextDocumentService().didOpen(new DidOpenTextDocumentParams(new TextDocumentItem(toURI(src), "java", 0, code))); Hover hover = server.getTextDocumentService().hover(new HoverParams(new TextDocumentIdentifier(toURI(src)), new Position(5, 10))).get(); assertNotNull(hover); @@ -5698,12 +5700,13 @@ class LC extends LspClient { @Override public void notifyProgress(ProgressParams params) { + //XXX: hardcoded getLeft() assertEquals(token, params.getToken().getLeft()); - if (params.getValue() instanceof WorkDoneProgressReport) { - WorkDoneProgressReport rep = (WorkDoneProgressReport)params.getValue(); + if (params.getValue().getLeft() instanceof WorkDoneProgressReport) { + WorkDoneProgressReport rep = (WorkDoneProgressReport)params.getValue().getLeft(); perCent = Math.max(perCent, rep.getPercentage()); } - if (params.getValue().getKind() == WorkDoneProgressKind.end) { + if (params.getValue().getLeft().getKind() == WorkDoneProgressKind.end) { progressEnd.countDown(); } } diff --git a/java/java.lsp.server/vscode/package-lock.json b/java/java.lsp.server/vscode/package-lock.json index e3dab902056a..e0a778f5a907 100644 --- a/java/java.lsp.server/vscode/package-lock.json +++ b/java/java.lsp.server/vscode/package-lock.json @@ -1,8 +1,1166 @@ { "name": "apache-netbeans-java", "version": "0.1.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "apache-netbeans-java", + "version": "0.1.0", + "license": "Apache 2.0", + "dependencies": { + "jsonc-parser": "3.0.0", + "vscode-debugadapter": "1.42.1", + "vscode-languageclient": "7.0.0" + }, + "devDependencies": { + "@types/glob": "^7.1.1", + "@types/mocha": "^9.0.0", + "@types/node": "^13.11.0", + "@types/ps-node": "^0.1.0", + "@types/vscode": "^1.60.0", + "glob": "^7.1.6", + "mocha": "^9.1.2", + "ps-node": "^0.1.6", + "typescript": "^3.8.3", + "vscode-test": "^1.3.0" + }, + "engines": { + "vscode": "^1.60.0" + } + }, + "node_modules/@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.0.0.tgz", + "integrity": "sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "13.13.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.15.tgz", + "integrity": "sha512-kwbcs0jySLxzLsa2nWUAGOd/s21WU1jebrEdtzhsj1D4Yps1EOuyI1Qcu+FD56dL7NRNIJtDDjcqIG22NwkgLw==", + "dev": true + }, + "node_modules/@types/ps-node": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@types/ps-node/-/ps-node-0.1.0.tgz", + "integrity": "sha512-HI5l+f38o93x81mbOWZ1IEzj87rGCHfN4A4QyCU1MuViT5Slvlo5F+YVvmBFHfZsEGi0Lo8TghWU2Ew6vBILNA==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.60.0.tgz", + "integrity": "sha512-wZt3VTmzYrgZ0l/3QmEbCq4KAJ71K3/hmMQ/nfpv84oH8e81KKwPEoQ5v8dNCxfHFVJ1JabHKmCvqdYOoVm1Ow==", + "dev": true + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, + "node_modules/agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "dependencies": { + "es6-promisify": "^5.0.0" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/connected-domain": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/connected-domain/-/connected-domain-1.0.0.tgz", + "integrity": "sha1-v+dyOMdL5FOnnwy2BY3utPI1jpM=", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "node_modules/es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "dependencies": { + "agent-base": "4", + "debug": "3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/http-proxy-agent/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "dependencies": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mocha": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", + "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.2", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.25", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", + "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ps-node": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/ps-node/-/ps-node-0.1.6.tgz", + "integrity": "sha1-mvZ6mdex0BMuUaUDCZ04qNKs4sM=", + "dev": true, + "dependencies": { + "table-parser": "^0.1.3" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/table-parser": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/table-parser/-/table-parser-0.1.3.tgz", + "integrity": "sha1-BEHPzhallIFoTCfRtaZ/8VpDx7A=", + "dev": true, + "dependencies": { + "connected-domain": "^1.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/vscode-debugadapter": { + "version": "1.42.1", + "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.42.1.tgz", + "integrity": "sha512-bICDB8mxReU2kGL13ftjNqeInYtVN3zpRdZKjRZHCpXC/mofrdaj9KRlJsALwcUNivMA9S/LwTZ2n+ros3X0jg==", + "dependencies": { + "mkdirp": "^0.5.5", + "vscode-debugprotocol": "1.42.0" + } + }, + "node_modules/vscode-debugprotocol": { + "version": "1.42.0", + "resolved": "https://registry.npmjs.org/vscode-debugprotocol/-/vscode-debugprotocol-1.42.0.tgz", + "integrity": "sha512-nVsfVCat9FZlOso5SYB1LQQiFGifTyOALpkpJdudDlRXGTpI3mSFiDYXWaoFm7UcfqTOzn1SC7Hqw4d89btT0w==" + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "node_modules/vscode-test": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.0.tgz", + "integrity": "sha512-Jt7HNGvSE0+++Tvtq5wc4hiXLIr2OjDShz/gbAfM/mahQpy4rKBnmOK33D+MR67ATWviQhl+vpmU3p/qwSH/Pg==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.4", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=8.9.3" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, "dependencies": { "@types/glob": { "version": "7.1.3", @@ -110,7 +1268,7 @@ "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -128,7 +1286,7 @@ "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "camelcase": { @@ -205,15 +1363,6 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, "connected-domain": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/connected-domain/-/connected-domain-1.0.0.tgz", @@ -344,7 +1493,7 @@ "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "has-flag": { @@ -367,6 +1516,23 @@ "requires": { "agent-base": "4", "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "https-proxy-agent": { @@ -377,6 +1543,17 @@ "requires": { "agent-base": "^4.3.0", "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "inflight": { @@ -392,7 +1569,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "is-binary-path": { @@ -493,7 +1670,7 @@ "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } @@ -566,9 +1743,9 @@ } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "nanoid": { @@ -662,9 +1839,9 @@ "dev": true }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { "glob": "^7.1.3" @@ -677,9 +1854,9 @@ "dev": true }, "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } @@ -796,9 +1973,9 @@ "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" }, "vscode-test": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.1.tgz", - "integrity": "sha512-Ls7+JyC06cUCuomlTYk4aNJI00Rri09hgtkNl3zfQ1bj6meXglpSPpuzJ/RPNetlUHFMm4eGs0Xr/H5pFPVwfQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.0.tgz", + "integrity": "sha512-Jt7HNGvSE0+++Tvtq5wc4hiXLIr2OjDShz/gbAfM/mahQpy4rKBnmOK33D+MR67ATWviQhl+vpmU3p/qwSH/Pg==", "dev": true, "requires": { "http-proxy-agent": "^2.1.0", diff --git a/java/java.lsp.server/vscode/package.json b/java/java.lsp.server/vscode/package.json index f3fc6906493e..922b68e14015 100644 --- a/java/java.lsp.server/vscode/package.json +++ b/java/java.lsp.server/vscode/package.json @@ -421,10 +421,11 @@ "mocha": "^9.1.2", "ps-node": "^0.1.6", "typescript": "^3.8.3", - "vscode-test": "^1.4.1" + "vscode-test": "^1.3.0" }, "dependencies": { "jsonc-parser": "3.0.0", "vscode-debugadapter": "1.42.1", - "vscode-languageclient": "6.1.3" + "vscode-languageclient": "7.0.0" + } } diff --git a/java/java.lsp.server/vscode/src/extension.ts b/java/java.lsp.server/vscode/src/extension.ts index cb23947cd9a3..da5a888b3c26 100644 --- a/java/java.lsp.server/vscode/src/extension.ts +++ b/java/java.lsp.server/vscode/src/extension.ts @@ -30,10 +30,9 @@ import { RevealOutputChannelOn, DocumentSelector } from 'vscode-languageclient'; - import { LanguageClient, - StreamInfo, + StreamInfo } from 'vscode-languageclient/node'; import * as net from 'net'; diff --git a/java/java.lsp.server/vscode/src/protocol.ts b/java/java.lsp.server/vscode/src/protocol.ts index 45ae655aa6f8..f5bbed8f09e9 100644 --- a/java/java.lsp.server/vscode/src/protocol.ts +++ b/java/java.lsp.server/vscode/src/protocol.ts @@ -56,7 +56,7 @@ export interface ShowQuickPickParams { } export namespace QuickPickRequest { - export const type = new RequestType('window/showQuickPick'); + export const type = new RequestType('window/showQuickPick'); } export interface ShowInputBoxParams { @@ -97,7 +97,7 @@ export interface TestCase { } export namespace TestProgressNotification { - export const type = new NotificationType('window/notifyTestProgress'); + export const type = new NotificationType('window/notifyTestProgress'); }; export interface DebugConnector { @@ -116,15 +116,15 @@ export interface SetTextEditorDecorationParams { }; export namespace TextEditorDecorationCreateRequest { - export const type = new RequestType('window/createTextEditorDecoration'); + export const type = new RequestType('window/createTextEditorDecoration'); }; export namespace TextEditorDecorationSetNotification { - export const type = new NotificationType('window/setTextEditorDecoration'); + export const type = new NotificationType('window/setTextEditorDecoration'); }; export namespace TextEditorDecorationDisposeNotification { - export const type = new NotificationType('window/disposeTextEditorDecoration'); + export const type = new NotificationType('window/disposeTextEditorDecoration'); }; export function asPosition(value: undefined | null): undefined; diff --git a/java/java.lsp.server/vscode/src/testAdapter.ts b/java/java.lsp.server/vscode/src/testAdapter.ts index 87962188e4ca..38797db7f402 100644 --- a/java/java.lsp.server/vscode/src/testAdapter.ts +++ b/java/java.lsp.server/vscode/src/testAdapter.ts @@ -21,7 +21,7 @@ import { commands, debug, tests, workspace, CancellationToken, TestController, TestItem, TestRunProfileKind, TestRunRequest, Uri, TestRun, TestMessage, Location, Position } from "vscode"; import * as path from 'path'; import { asRange, TestCase, TestSuite } from "./protocol"; -import { LanguageClient } from "vscode-languageclient"; +import { LanguageClient } from "vscode-languageclient/node"; export class NbTestAdapter { From 9a0f7019aa61432ca452ce60d802262a98b145f1 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Sun, 17 Oct 2021 19:31:23 +0200 Subject: [PATCH 7/9] Upgradig LSP4J in lsp.client. --- ide/lsp.client/external/binaries-list | 6 +++--- .../{lsp4j-0.10.0-license.txt => lsp4j-0.12.0-license.txt} | 4 ++-- .../antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps | 6 +++--- 3 files changed, 8 insertions(+), 8 deletions(-) rename ide/lsp.client/external/{lsp4j-0.10.0-license.txt => lsp4j-0.12.0-license.txt} (99%) diff --git a/ide/lsp.client/external/binaries-list b/ide/lsp.client/external/binaries-list index 8bdfe7308759..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. -271665493A1E35FB4C2D1DBABF19363C8AD27819 org.eclipse.lsp4j:org.eclipse.lsp4j:0.10.0 -ED2D6D876578B139AEA24289422435148FEF6B45 org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.10.0 -42CA44A49315A490804A3DED67163123748C1F19 org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.10.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.10.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.10.0-license.txt rename to ide/lsp.client/external/lsp4j-0.12.0-license.txt index 41c05be3d7a8..7151ac57688c 100644 --- a/ide/lsp.client/external/lsp4j-0.10.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.10.0 +Version: 0.12.0 License: EPL-v20 URL: http://www.eclipse.org/ Description: Eclipse Language Server Protocol Library -Files: org.eclipse.lsp4j-0.10.0.jar org.eclipse.lsp4j.generator-0.10.0.jar org.eclipse.lsp4j.jsonrpc-0.10.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/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps index 7bb2ba19ce40..5bfc43ea6570 100644 --- a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps +++ b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps @@ -91,9 +91,9 @@ enterprise/javaee7.api/external/jaxws-api-2.2.8.jar java/websvc.jaxws21api/exter enterprise/javaee7.api/external/jsr181-api-1.0-MR1.jar java/websvc.jaxws21api/external/jaxws-2.2.6-api.zip # ide/lsp.client and java/java.lsp.server both use LSP libraries, but are independent: -ide/lsp.client/external/org.eclipse.lsp4j-0.10.0.jar java/java.lsp.server/external/org.eclipse.lsp4j-0.10.0.jar -ide/lsp.client/external/org.eclipse.lsp4j.generator-0.10.0.jar java/java.lsp.server/external/org.eclipse.lsp4j.generator-0.10.0.jar -ide/lsp.client/external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar java/java.lsp.server/external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar +ide/lsp.client/external/org.eclipse.lsp4j-0.12.0.jar java/java.lsp.server/external/org.eclipse.lsp4j-0.12.0.jar +ide/lsp.client/external/org.eclipse.lsp4j.generator-0.12.0.jar java/java.lsp.server/external/org.eclipse.lsp4j.generator-0.12.0.jar +ide/lsp.client/external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar java/java.lsp.server/external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar ide/lsp.client/external/org.eclipse.xtend.lib-2.19.0.jar java/java.lsp.server/external/org.eclipse.xtend.lib-2.19.0.jar ide/lsp.client/external/org.eclipse.xtend.lib.macro-2.19.0.jar java/java.lsp.server/external/org.eclipse.xtend.lib.macro-2.19.0.jar ide/lsp.client/external/org.eclipse.xtext.xbase.lib-2.19.0.jar java/java.lsp.server/external/org.eclipse.xtext.xbase.lib-2.19.0.jar From 63235ab9dc2b1cd485ad2912ce05fe2f2224ded4 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Mon, 18 Oct 2021 22:47:02 +0200 Subject: [PATCH 8/9] Really updating the LSP4j version for the client. --- ide/lsp.client/nbproject/project.properties | 6 +++--- ide/lsp.client/nbproject/project.xml | 12 ++++++------ .../netbeans/modules/lsp/client/LSPBindings.java | 1 + .../src/org/netbeans/modules/lsp/client/Utils.java | 4 ++++ .../lsp/client/bindings/BreadcrumbsImpl.java | 2 +- .../client/bindings/CompletionProviderImpl.java | 8 +++++++- .../modules/lsp/client/bindings/Formatter.java | 8 ++++---- .../lsp/client/bindings/LanguageClientImpl.java | 14 ++++++++++---- .../lsp/client/bindings/MarkOccurrences.java | 3 +-- .../refactoring/RefactoringActionsProvider.java | 3 +-- 10 files changed, 38 insertions(+), 23 deletions(-) diff --git a/ide/lsp.client/nbproject/project.properties b/ide/lsp.client/nbproject/project.properties index 9b45a1fbdb70..73d43d0722de 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.10.0.jar=modules/ext/org.eclipse.lsp4j-0.10.0.jar -release.external/org.eclipse.lsp4j.generator-0.10.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.10.0.jar -release.external/org.eclipse.lsp4j.jsonrpc-0.10.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.10.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 fc49e5545fc6..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.10.0.jar - external/org.eclipse.lsp4j-0.10.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.10.0.jar - external/org.eclipse.lsp4j.generator-0.10.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.10.0.jar - external/org.eclipse.lsp4j.jsonrpc-0.10.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 75acd5e20542..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 @@ -50,6 +50,7 @@ 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; 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 d8f36fb24e21..0d5dd837b8d2 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 @@ -291,4 +291,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 a672ecdee907..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 @@ -63,6 +63,7 @@ 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; @@ -117,10 +118,15 @@ public CompletableFuture createProgress(WorkDoneProgressCreateParams param private final Map key2Progress = new HashMap<>(); public void notifyProgress(ProgressParams params) { + Either value = params.getValue(); + if (value.isRight()) { + return ; + } + WorkDoneProgressNotification n = value.getLeft(); SwingUtilities.invokeLater(() -> { - switch (params.getValue().getKind()) { + switch (n.getKind()) { case begin: { - WorkDoneProgressBegin progress = (WorkDoneProgressBegin) params.getValue(); + WorkDoneProgressBegin progress = (WorkDoneProgressBegin) n; ProgressHandle handle = ProgressHandle.createHandle(progress.getTitle()); key2Progress.put(params.getToken().get(), handle); handle.start(); @@ -128,7 +134,7 @@ public void notifyProgress(ProgressParams params) { break; } case report: { - WorkDoneProgressReport progress = (WorkDoneProgressReport) params.getValue(); + WorkDoneProgressReport progress = (WorkDoneProgressReport) n; ProgressHandle handle = key2Progress.get(params.getToken().get()); if (progress.getPercentage() != null) { handle.switchToDeterminate(100); @@ -142,7 +148,7 @@ public void notifyProgress(ProgressParams params) { break; } case end: { - WorkDoneProgressEnd progress = (WorkDoneProgressEnd) params.getValue(); + WorkDoneProgressEnd progress = (WorkDoneProgressEnd) n; ProgressHandle handle = key2Progress.get(params.getToken().get()); handle.finish(); break; diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java index 751b9325a7ef..ec628363fcdb 100644 --- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java +++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/MarkOccurrences.java @@ -93,8 +93,7 @@ private OffsetsBag computeHighlights(Document doc, int caretPos) { if (server == null) { return result; } - Boolean hasDocumentHighlight = server.getInitResult().getCapabilities().getDocumentHighlightProvider(); - if (hasDocumentHighlight == null || !hasDocumentHighlight) { + if (!Utils.isEnabled(server.getInitResult().getCapabilities().getDocumentHighlightProvider())) { return result; } String uri = Utils.toURI(file); diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java index 5eff44bf9303..cf5d4551b187 100644 --- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java +++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/refactoring/RefactoringActionsProvider.java @@ -161,8 +161,7 @@ public boolean canFindUsages(Lookup lookup) { if (bindings == null) { return false; } - Boolean hasReferences = bindings.getInitResult().getCapabilities().getReferencesProvider(); - return Utils.isTrue(hasReferences); + return Utils.isEnabled(bindings.getInitResult().getCapabilities().getReferencesProvider()); } @Override From e99961644ce38a0a971fe67df6f3c987553e0a45 Mon Sep 17 00:00:00 2001 From: Jan Lahoda Date: Thu, 13 Jan 2022 20:50:25 +0100 Subject: [PATCH 9/9] Cleanup. --- .../org/netbeans/modules/java/lsp/server/protocol/Server.java | 1 - 1 file changed, 1 deletion(-) diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java index 14698bdbba77..fbf379f3c02a 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/Server.java @@ -152,7 +152,6 @@ public static NbLspServer launchServer(Pair io, LspSe private static Launcher createLauncher(LanguageServerImpl server, Pair io, Function processor) { return new LSPLauncher.Builder() - .configureGson(gb -> gb.registerTypeAdapter(SemanticTokensCapabilities.class, (InstanceCreator) type -> new SemanticTokensCapabilities(false))) .setLocalService(server) .setRemoteInterface(NbCodeLanguageClient.class) .setInput(io.first())