Skip to content

Commit 6b625e4

Browse files
committed
Basic show syntax tree
1 parent fed2e16 commit 6b625e4

File tree

4 files changed

+55
-1
lines changed

4 files changed

+55
-1
lines changed

package.json

+5
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@
7979
"command": "cairo.viewAnalyzedCrates",
8080
"title": "View currently analyzed crates",
8181
"category": "Cairo"
82+
},
83+
{
84+
"command": "cairo.viewSyntaxTree",
85+
"title": "View syntax tree of the current file content",
86+
"category": "Cairo"
8287
}
8388
],
8489
"configuration": [

src/cairols.ts

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Context } from "./context";
66
import { Scarb } from "./scarb";
77
import {
88
registerMacroExpandProvider,
9+
registerViewSyntaxTreeProvider,
910
registerVfsProvider,
1011
registerViewAnalyzedCratesProvider,
1112
} from "./textDocumentProviders";
@@ -71,6 +72,7 @@ export async function setupLanguageServer(ctx: Context): Promise<SetupResult | u
7172
registerVfsProvider(client, ctx);
7273
registerMacroExpandProvider(client, ctx);
7374
registerViewAnalyzedCratesProvider(client, ctx);
75+
registerViewSyntaxTreeProvider(client, ctx);
7476

7577
client.onNotification("scarb/could-not-find-scarb-executable", () => notifyScarbMissing(ctx));
7678

src/lspRequests.ts

+12
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,15 @@ export interface ToolchainInfoResponse {
4545
export const toolchainInfo = new lc.RequestType0<ToolchainInfoResponse, void>(
4646
"cairo/toolchainInfo",
4747
);
48+
49+
export interface ViewSyntaxTreeRequest {
50+
uri: string;
51+
}
52+
53+
export type ViewSyntaxTreeRequestResponse = string | null;
54+
55+
export const viewSyntaxTree = new lc.RequestType<
56+
ViewSyntaxTreeRequest,
57+
ViewSyntaxTreeRequestResponse,
58+
void
59+
>("cairo/viewSyntaxTree");

src/textDocumentProviders.ts

+36-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as lc from "vscode-languageclient/node";
22
import * as vscode from "vscode";
33
import { Context } from "./context";
4-
import { expandMacro, vfsProvide, viewAnalyzedCrates } from "./lspRequests";
4+
import { expandMacro, viewSyntaxTree, vfsProvide, viewAnalyzedCrates } from "./lspRequests";
55

66
export const registerVfsProvider = (client: lc.LanguageClient, ctx: Context) => {
77
const vfsProvider: vscode.TextDocumentContentProvider = {
@@ -94,3 +94,38 @@ export const registerViewAnalyzedCratesProvider = (client: lc.LanguageClient, ct
9494
}),
9595
);
9696
};
97+
98+
export const registerViewSyntaxTreeProvider = (client: lc.LanguageClient, ctx: Context) => {
99+
const uri = vscode.Uri.parse("cairo-view-syntax-tree://viewSyntaxTree/[SYNTAX_TREE].txt");
100+
const eventEmitter = new vscode.EventEmitter<vscode.Uri>();
101+
102+
const tdcp: vscode.TextDocumentContentProvider = {
103+
async provideTextDocumentContent(): Promise<string> {
104+
const editor = vscode.window.activeTextEditor;
105+
if (!editor) return "No file selected, please click on a file";
106+
107+
const syntaxTree = await client.sendRequest(viewSyntaxTree, {
108+
uri: client.code2ProtocolConverter.asUri(editor.document.uri),
109+
});
110+
111+
return syntaxTree ?? "Not available";
112+
},
113+
onDidChange: eventEmitter.event,
114+
};
115+
116+
ctx.extension.subscriptions.push(
117+
vscode.workspace.registerTextDocumentContentProvider("cairo-view-syntax-tree", tdcp),
118+
);
119+
120+
ctx.extension.subscriptions.push(
121+
vscode.commands.registerCommand("cairo.viewSyntaxTree", async () => {
122+
const document = await vscode.workspace.openTextDocument(uri);
123+
124+
eventEmitter.fire(uri);
125+
126+
return vscode.window.showTextDocument(document, vscode.ViewColumn.Two, true);
127+
}),
128+
);
129+
130+
// TODO: re-request on file change
131+
};

0 commit comments

Comments
 (0)