From 6c1649856034a6fde68828d3ab05f3845042a88f Mon Sep 17 00:00:00 2001 From: piotmag769 Date: Tue, 21 Jan 2025 10:17:52 +0100 Subject: [PATCH] Basic show syntax tree --- package.json | 5 +++++ src/cairols.ts | 2 ++ src/lspRequests.ts | 12 ++++++++++++ src/textDocumentProviders.ts | 37 +++++++++++++++++++++++++++++++++++- 4 files changed, 55 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index d47069e..c73c216 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,11 @@ "command": "cairo.viewAnalyzedCrates", "title": "View currently analyzed crates", "category": "Cairo" + }, + { + "command": "cairo.viewSyntaxTree", + "title": "View syntax tree of the current file content", + "category": "Cairo" } ], "configuration": [ diff --git a/src/cairols.ts b/src/cairols.ts index 971dc6a..5f54ba2 100644 --- a/src/cairols.ts +++ b/src/cairols.ts @@ -6,6 +6,7 @@ import { Context } from "./context"; import { Scarb } from "./scarb"; import { registerMacroExpandProvider, + registerviewSyntaxTreeProvider, registerVfsProvider, registerViewAnalyzedCratesProvider, } from "./textDocumentProviders"; @@ -71,6 +72,7 @@ export async function setupLanguageServer(ctx: Context): Promise notifyScarbMissing(ctx)); diff --git a/src/lspRequests.ts b/src/lspRequests.ts index ea26851..c8f42e7 100644 --- a/src/lspRequests.ts +++ b/src/lspRequests.ts @@ -45,3 +45,15 @@ export interface ToolchainInfoResponse { export const toolchainInfo = new lc.RequestType0( "cairo/toolchainInfo", ); + +export interface viewSyntaxTreeRequest { + uri: string; +} + +export type viewSyntaxTreeRequestResponse = string | null; + +export const viewSyntaxTree = new lc.RequestType< + viewSyntaxTreeRequest, + viewSyntaxTreeRequestResponse, + void +>("cairo/viewSyntaxTree"); diff --git a/src/textDocumentProviders.ts b/src/textDocumentProviders.ts index 1a1ddfe..37d5011 100644 --- a/src/textDocumentProviders.ts +++ b/src/textDocumentProviders.ts @@ -1,7 +1,7 @@ import * as lc from "vscode-languageclient/node"; import * as vscode from "vscode"; import { Context } from "./context"; -import { expandMacro, vfsProvide, viewAnalyzedCrates } from "./lspRequests"; +import { expandMacro, viewSyntaxTree, vfsProvide, viewAnalyzedCrates } from "./lspRequests"; export const registerVfsProvider = (client: lc.LanguageClient, ctx: Context) => { const vfsProvider: vscode.TextDocumentContentProvider = { @@ -94,3 +94,38 @@ export const registerViewAnalyzedCratesProvider = (client: lc.LanguageClient, ct }), ); }; + +export const registerviewSyntaxTreeProvider = (client: lc.LanguageClient, ctx: Context) => { + const uri = vscode.Uri.parse("cairo-show-syntax-tree://viewSyntaxTree/[SYNTAX_TREE].txt"); + const eventEmitter = new vscode.EventEmitter(); + + const tdcp: vscode.TextDocumentContentProvider = { + async provideTextDocumentContent(): Promise { + const editor = vscode.window.activeTextEditor; + if (!editor) return "No file selected, please click on a file"; + + const syntaxTree = await client.sendRequest(viewSyntaxTree, { + uri: client.code2ProtocolConverter.asUri(editor.document.uri), + }); + + return syntaxTree ?? "Not available"; + }, + onDidChange: eventEmitter.event, + }; + + ctx.extension.subscriptions.push( + vscode.workspace.registerTextDocumentContentProvider("cairo-show-syntax-tree", tdcp), + ); + + ctx.extension.subscriptions.push( + vscode.commands.registerCommand("cairo.viewSyntaxTree", async () => { + const document = await vscode.workspace.openTextDocument(uri); + + eventEmitter.fire(uri); + + return vscode.window.showTextDocument(document, vscode.ViewColumn.Two, true); + }), + ); + + // TODO: re-request on file change +};