This is an automated email from the ASF dual-hosted git repository. jhorvath pushed a commit to branch vscode-named-output in repository https://gitbox.apache.org/repos/asf/netbeans.git
commit 0a658dcfa3b92937837f1ab287c492c91501c8cc Author: Jan Horvath <[email protected]> AuthorDate: Thu Nov 28 08:32:08 2024 +0100 Create new output channel for every LspIO --- .../lsp/server/protocol/NbCodeClientWrapper.java | 21 +++++++++++++++ .../lsp/server/protocol/NbCodeLanguageClient.java | 12 +++++++++ .../modules/java/lsp/server/protocol/Server.java | 21 +++++++++++++++ .../server/ui/AbstractLspInputOutputProvider.java | 27 +++++++++++++++++-- .../java/lsp/server/TestCodeLanguageClient.java | 22 ++++++++++++++++ .../java/lsp/server/explorer/ProjectViewTest.java | 21 +++++++++++++++ java/java.lsp.server/vscode/src/extension.ts | 30 +++++++++++++++++++++- java/java.lsp.server/vscode/src/protocol.ts | 21 +++++++++++++++ 8 files changed, 172 insertions(+), 3 deletions(-) diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java index 7f633df6758..a0c4f672ca3 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeClientWrapper.java @@ -223,4 +223,25 @@ class NbCodeClientWrapper implements NbCodeLanguageClient { public CompletableFuture<Boolean> requestDocumentSave(SaveDocumentRequestParams documentUris) { return remote.requestDocumentSave(documentUris); } + + @Override + public CompletableFuture<Void> writeOutput(OutputMessage lm) { + return remote.writeOutput(lm); + } + + @Override + public CompletableFuture<Void> showOutput(String outputName) { + return remote.showOutput(outputName); + } + + @Override + public CompletableFuture<Void> closeOutput(String outputName) { + return remote.closeOutput(outputName); + } + + @Override + public CompletableFuture<Void> resetOutput(String outputName) { + return remote.resetOutput(outputName); + } + } diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeLanguageClient.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeLanguageClient.java index 1c44d56fa5f..767edb696c2 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeLanguageClient.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/protocol/NbCodeLanguageClient.java @@ -154,4 +154,16 @@ public interface NbCodeLanguageClient extends LanguageClient { @JsonRequest("window/documentSave") public CompletableFuture<Boolean> requestDocumentSave(@NonNull SaveDocumentRequestParams documentUri); + @JsonRequest("output/write") + public CompletableFuture<Void> writeOutput(OutputMessage message); + + @JsonRequest("output/show") + public CompletableFuture<Void> showOutput(String outputName); + + @JsonRequest("output/close") + public CompletableFuture<Void> closeOutput(String outputName); + + @JsonRequest("output/reset") + public CompletableFuture<Void> resetOutput(String outputName); + } 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 120c8590877..6060385d63c 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 @@ -1358,6 +1358,27 @@ public final class Server { logWarning(Arrays.asList(documentUris)); return CompletableFuture.completedFuture(false); } + + @Override + public CompletableFuture<Void> writeOutput(OutputMessage lm) { + logWarning(lm.message); + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture<Void> showOutput(String outputName) { + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture<Void> closeOutput(String outputName) { + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture<Void> resetOutput(String outputName) { + return CompletableFuture.completedFuture(null); + } }; diff --git a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ui/AbstractLspInputOutputProvider.java b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ui/AbstractLspInputOutputProvider.java index 34c3407af84..5160e367f22 100644 --- a/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ui/AbstractLspInputOutputProvider.java +++ b/java/java.lsp.server/src/org/netbeans/modules/java/lsp/server/ui/AbstractLspInputOutputProvider.java @@ -18,6 +18,7 @@ */ package org.netbeans.modules.java.lsp.server.ui; +import org.netbeans.modules.java.lsp.server.protocol.OutputMessage; import java.io.CharArrayReader; import java.io.IOException; import java.io.InputStream; @@ -29,6 +30,8 @@ import java.util.Set; import org.netbeans.api.io.Hyperlink; import org.netbeans.api.io.OutputColor; import org.netbeans.api.io.ShowOperation; +import org.netbeans.modules.java.lsp.server.LspServerUtils; +import org.netbeans.modules.java.lsp.server.protocol.NbCodeLanguageClient; import org.netbeans.modules.java.lsp.server.ui.AbstractLspInputOutputProvider.LspIO; import org.netbeans.spi.io.InputOutputProvider; import org.openide.util.Lookup; @@ -82,14 +85,26 @@ public abstract class AbstractLspInputOutputProvider implements InputOutputProvi @Override public final void resetIO(LspIO io) { + NbCodeLanguageClient client = LspServerUtils.findLspClient(Lookup.getDefault()); + if (client != null) { + client.resetOutput(io.name); + } } @Override public final void showIO(LspIO io, Set<ShowOperation> operations) { + NbCodeLanguageClient client = LspServerUtils.findLspClient(Lookup.getDefault()); + if (client != null) { + client.showOutput(io.name); + } } @Override public final void closeIO(LspIO io) { + NbCodeLanguageClient client = LspServerUtils.findLspClient(Lookup.getDefault()); + if (client != null) { + client.closeOutput(io.name); + } } @Override @@ -131,6 +146,7 @@ public abstract class AbstractLspInputOutputProvider implements InputOutputProvi public static final class LspIO { private final String name; private final IOContext ctx; + private final NbCodeLanguageClient client; final Lookup lookup; final Reader in; final LspWriter out; @@ -164,12 +180,16 @@ public abstract class AbstractLspInputOutputProvider implements InputOutputProvi }; } this.in = in; + client = LspServerUtils.findLspClient(Lookup.getDefault()); + if (client == null) { + throw new IllegalStateException("Unable to find LspClient"); + } } boolean isClosed() { return out.closed && err.closed; } - + private final class LspWriter extends Writer { private final boolean stdIO; volatile boolean closed; @@ -186,6 +206,9 @@ public abstract class AbstractLspInputOutputProvider implements InputOutputProvi } else { ctx.stdErr(chunk); } + if (len > 0) { + client.writeOutput(new OutputMessage(name, chunk)); + } } @Override @@ -198,5 +221,5 @@ public abstract class AbstractLspInputOutputProvider implements InputOutputProvi } } } - + } diff --git a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java index 489670f5725..31f9a128ece 100644 --- a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java +++ b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/TestCodeLanguageClient.java @@ -43,6 +43,7 @@ import org.netbeans.modules.java.lsp.server.protocol.SetTextEditorDecorationPara import org.netbeans.modules.java.lsp.server.input.ShowInputBoxParams; import org.netbeans.modules.java.lsp.server.input.ShowMutliStepInputParams; import org.netbeans.modules.java.lsp.server.input.ShowQuickPickParams; +import org.netbeans.modules.java.lsp.server.protocol.OutputMessage; import org.netbeans.modules.java.lsp.server.protocol.SaveDocumentRequestParams; import org.netbeans.modules.java.lsp.server.protocol.ShowStatusMessageParams; import org.netbeans.modules.java.lsp.server.protocol.TestProgressParams; @@ -160,4 +161,25 @@ public abstract class TestCodeLanguageClient implements NbCodeLanguageClient { public CompletableFuture<Boolean> requestDocumentSave(SaveDocumentRequestParams documentUris) { return CompletableFuture.completedFuture(false); } + + @Override + public CompletableFuture<Void> writeOutput(OutputMessage message) { + System.out.println(message); + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture<Void> showOutput(String outputName) { + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture<Void> closeOutput(String outputName) { + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture<Void> resetOutput(String outputName) { + return CompletableFuture.completedFuture(null); + } } diff --git a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/ProjectViewTest.java b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/ProjectViewTest.java index 592ad8a726b..a8edbcb45bb 100644 --- a/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/ProjectViewTest.java +++ b/java/java.lsp.server/test/unit/src/org/netbeans/modules/java/lsp/server/explorer/ProjectViewTest.java @@ -77,6 +77,7 @@ import org.netbeans.modules.java.lsp.server.input.QuickPickItem; import org.netbeans.modules.java.lsp.server.input.ShowInputBoxParams; import org.netbeans.modules.java.lsp.server.input.ShowMutliStepInputParams; import org.netbeans.modules.java.lsp.server.input.ShowQuickPickParams; +import org.netbeans.modules.java.lsp.server.protocol.OutputMessage; import org.netbeans.modules.java.lsp.server.protocol.SaveDocumentRequestParams; import org.netbeans.modules.java.lsp.server.protocol.SetTextEditorDecorationParams; import org.netbeans.modules.java.lsp.server.protocol.ShowStatusMessageParams; @@ -285,6 +286,26 @@ public class ProjectViewTest extends NbTestCase { public CompletableFuture<Boolean> requestDocumentSave(SaveDocumentRequestParams documentUris) { return CompletableFuture.completedFuture(false); } + + @Override + public CompletableFuture<Void> writeOutput(OutputMessage message) { + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture<Void> showOutput(String outputName) { + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture<Void> closeOutput(String outputName) { + return CompletableFuture.completedFuture(null); + } + + @Override + public CompletableFuture<Void> resetOutput(String outputName) { + return CompletableFuture.completedFuture(null); + } } private static Launcher<NbLanguageServer> createLauncher(NbCodeLanguageClient client, InputStream in, OutputStream out, diff --git a/java/java.lsp.server/vscode/src/extension.ts b/java/java.lsp.server/vscode/src/extension.ts index 8db683de509..16a0f12cacf 100644 --- a/java/java.lsp.server/vscode/src/extension.ts +++ b/java/java.lsp.server/vscode/src/extension.ts @@ -52,7 +52,7 @@ import * as launcher from './nbcode'; import {NbTestAdapter} from './testAdapter'; import { asRanges, StatusMessageRequest, ShowStatusMessageParams, QuickPickRequest, InputBoxRequest, MutliStepInputRequest, TestProgressNotification, DebugConnector, TextEditorDecorationCreateRequest, TextEditorDecorationSetNotification, TextEditorDecorationDisposeNotification, HtmlPageRequest, HtmlPageParams, - ExecInHtmlPageRequest, SetTextEditorDecorationParams, ProjectActionParams, UpdateConfigurationRequest, QuickPickStep, InputBoxStep, SaveDocumentsRequest, SaveDocumentRequestParams + ExecInHtmlPageRequest, SetTextEditorDecorationParams, ProjectActionParams, UpdateConfigurationRequest, QuickPickStep, InputBoxStep, SaveDocumentsRequest, SaveDocumentRequestParams, OutputMessage, WriteOutputRequest, ShowOutputRequest, CloseOutputRequest, ResetOutputRequest } from './protocol'; import * as launchConfigurations from './launchConfigurations'; import { createTreeViewService, TreeViewService, TreeItemDecorator, Visualizer, CustomizableTreeDataProvider } from './explorer'; @@ -81,6 +81,8 @@ let debugPort: number = -1; let consoleLog: boolean = !!process.env['ENABLE_CONSOLE_LOG']; let specifiedJDKWarned : string[] = []; +const outputChannels: Map<string, vscode.OutputChannel> = new Map(); + export class NbLanguageClient extends LanguageClient { private _treeViewService: TreeViewService; @@ -377,6 +379,15 @@ function getValueAfterPrefix(input: string | undefined, prefix: string): string return ''; } +function getOrCreateOutputChannel(name: string): vscode.OutputChannel { + let outputChannel = outputChannels.get(name); + if (!outputChannel) { + outputChannel = vscode.window.createOutputChannel(name); + outputChannels.set(name, outputChannel); + } + return outputChannel; +} + export function activate(context: ExtensionContext): VSNetBeansAPI { const provider = new StringContentProvider(); const scheme = 'in-memory'; @@ -1508,6 +1519,23 @@ function doActivateWithJDK(specifiedJDK: string | null, context: ExtensionContex decorations.set(decorationType.key, decorationType); return decorationType.key; }); + c.onRequest(WriteOutputRequest.type, param => { + const outputChannel = getOrCreateOutputChannel(param.outputName); + outputChannel.append(param.message); + }); + c.onRequest(ShowOutputRequest.type, param => { + const outputChannel = getOrCreateOutputChannel(param); + outputChannel.show(); + }); + c.onRequest(CloseOutputRequest.type, param => { + const outputChannel = getOrCreateOutputChannel(param); + outputChannel.clear(); + outputChannel.hide(); + }); + c.onRequest(ResetOutputRequest.type, param => { + const outputChannel = getOrCreateOutputChannel(param); + outputChannel.clear(); + }); c.onNotification(TextEditorDecorationSetNotification.type, param => { let decorationType = decorations.get(param.key); if (decorationType) { diff --git a/java/java.lsp.server/vscode/src/protocol.ts b/java/java.lsp.server/vscode/src/protocol.ts index fbe70181121..8b7ec6a972f 100644 --- a/java/java.lsp.server/vscode/src/protocol.ts +++ b/java/java.lsp.server/vscode/src/protocol.ts @@ -323,3 +323,24 @@ export function asRange(value: Range | undefined | null): vscode.Range | undefin export function asRanges(value: Range[]): vscode.Range[] { return value.map(value => asRange(value)); } + +export interface OutputMessage { + outputName: string; + message: string; +} + +export namespace WriteOutputRequest { + export const type = new ProtocolRequestType<OutputMessage, void, void, void, void>('output/write'); +} + +export namespace ShowOutputRequest { + export const type = new ProtocolRequestType<string, void, void, void, void>('output/show'); +} + +export namespace CloseOutputRequest { + export const type = new ProtocolRequestType<string, void, void, void, void>('output/close'); +} + +export namespace ResetOutputRequest { + export const type = new ProtocolRequestType<string, void, void, void, void>('output/reset'); +} --------------------------------------------------------------------- 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
