This is an automated email from the ASF dual-hosted git repository.
jlahoda pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/netbeans.git
The following commit(s) were added to refs/heads/master by this push:
new d2ae8ba Semantic highlight support for both the LSP client and Java
LSP server.
d2ae8ba is described below
commit d2ae8ba167c659458deca4a8cea3177af8450947
Author: Jan Lahoda <[email protected]>
AuthorDate: Fri Jan 14 07:22:39 2022 +0100
Semantic highlight support for both the LSP client and Java LSP server.
---
ide/lsp.client/external/binaries-list | 6 +-
...-0.9.0-license.txt => lsp4j-0.12.0-license.txt} | 4 +-
ide/lsp.client/nbproject/project.properties | 6 +-
ide/lsp.client/nbproject/project.xml | 12 +-
.../netbeans/modules/lsp/client/LSPBindings.java | 23 +-
.../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 | 57 +
.../lsp/client/bindings/MarkOccurrences.java | 3 +-
.../lsp/client/bindings/SemanticHighlight.java | 207 ++++
.../TextDocumentSyncServerCapabilityHandler.java | 5 +
.../refactoring/RefactoringActionsProvider.java | 3 +-
.../textmate/lexer/resources/fontsColors.xml | 36 +
.../modules/java/lsp/server/protocol/Server.java | 23 +-
.../server/protocol/TextDocumentServiceImpl.java | 150 +++
.../java/lsp/server/protocol/ServerTest.java | 95 ++
java/java.lsp.server/vscode/package-lock.json | 1160 +++++++++++++++++++-
.../org/netbeans/nbbuild/extlibs/ignored-overlaps | 6 +-
20 files changed, 1785 insertions(+), 33 deletions(-)
diff --git a/ide/lsp.client/external/binaries-list
b/ide/lsp.client/external/binaries-list
index a8dc71e..c89b3b0 100644
--- a/ide/lsp.client/external/binaries-list
+++ b/ide/lsp.client/external/binaries-list
@@ -15,9 +15,9 @@
# specific language governing permissions and limitations
# under the License.
-4FF29B93C50F6768C9A73040AE818E96EB2E68DB
org.eclipse.lsp4j:org.eclipse.lsp4j:0.9.0
-DA453B2A6C9BBD9369DE41365C59E88574EC1F0B
org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.9.0
-1CF7FCE1E2F4DFA76C3B91E4C2D72EA0C6899945
org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.9.0
+419B5181A4B2D054BF8FF764FCEB67DF09D87E7D
org.eclipse.lsp4j:org.eclipse.lsp4j:0.12.0
+80607078CEB77F92C6BFEC3CDEC050D3222EFDFF
org.eclipse.lsp4j:org.eclipse.lsp4j.generator:0.12.0
+8A80D1368F19A2F6E328E41B9BC68E53C628C68B
org.eclipse.lsp4j:org.eclipse.lsp4j.jsonrpc:0.12.0
751B324BED8C077BF6B7B8C2055595EB8C28509D
org.eclipse.xtend:org.eclipse.xtend.lib:2.19.0
F3626A047A3ABFA47CF62D76BDEF1D246F7985F6
org.eclipse.xtend:org.eclipse.xtend.lib.macro:2.19.0
997BA9935D0069B3F1CD2F93B56B91D24E9C60A0
org.eclipse.xtext:org.eclipse.xtext.xbase.lib:2.19.0
diff --git a/ide/lsp.client/external/lsp4j-0.9.0-license.txt
b/ide/lsp.client/external/lsp4j-0.12.0-license.txt
similarity index 99%
rename from ide/lsp.client/external/lsp4j-0.9.0-license.txt
rename to ide/lsp.client/external/lsp4j-0.12.0-license.txt
index 208dfb7..7151ac5 100644
--- a/ide/lsp.client/external/lsp4j-0.9.0-license.txt
+++ b/ide/lsp.client/external/lsp4j-0.12.0-license.txt
@@ -1,10 +1,10 @@
Name: Eclipse Language Server Protocol Library
Origin: Eclipse
-Version: 0.9.0
+Version: 0.12.0
License: EPL-v20
URL: http://www.eclipse.org/
Description: Eclipse Language Server Protocol Library
-Files: org.eclipse.lsp4j-0.9.0.jar org.eclipse.lsp4j.generator-0.9.0.jar
org.eclipse.lsp4j.jsonrpc-0.9.0.jar
+Files: org.eclipse.lsp4j-0.12.0.jar org.eclipse.lsp4j.generator-0.12.0.jar
org.eclipse.lsp4j.jsonrpc-0.12.0.jar
Eclipse Public License - v 2.0
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
LICENSE (“AGREEMENT”). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
diff --git a/ide/lsp.client/nbproject/project.properties
b/ide/lsp.client/nbproject/project.properties
index f6a201b..f2bd513 100644
--- a/ide/lsp.client/nbproject/project.properties
+++ b/ide/lsp.client/nbproject/project.properties
@@ -18,9 +18,9 @@
javac.source=1.8
javac.compilerargs=-Xlint -Xlint:-serial
javadoc.arch=${basedir}/arch.xml
-release.external/org.eclipse.lsp4j-0.9.0.jar=modules/ext/org.eclipse.lsp4j-0.9.0.jar
-release.external/org.eclipse.lsp4j.generator-0.9.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.9.0.jar
-release.external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.9.0.jar
+release.external/org.eclipse.lsp4j-0.12.0.jar=modules/ext/org.eclipse.lsp4j-0.12.0.jar
+release.external/org.eclipse.lsp4j.generator-0.12.0.jar=modules/ext/org.eclipse.lsp4j.generator-0.12.0.jar
+release.external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar=modules/ext/org.eclipse.lsp4j.jsonrpc-0.12.0.jar
release.external/org.eclipse.xtend.lib-2.19.0.jar=modules/ext/org.eclipse.xtend.lib-2.19.0.jar
release.external/org.eclipse.xtend.lib.macro-2.19.0.jar=modules/ext/org.eclipse.xtend.lib.macro-2.19.0.jar
release.external/org.eclipse.xtext.xbase.lib-2.19.0.jar=modules/ext/org.eclipse.xtext.xbase.lib-2.19.0.jar
diff --git a/ide/lsp.client/nbproject/project.xml
b/ide/lsp.client/nbproject/project.xml
index 031be98..ffd8417 100644
--- a/ide/lsp.client/nbproject/project.xml
+++ b/ide/lsp.client/nbproject/project.xml
@@ -414,16 +414,16 @@
<package>org.netbeans.modules.lsp.client.spi</package>
</public-packages>
<class-path-extension>
-
<runtime-relative-path>ext/org.eclipse.lsp4j-0.9.0.jar</runtime-relative-path>
-
<binary-origin>external/org.eclipse.lsp4j-0.9.0.jar</binary-origin>
+
<runtime-relative-path>ext/org.eclipse.lsp4j-0.12.0.jar</runtime-relative-path>
+
<binary-origin>external/org.eclipse.lsp4j-0.12.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/org.eclipse.xtend.lib.macro-2.19.0.jar</runtime-relative-path>
<binary-origin>external/org.eclipse.xtend.lib.macro-2.19.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
-
<runtime-relative-path>ext/org.eclipse.lsp4j.generator-0.9.0.jar</runtime-relative-path>
-
<binary-origin>external/org.eclipse.lsp4j.generator-0.9.0.jar</binary-origin>
+
<runtime-relative-path>ext/org.eclipse.lsp4j.generator-0.12.0.jar</runtime-relative-path>
+
<binary-origin>external/org.eclipse.lsp4j.generator-0.12.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
<runtime-relative-path>ext/org.eclipse.xtend.lib-2.19.0.jar</runtime-relative-path>
@@ -434,8 +434,8 @@
<binary-origin>external/org.eclipse.xtext.xbase.lib-2.19.0.jar</binary-origin>
</class-path-extension>
<class-path-extension>
-
<runtime-relative-path>ext/org.eclipse.lsp4j.jsonrpc-0.9.0.jar</runtime-relative-path>
-
<binary-origin>external/org.eclipse.lsp4j.jsonrpc-0.9.0.jar</binary-origin>
+
<runtime-relative-path>ext/org.eclipse.lsp4j.jsonrpc-0.12.0.jar</runtime-relative-path>
+
<binary-origin>external/org.eclipse.lsp4j.jsonrpc-0.12.0.jar</binary-origin>
</class-path-extension>
</data>
</configuration>
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 88f8500..4b196db 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/LSPBindings.java
@@ -18,6 +18,7 @@
*/
package org.netbeans.modules.lsp.client;
+import com.google.gson.InstanceCreator;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
@@ -25,6 +26,7 @@ import java.io.OutputStream;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
+import java.lang.reflect.Type;
import java.net.InetAddress;
import java.net.Socket;
import java.net.URI;
@@ -48,10 +50,13 @@ import java.util.logging.Logger;
import java.util.stream.Collectors;
import javax.swing.event.ChangeListener;
import org.eclipse.lsp4j.ClientCapabilities;
+import org.eclipse.lsp4j.CompletionCapabilities;
import org.eclipse.lsp4j.DocumentSymbolCapabilities;
import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
import org.eclipse.lsp4j.ResourceOperationKind;
+import org.eclipse.lsp4j.SemanticTokens;
+import org.eclipse.lsp4j.SemanticTokensLegend;
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.SymbolCapabilities;
import org.eclipse.lsp4j.SymbolKind;
@@ -268,7 +273,23 @@ public class LSPBindings {
InputStream in =
LanguageServerProviderAccessor.getINSTANCE().getInputStream(desc);
OutputStream out =
LanguageServerProviderAccessor.getINSTANCE().getOutputStream(desc);
Process p =
LanguageServerProviderAccessor.getINSTANCE().getProcess(desc);
- Launcher<LanguageServer> launcher =
LSPLauncher.createClientLauncher(lci, in, out);
+ Launcher<LanguageServer> launcher = new
LSPLauncher.Builder<LanguageServer>()
+
.setLocalService(lci)
+
.setRemoteInterface(LanguageServer.class)
+
.setInput(in)
+
.setOutput(out)
+
.configureGson(gson -> {
+ gson.registerTypeAdapter(SemanticTokensLegend.class,
new InstanceCreator<SemanticTokensLegend>() {
+ @Override public SemanticTokensLegend
createInstance(Type type) {
+ return new
SemanticTokensLegend(Collections.emptyList(), Collections.emptyList());
+ }
+ });
+ gson.registerTypeAdapter(SemanticTokens.class, new
InstanceCreator<SemanticTokens>() {
+ @Override public SemanticTokens createInstance(Type
type) {
+ return new
SemanticTokens(Collections.emptyList());
+ }
+ });
+ }).create();
launcher.startListening();
LanguageServer server = launcher.getRemoteProxy();
InitializeResult result = initServer(p, server, dir);
//XXX: what if a different root is expected????
diff --git a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
index 746eff4..9301f0a 100644
--- a/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
+++ b/ide/lsp.client/src/org/netbeans/modules/lsp/client/Utils.java
@@ -301,4 +301,8 @@ public class Utils {
public static boolean isTrue(Boolean b) {
return b != null && b;
}
+ public static boolean isEnabled(Either<Boolean, ?> 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 8e6cf96..90f8453 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 @@ public class BreadcrumbsImpl implements BackgroundTask {
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 92fcd22..0fba1fc 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 class CompletionProviderImpl implements
CompletionProvider {
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 045e490..f56b085 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 class Formatter implements ReformatTask {
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 f655fa0..0fada4a 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.net.URISyntaxException;
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.concurrent.ExecutionException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
+import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.StyledDocument;
@@ -52,14 +54,21 @@ import org.eclipse.lsp4j.DiagnosticSeverity;
import org.eclipse.lsp4j.ExecuteCommandParams;
import org.eclipse.lsp4j.MessageActionItem;
import org.eclipse.lsp4j.MessageParams;
+import org.eclipse.lsp4j.ProgressParams;
import org.eclipse.lsp4j.PublishDiagnosticsParams;
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.ShowMessageRequestParams;
import org.eclipse.lsp4j.TextDocumentIdentifier;
import org.eclipse.lsp4j.TextEdit;
+import org.eclipse.lsp4j.WorkDoneProgressBegin;
+import org.eclipse.lsp4j.WorkDoneProgressCreateParams;
+import org.eclipse.lsp4j.WorkDoneProgressEnd;
+import org.eclipse.lsp4j.WorkDoneProgressNotification;
+import org.eclipse.lsp4j.WorkDoneProgressReport;
import org.eclipse.lsp4j.WorkspaceEdit;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.eclipse.lsp4j.services.LanguageClient;
+import org.netbeans.api.progress.*;
import org.netbeans.modules.lsp.client.LSPBindings;
import org.netbeans.modules.lsp.client.Utils;
import org.netbeans.spi.editor.hints.ChangeInfo;
@@ -74,6 +83,7 @@ import org.openide.filesystems.FileObject;
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;
/**
@@ -101,6 +111,53 @@ public class LanguageClientImpl implements LanguageClient {
}
@Override
+ public CompletableFuture<Void> createProgress(WorkDoneProgressCreateParams
params) {
+ return CompletableFuture.completedFuture(null);
+ }
+
+ private final Map<Object, ProgressHandle> key2Progress = new HashMap<>();
+
+ public void notifyProgress(ProgressParams params) {
+ Either<WorkDoneProgressNotification, Object> value = params.getValue();
+ if (value.isRight()) {
+ return ;
+ }
+ WorkDoneProgressNotification n = value.getLeft();
+ SwingUtilities.invokeLater(() -> {
+ switch (n.getKind()) {
+ case begin: {
+ WorkDoneProgressBegin progress = (WorkDoneProgressBegin) n;
+ ProgressHandle handle =
ProgressHandle.createHandle(progress.getTitle());
+ key2Progress.put(params.getToken().get(), handle);
+ handle.start();
+ handle.progress(progress.getMessage());
+ break;
+ }
+ case report: {
+ WorkDoneProgressReport progress = (WorkDoneProgressReport)
n;
+ 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) n;
+ ProgressHandle handle =
key2Progress.get(params.getToken().get());
+ handle.finish();
+ break;
+ }
+ }
+ });
+ }
+
+ @Override
public void publishDiagnostics(PublishDiagnosticsParams pdp) {
try {
FileObject file = URLMapper.findFileObject(new
URI(pdp.getUri()).toURL());
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 751b932..ec62836 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 @@ public class MarkOccurrences implements BackgroundTask,
CaretListener, PropertyC
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/SemanticHighlight.java
b/ide/lsp.client/src/org/netbeans/modules/lsp/client/bindings/SemanticHighlight.java
new file mode 100644
index 0000000..e40323a
--- /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<Integer> 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<Integer, Map<Integer, AttributeSet>> 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<String> 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<Number> data;
+//
+// public List<Number> getData() {
+// return data;
+// }
+//
+// public void setData(List<Number> data) {
+// this.data = data;
+// }
+//
+// }
+// public interface SemanticService {
+// @JsonRequest("textDocument/semanticTokens/full")
+// public CompletableFuture<SemanticTokens>
semanticTokensFull(SemanticTokensParams params);
+// }
+}
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 e7936bd..2659afd 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 @@ public class TextDocumentSyncServerCapabilityHandler {
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/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 5eff44b..cf5d455 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 class RefactoringActionsProvider extends
ActionsImplementationProvider{
if (bindings == null) {
return false;
}
- Boolean hasReferences =
bindings.getInitResult().getCapabilities().getReferencesProvider();
- return Utils.isTrue(hasReferences);
+ return
Utils.isEnabled(bindings.getInitResult().getCapabilities().getReferencesProvider());
}
@Override
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 be6e632..27acc9b 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 @@
<fontcolor name="support.constant" default="keyword" />
<fontcolor name="variable.language" default="keyword" />
+ <fontcolor name="mod-namespace" default="identifier" />
+ <fontcolor name="mod-package" default="identifier" />
+ <fontcolor name="mod-function" default="method" />
+ <fontcolor name="mod-method" default="method" />
+ <fontcolor name="mod-macro" default="mod-function" />
+ <fontcolor name="mod-parameter" default="parameter"/>
+ <fontcolor name="mod-variable" default="identifier"/>
+ <fontcolor name="mod-struct" default="identifier"/>
+ <fontcolor name="mod-enum" default="identifier"/>
+ <fontcolor name="mod-class" default="identifier"/>
+ <fontcolor name="mod-typeAlias" default="identifier"/>
+ <fontcolor name="mod-typeParameter" default="identifier"/>
+ <fontcolor name="mod-field" default="field"/>
+ <fontcolor name="mod-enumMember" default="field"/>
+
+ <fontcolor name="mod-namespace-declaration" default="identifier"/>
+ <fontcolor name="mod-package-declaration" default="identifier"/>
+ <fontcolor name="mod-function-declaration" default="method"/>
+ <fontcolor name="mod-method-declaration" default="method"/>
+ <fontcolor name="mod-macro-declaration" default="mod-function"/>
+ <fontcolor name="mod-parameter-declaration" default="parameter"/>
+ <fontcolor name="mod-variable-declaration" default="identifier"/>
+ <fontcolor name="mod-struct-declaration" default="identifier"/>
+ <fontcolor name="mod-enum-declaration" default="identifier"/>
+ <fontcolor name="mod-class-declaration" default="identifier"/>
+ <fontcolor name="mod-typeAlias-declaration" default="identifier"/>
+ <fontcolor name="mod-typeParameter-declaration" default="identifier"/>
+ <fontcolor name="mod-field-declaration" default="field"/>
+ <fontcolor name="mod-enumMember-declaration" default="field"/>
+
+ <fontcolor name="mod-static" >
+ <font style="italic" />
+ </fontcolor>
+
+ <fontcolor name="mod-deprecated" strikeThrough="black"/>
+
</fontscolors>
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 b6c1e05..fbf379f 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;
@@ -60,8 +62,10 @@ 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.TextDocumentSyncOptions;
import org.eclipse.lsp4j.WorkDoneProgressCancelParams;
@@ -148,13 +152,23 @@ public final class Server {
private static Launcher<NbCodeLanguageClient>
createLauncher(LanguageServerImpl server, Pair<InputStream, OutputStream> io,
Function<MessageConsumer, MessageConsumer> processor) {
return new LSPLauncher.Builder<NbCodeLanguageClient>()
- .configureGson(gb ->
gb.registerTypeAdapter(SemanticTokensCapabilities.class,
(InstanceCreator<SemanticTokensCapabilities>) type -> new
SemanticTokensCapabilities(false)))
.setLocalService(server)
.setRemoteInterface(NbCodeLanguageClient.class)
.setInput(io.first())
.setOutput(io.second())
.wrapMessages(processor)
-// .traceMessages(new java.io.PrintWriter(System.err))
+ .configureGson(gb -> {
+ gb.registerTypeAdapter(SemanticTokensCapabilities.class, new
InstanceCreator<SemanticTokensCapabilities>() {
+ @Override public SemanticTokensCapabilities
createInstance(Type type) {
+ return new SemanticTokensCapabilities(null);
+ }
+ });
+ gb.registerTypeAdapter(SemanticTokensParams.class, new
InstanceCreator<SemanticTokensParams>() {
+ @Override public SemanticTokensParams createInstance(Type
type) {
+ return new SemanticTokensParams(new
TextDocumentIdentifier(""));
+ }
+ });
+ })
.create();
}
@@ -673,7 +687,7 @@ public final class Server {
}
}
- private InitializeResult constructInitResponse(JavaSource src) {
+ private InitializeResult constructInitResponse(InitializeParams init,
JavaSource src) {
ServerCapabilities capabilities = new ServerCapabilities();
if (src != null) {
TextDocumentSyncOptions textDocumentSyncOptions = new
TextDocumentSyncOptions();
@@ -725,6 +739,7 @@ public final class Server {
capabilities.setRenameProvider(renOpt);
FoldingRangeProviderOptions foldingOptions = new
FoldingRangeProviderOptions();
capabilities.setFoldingRangeProvider(foldingOptions);
+ textDocumentService.init(init.getCapabilities(), capabilities);
}
return new InitializeResult(capabilities);
}
@@ -769,7 +784,7 @@ public final class Server {
// but complete the InitializationRequest independently of the
project initialization.
return CompletableFuture.completedFuture(
finishInitialization(
- constructInitResponse(checkJavaSupport())
+ constructInitResponse(init, checkJavaSupport())
)
);
}
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 377c24c..8a52631 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
@@ -43,16 +43,22 @@ import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.EnumSet;
import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
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.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
@@ -76,6 +82,7 @@ import javax.swing.event.DocumentListener;
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;
@@ -125,6 +132,13 @@ import org.eclipse.lsp4j.ReferenceParams;
import org.eclipse.lsp4j.RenameFile;
import org.eclipse.lsp4j.RenameParams;
import org.eclipse.lsp4j.ResourceOperation;
+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;
@@ -159,6 +173,7 @@ import org.netbeans.api.java.source.TreePathHandle;
import org.netbeans.api.java.source.TreeUtilities;
import org.netbeans.api.java.source.WorkingCopy;
import org.netbeans.api.java.source.ui.ElementOpen;
+import org.netbeans.api.lexer.Token;
import org.netbeans.api.lexer.TokenSequence;
import org.netbeans.api.lsp.Completion;
import org.netbeans.api.lsp.HyperlinkLocation;
@@ -173,8 +188,11 @@ import org.netbeans.modules.editor.java.GoToSupport;
import org.netbeans.modules.editor.java.GoToSupport.GoToTarget;
import org.netbeans.modules.java.editor.base.fold.JavaElementFoldVisitor;
import
org.netbeans.modules.java.editor.base.fold.JavaElementFoldVisitor.FoldCreator;
+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.editor.overridden.ComputeOverriding;
import org.netbeans.modules.java.editor.overridden.ElementDescription;
@@ -415,6 +433,47 @@ public class TextDocumentServiceImpl implements
TextDocumentService, LanguageCli
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<String> knownTokenTypes = semanticTokens.getTokenTypes() !=
null ? new HashSet<>(semanticTokens.getTokenTypes()) : Collections.emptySet();
+ Map<String, Integer> tokenLegend = new LinkedHashMap<>();
+ for (Entry<ColoringAttributes, List<String>> 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<String> knownTokenModifiers =
semanticTokens.getTokenModifiers() != null ? new
HashSet<>(semanticTokens.getTokenModifiers()) : Collections.emptySet();
+ Map<String, Integer> modifiersLegend = new LinkedHashMap<>();
+ for (Entry<ColoringAttributes, List<String>> 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);
+ }
+ }
+
@Override
public CompletableFuture<CompletionItem>
resolveCompletionItem(CompletionItem ci) {
JsonObject rawData = (JsonObject) ci.getData();
@@ -1886,4 +1945,95 @@ public class TextDocumentServiceImpl implements
TextDocumentService, LanguageCli
* this hook, if defined, with the method name and parameter.
*/
static BiConsumer<String, Object> HOOK_NOTIFICATION = null;
+
+ private static final Map<ColoringAttributes, List<String>>
COLORING_TO_TOKEN_TYPE_CANDIDATES = new HashMap<ColoringAttributes,
List<String>>() {{
+ 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<ColoringAttributes, List<String>>
COLORING_TO_TOKEN_MODIFIERS_CANDIDATES = new HashMap<ColoringAttributes,
List<String>>() {{
+ 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<SemanticTokens>
semanticTokensFull(SemanticTokensParams params) {
+ JavaSource js = getJavaSource(params.getTextDocument().getUri());
+ List<Integer> result = new ArrayList<>();
+ if (js != null) {
+ 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<Pair<int[], ColoringAttributes.Coloring>> highlights, Map<int[],
String> preText) {
+ //...nothing
+ }
+
+ @Override
+ public void setColorings(Document doc,
Map<Token, ColoringAttributes.Coloring> colorings) {
+ int line = 0;
+ long column = 0;
+ int lastLine = 0;
+ long currentLineStart = 0;
+ long nextLineStart =
info.getCompilationUnit().getLineMap().getStartPosition(line + 2);
+ Map<Token, ColoringAttributes.Coloring>
ordered = new TreeMap<>((t1, t2) -> t1.offset(null) - t2.offset(null));
+ ordered.putAll(colorings);
+ for (Entry<Token,
ColoringAttributes.Coloring> 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<Integer> 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 da916c3..ad652e7 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
@@ -46,6 +46,7 @@ import java.util.List;
import java.util.Map;
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.Executors;
@@ -107,9 +108,14 @@ import org.eclipse.lsp4j.ReferenceParams;
import org.eclipse.lsp4j.RenameFile;
import org.eclipse.lsp4j.RenameParams;
import org.eclipse.lsp4j.ResourceOperation;
+import org.eclipse.lsp4j.SemanticTokens;
+import org.eclipse.lsp4j.SemanticTokensCapabilities;
+import org.eclipse.lsp4j.SemanticTokensLegend;
+import org.eclipse.lsp4j.SemanticTokensParams;
import org.eclipse.lsp4j.ResourceOperationKind;
import org.eclipse.lsp4j.ShowMessageRequestParams;
import org.eclipse.lsp4j.SymbolInformation;
+import org.eclipse.lsp4j.TextDocumentClientCapabilities;
import org.eclipse.lsp4j.TextDocumentContentChangeEvent;
import org.eclipse.lsp4j.TextDocumentEdit;
import org.eclipse.lsp4j.TextDocumentIdentifier;
@@ -4644,6 +4650,95 @@ public class ServerTest extends NbTestCase {
return toString(edit.getRange()) + "=>" + edit.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<LanguageServer> 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<MessageActionItem>
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<String> 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<String> 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 0ce5eb8..e0a778f 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",
diff --git a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
index 4b775fc..b620f30 100644
--- a/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
+++ b/nbbuild/antsrc/org/netbeans/nbbuild/extlibs/ignored-overlaps
@@ -93,9 +93,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.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.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
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists