From a629152156563a2e112548f952dd2efd3f838ef5 Mon Sep 17 00:00:00 2001 From: nub31 Date: Thu, 23 Oct 2025 18:10:53 +0200 Subject: [PATCH] Output c pane --- compiler/NubLang.LSP/WorkspaceManager.cs | 8 +- vscode-lsp/server/nublsp | Bin 77421920 -> 77421920 bytes vscode-lsp/src/extension.ts | 116 ++++++++++++++++++++++- 3 files changed, 119 insertions(+), 5 deletions(-) diff --git a/compiler/NubLang.LSP/WorkspaceManager.cs b/compiler/NubLang.LSP/WorkspaceManager.cs index ba24be7..d921f10 100644 --- a/compiler/NubLang.LSP/WorkspaceManager.cs +++ b/compiler/NubLang.LSP/WorkspaceManager.cs @@ -54,12 +54,12 @@ public class WorkspaceManager(DiagnosticsPublisher diagnosticsPublisher, ILangua { var modules = Module.Collect(_syntaxTrees.Select(x => x.Value).ToList()); - foreach (var (documentUri, syntaxTree) in _syntaxTrees) + foreach (var (fsPath, syntaxTree) in _syntaxTrees) { var typeChecker = new TypeChecker(syntaxTree, modules); var result = typeChecker.Check(); - diagnosticsPublisher.Publish(documentUri, typeChecker.Diagnostics); - _compilationUnits[documentUri] = result; + diagnosticsPublisher.Publish(fsPath, typeChecker.Diagnostics); + _compilationUnits[fsPath] = result; var generator = new Generator(result); var c = generator.Emit(); @@ -67,7 +67,7 @@ public class WorkspaceManager(DiagnosticsPublisher diagnosticsPublisher, ILangua server.SendNotification("nub/output", new { content = c, - uri = documentUri + path = fsPath }); } } diff --git a/vscode-lsp/server/nublsp b/vscode-lsp/server/nublsp index 5b3741e9704076ae82e98946735c928b3b353b38..1a76dedf7cc9331e09b0be9589b7c9c05c117988 100755 GIT binary patch delta 11511 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 export function activate(context: vscode.ExtensionContext) { const serverExecutable = path.join(context.asAbsolutePath('server'), "nublsp"); @@ -33,16 +35,128 @@ export function activate(context: vscode.ExtensionContext) { ); client.onNotification("nub/output", (params: { path: string, content: string }) => { + const normalizedPath = vscode.Uri.file(params.path).fsPath; + outputCache.set(normalizedPath, params.content); + if (outputPanel && vscode.window.activeTextEditor) { + const activePath = vscode.window.activeTextEditor.document.uri.fsPath; + if (activePath === normalizedPath) { + updateOutputPanel(params.content); + } + } }); - vscode.commands.registerCommand('nub.openOutput', async () => { + const openOutputCommand = vscode.commands.registerCommand('nub.openOutput', async () => { + const editor = vscode.window.activeTextEditor; + if (!editor) { + vscode.window.showWarningMessage('No active editor found'); + return; + } + + const filePath = editor.document.uri.fsPath; + const cachedOutput = outputCache.get(filePath); + + if (outputPanel) { + outputPanel.reveal(vscode.ViewColumn.Beside); + } else { + outputPanel = vscode.window.createWebviewPanel( + 'nubOutput', + 'C Output', + vscode.ViewColumn.Beside, + { + enableScripts: true, + retainContextWhenHidden: true + } + ); + + outputPanel.onDidDispose(() => { + outputPanel = undefined; + }); + } + + if (cachedOutput) { + updateOutputPanel(cachedOutput); + } else { + updateOutputPanel('// Waiting for C output...'); + } }); + const changeEditorSubscription = vscode.window.onDidChangeActiveTextEditor(editor => { + if (outputPanel && editor) { + const filePath = editor.document.uri.fsPath; + const cachedOutput = outputCache.get(filePath); + + if (cachedOutput) { + updateOutputPanel(cachedOutput); + } else { + updateOutputPanel('// No C output available for this file'); + } + } + }); + + context.subscriptions.push(openOutputCommand, changeEditorSubscription); + client.start(); } +function updateOutputPanel(content: string) { + if (!outputPanel) return; + + outputPanel.webview.html = getWebviewContent(content); +} + +function getWebviewContent(content: string): string { + const escapedContent = content + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + + return ` + + + + + Nub C Output + + + + +
${escapedContent}
+ + + + +`; +} + export function deactivate(): Thenable | undefined { if (!client) { return undefined;