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 <jlah...@netbeans.org> 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: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists