From a28d3adcf8bdc3d795c151a27a43c298c2128e8c Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Thu, 17 Oct 2024 14:12:12 +0800 Subject: [PATCH 01/15] feat: add config change + version check --- vscode-cairo/package.json | 5 ++++ vscode-cairo/src/extension.ts | 49 +++++++++++++++++++++++++++++++++++ vscode-cairo/src/scarb.ts | 5 ++++ 3 files changed, 59 insertions(+) diff --git a/vscode-cairo/package.json b/vscode-cairo/package.json index db468746422..b732b89bf74 100644 --- a/vscode-cairo/package.json +++ b/vscode-cairo/package.json @@ -135,6 +135,11 @@ }, "default": {}, "markdownDescription": "Extra environment variables that will be passed to the `cairo-language-server` executable.\nUseful for passing e.g. `CAIRO_LS_LOG` for debugging." + }, + "cairo1.showStatusBar": { + "type": "boolean", + "default": true, + "description": "Show Cairo Language Server information" } } } diff --git a/vscode-cairo/src/extension.ts b/vscode-cairo/src/extension.ts index cc854169bf7..e3d9bfc31b1 100644 --- a/vscode-cairo/src/extension.ts +++ b/vscode-cairo/src/extension.ts @@ -2,8 +2,10 @@ import * as vscode from "vscode"; import * as lc from "vscode-languageclient/node"; import { setupLanguageServer } from "./cairols"; import { Context } from "./context"; +import { Scarb } from "./scarb"; let client: lc.LanguageClient | undefined; +let statusBarItem: vscode.StatusBarItem; export async function activate(extensionContext: vscode.ExtensionContext) { const ctx = Context.create(extensionContext); @@ -14,11 +16,58 @@ export async function activate(extensionContext: vscode.ExtensionContext) { ctx.log.warn("language server is disabled"); ctx.log.warn("note: set `cairo1.enableLanguageServer` to `true` to enable it"); } + + statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); + extensionContext.subscriptions.push(statusBarItem); + + updateStatusBar(ctx); + + extensionContext.subscriptions.push( + vscode.workspace.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("cairo1.showStatusBar")) { + updateStatusBar(ctx); + } + }), + ); +} + +async function updateStatusBar(ctx: Context) { + const config = vscode.workspace.getConfiguration("cairo1"); + const showStatusBar = config.get("showStatusBar", true); + + if (showStatusBar) { + const editor = vscode.window.activeTextEditor; + if (editor && editor.document.languageId === "cairo") { + statusBarItem.text = "Cairo"; + statusBarItem.tooltip = "Cairo Language"; + + // Get Scarb version + try { + const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], ctx); + if (scarb) { + const version = await scarb.getVersion(ctx); + statusBarItem.tooltip = `Cairo Language\n${version}`; + } + } catch (error) { + ctx.log.error(`Error getting Scarb version: ${error}`); + } + + statusBarItem.show(); + } else { + statusBarItem.hide(); + } + } else { + statusBarItem.hide(); + } } export function deactivate(): Thenable | undefined { if (!client) { return undefined; } + if (statusBarItem) { + statusBarItem.dispose(); + } + return client.stop(); } diff --git a/vscode-cairo/src/scarb.ts b/vscode-cairo/src/scarb.ts index 77add6a9158..8d1605192c2 100644 --- a/vscode-cairo/src/scarb.ts +++ b/vscode-cairo/src/scarb.ts @@ -87,6 +87,11 @@ export class Scarb implements LanguageServerExecutableProvider { return this.hasCommand("cairo-language-server", ctx); } + public async getVersion(ctx: Context): Promise { + const output = await this.execWithOutput(["--version"], ctx); + return output.trim(); + } + public async cacheClean(ctx: Context): Promise { await this.execWithOutput(["cache", "clean"], ctx); } From d85179a427f41c28a8b3d14e8d65bc7160fd5fc3 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Thu, 17 Oct 2024 14:19:31 +0800 Subject: [PATCH 02/15] refactor: move status bar logic into separate file --- vscode-cairo/package.json | 2 +- vscode-cairo/src/config.ts | 1 + vscode-cairo/src/context.ts | 6 ++++- vscode-cairo/src/extension.ts | 50 ++++------------------------------- vscode-cairo/src/statusBar.ts | 45 +++++++++++++++++++++++++++++++ 5 files changed, 57 insertions(+), 47 deletions(-) create mode 100644 vscode-cairo/src/statusBar.ts diff --git a/vscode-cairo/package.json b/vscode-cairo/package.json index b732b89bf74..5035b29158c 100644 --- a/vscode-cairo/package.json +++ b/vscode-cairo/package.json @@ -136,7 +136,7 @@ "default": {}, "markdownDescription": "Extra environment variables that will be passed to the `cairo-language-server` executable.\nUseful for passing e.g. `CAIRO_LS_LOG` for debugging." }, - "cairo1.showStatusBar": { + "cairo1.enableStatusBar": { "type": "boolean", "default": true, "description": "Show Cairo Language Server information" diff --git a/vscode-cairo/src/config.ts b/vscode-cairo/src/config.ts index 1a644e1fa5c..28f9eb03e96 100644 --- a/vscode-cairo/src/config.ts +++ b/vscode-cairo/src/config.ts @@ -3,6 +3,7 @@ import * as vscode from "vscode"; interface ConfigProps { enableLanguageServer: boolean; + enableStatusBar: boolean; languageServerPath: string; enableScarb: boolean; preferScarbLanguageServer: boolean; diff --git a/vscode-cairo/src/context.ts b/vscode-cairo/src/context.ts index 80d60d63209..43ac3e2cca5 100644 --- a/vscode-cairo/src/context.ts +++ b/vscode-cairo/src/context.ts @@ -9,9 +9,12 @@ export class Context { log: true, }), ); + const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); + extensionContext.subscriptions.push(log); + extensionContext.subscriptions.push(statusBarItem); - return new Context(extensionContext, log); + return new Context(extensionContext, log, statusBarItem); } public readonly config: Config = new Config(); @@ -19,5 +22,6 @@ export class Context { private constructor( public readonly extension: vscode.ExtensionContext, public readonly log: RootLogOutputChannel, + public readonly statusBarItem: vscode.StatusBarItem, ) {} } diff --git a/vscode-cairo/src/extension.ts b/vscode-cairo/src/extension.ts index e3d9bfc31b1..24502f08267 100644 --- a/vscode-cairo/src/extension.ts +++ b/vscode-cairo/src/extension.ts @@ -2,10 +2,9 @@ import * as vscode from "vscode"; import * as lc from "vscode-languageclient/node"; import { setupLanguageServer } from "./cairols"; import { Context } from "./context"; -import { Scarb } from "./scarb"; +import { setupStatusBar } from "./statusBar"; let client: lc.LanguageClient | undefined; -let statusBarItem: vscode.StatusBarItem; export async function activate(extensionContext: vscode.ExtensionContext) { const ctx = Context.create(extensionContext); @@ -17,47 +16,11 @@ export async function activate(extensionContext: vscode.ExtensionContext) { ctx.log.warn("note: set `cairo1.enableLanguageServer` to `true` to enable it"); } - statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); - extensionContext.subscriptions.push(statusBarItem); - - updateStatusBar(ctx); - - extensionContext.subscriptions.push( - vscode.workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration("cairo1.showStatusBar")) { - updateStatusBar(ctx); - } - }), - ); -} - -async function updateStatusBar(ctx: Context) { - const config = vscode.workspace.getConfiguration("cairo1"); - const showStatusBar = config.get("showStatusBar", true); - - if (showStatusBar) { - const editor = vscode.window.activeTextEditor; - if (editor && editor.document.languageId === "cairo") { - statusBarItem.text = "Cairo"; - statusBarItem.tooltip = "Cairo Language"; - - // Get Scarb version - try { - const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], ctx); - if (scarb) { - const version = await scarb.getVersion(ctx); - statusBarItem.tooltip = `Cairo Language\n${version}`; - } - } catch (error) { - ctx.log.error(`Error getting Scarb version: ${error}`); - } - - statusBarItem.show(); - } else { - statusBarItem.hide(); - } + if (ctx.config.get("enableStatusBar")) { + await setupStatusBar(ctx); } else { - statusBarItem.hide(); + ctx.log.warn("status bar is disabled"); + ctx.log.warn("note: set `cairo1.enableStatusBar` to `true` to enable it"); } } @@ -65,9 +28,6 @@ export function deactivate(): Thenable | undefined { if (!client) { return undefined; } - if (statusBarItem) { - statusBarItem.dispose(); - } return client.stop(); } diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts new file mode 100644 index 00000000000..98d00e1fa19 --- /dev/null +++ b/vscode-cairo/src/statusBar.ts @@ -0,0 +1,45 @@ +import * as vscode from "vscode"; +import { Context } from "./context"; +import { Scarb } from "./scarb"; + +export async function setupStatusBar(ctx: Context) { + ctx.extension.subscriptions.push( + vscode.workspace.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("cairo1.enableStatusBar")) { + updateStatusBar(ctx); + } + }), + ); + + updateStatusBar(ctx); +} + +async function updateStatusBar(ctx: Context) { + const config = vscode.workspace.getConfiguration("cairo1"); + const enableStatusBar = config.get("enableStatusBar", true); + + if (enableStatusBar) { + const editor = vscode.window.activeTextEditor; + if (editor && editor.document.languageId === "cairo") { + ctx.statusBarItem.text = "Cairo"; + ctx.statusBarItem.tooltip = "Cairo Language"; + + // Get Scarb version + try { + const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], ctx); + if (scarb) { + const version = await scarb.getVersion(ctx); + ctx.statusBarItem.tooltip = `Cairo Language\n${version}`; + } + } catch (error) { + ctx.log.error(`Error getting Scarb version: ${error}`); + } + + ctx.statusBarItem.show(); + } else { + ctx.statusBarItem.hide(); + } + } else { + ctx.statusBarItem.hide(); + } +} From e6423c27aaf1a00698450a8ed48e706065a87f0f Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Thu, 17 Oct 2024 14:38:46 +0800 Subject: [PATCH 03/15] feat: always display status bar --- vscode-cairo/package.json | 3 ++- vscode-cairo/src/statusBar.ts | 28 +++++++++++----------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/vscode-cairo/package.json b/vscode-cairo/package.json index 5035b29158c..99bd3e05621 100644 --- a/vscode-cairo/package.json +++ b/vscode-cairo/package.json @@ -139,7 +139,8 @@ "cairo1.enableStatusBar": { "type": "boolean", "default": true, - "description": "Show Cairo Language Server information" + "description": "Show Cairo Language Server information", + "scope": "window" } } } diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index 98d00e1fa19..984f10b1405 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -19,26 +19,20 @@ async function updateStatusBar(ctx: Context) { const enableStatusBar = config.get("enableStatusBar", true); if (enableStatusBar) { - const editor = vscode.window.activeTextEditor; - if (editor && editor.document.languageId === "cairo") { - ctx.statusBarItem.text = "Cairo"; - ctx.statusBarItem.tooltip = "Cairo Language"; + ctx.statusBarItem.text = "Cairo"; + ctx.statusBarItem.tooltip = "Cairo Language"; - // Get Scarb version - try { - const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], ctx); - if (scarb) { - const version = await scarb.getVersion(ctx); - ctx.statusBarItem.tooltip = `Cairo Language\n${version}`; - } - } catch (error) { - ctx.log.error(`Error getting Scarb version: ${error}`); + try { + const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], ctx); + if (scarb) { + const version = await scarb.getVersion(ctx); + ctx.statusBarItem.tooltip = `Cairo Language\n${version}`; } - - ctx.statusBarItem.show(); - } else { - ctx.statusBarItem.hide(); + } catch (error) { + ctx.log.error(`Error getting Scarb version: ${error}`); } + + ctx.statusBarItem.show(); } else { ctx.statusBarItem.hide(); } From c9cc6237cbf82812f76a7a50f23494a9039026a6 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Thu, 17 Oct 2024 14:48:07 +0800 Subject: [PATCH 04/15] feat: make status bar clickable to lsp logs --- vscode-cairo/src/extension.ts | 2 +- vscode-cairo/src/statusBar.ts | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/vscode-cairo/src/extension.ts b/vscode-cairo/src/extension.ts index 24502f08267..a0fac1b96f3 100644 --- a/vscode-cairo/src/extension.ts +++ b/vscode-cairo/src/extension.ts @@ -17,7 +17,7 @@ export async function activate(extensionContext: vscode.ExtensionContext) { } if (ctx.config.get("enableStatusBar")) { - await setupStatusBar(ctx); + await setupStatusBar(ctx, client); } else { ctx.log.warn("status bar is disabled"); ctx.log.warn("note: set `cairo1.enableStatusBar` to `true` to enable it"); diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index 984f10b1405..8634591a55f 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -1,8 +1,11 @@ import * as vscode from "vscode"; import { Context } from "./context"; import { Scarb } from "./scarb"; +import * as lc from "vscode-languageclient/node"; -export async function setupStatusBar(ctx: Context) { +const CAIRO_STATUS_BAR_COMMAND = "cairo1.statusBar.clicked"; + +export async function setupStatusBar(ctx: Context, client?: lc.LanguageClient) { ctx.extension.subscriptions.push( vscode.workspace.onDidChangeConfiguration((e) => { if (e.affectsConfiguration("cairo1.enableStatusBar")) { @@ -11,6 +14,17 @@ export async function setupStatusBar(ctx: Context) { }), ); + ctx.extension.subscriptions.push( + vscode.commands.registerCommand(CAIRO_STATUS_BAR_COMMAND, () => { + if (client) { + client.outputChannel.show(); + } else { + vscode.window.showWarningMessage("Cairo Language Server is not active"); + } + }), + ); + ctx.statusBarItem.command = CAIRO_STATUS_BAR_COMMAND; + updateStatusBar(ctx); } From 803067dcb30458918e1ef9ad84ce4e76d048ece4 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Fri, 18 Oct 2024 02:16:53 +0800 Subject: [PATCH 05/15] refactor: change settings var name + description --- vscode-cairo/package.json | 4 ++-- vscode-cairo/src/config.ts | 2 +- vscode-cairo/src/extension.ts | 4 ++-- vscode-cairo/src/statusBar.ts | 6 +++--- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/vscode-cairo/package.json b/vscode-cairo/package.json index 99bd3e05621..7228362eb20 100644 --- a/vscode-cairo/package.json +++ b/vscode-cairo/package.json @@ -136,10 +136,10 @@ "default": {}, "markdownDescription": "Extra environment variables that will be passed to the `cairo-language-server` executable.\nUseful for passing e.g. `CAIRO_LS_LOG` for debugging." }, - "cairo1.enableStatusBar": { + "cairo1.showInStatusBar": { "type": "boolean", "default": true, - "description": "Show Cairo Language Server information", + "description": "Show CairoLS information in the status bar.", "scope": "window" } } diff --git a/vscode-cairo/src/config.ts b/vscode-cairo/src/config.ts index 28f9eb03e96..1f0dc89b7e1 100644 --- a/vscode-cairo/src/config.ts +++ b/vscode-cairo/src/config.ts @@ -3,7 +3,7 @@ import * as vscode from "vscode"; interface ConfigProps { enableLanguageServer: boolean; - enableStatusBar: boolean; + showInStatusBar: boolean; languageServerPath: string; enableScarb: boolean; preferScarbLanguageServer: boolean; diff --git a/vscode-cairo/src/extension.ts b/vscode-cairo/src/extension.ts index a0fac1b96f3..fb106c809e6 100644 --- a/vscode-cairo/src/extension.ts +++ b/vscode-cairo/src/extension.ts @@ -16,11 +16,11 @@ export async function activate(extensionContext: vscode.ExtensionContext) { ctx.log.warn("note: set `cairo1.enableLanguageServer` to `true` to enable it"); } - if (ctx.config.get("enableStatusBar")) { + if (ctx.config.get("showInStatusBar")) { await setupStatusBar(ctx, client); } else { ctx.log.warn("status bar is disabled"); - ctx.log.warn("note: set `cairo1.enableStatusBar` to `true` to enable it"); + ctx.log.warn("note: set `cairo1.showInStatusBar` to `true` to enable it"); } } diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index 8634591a55f..d1969d74536 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -8,7 +8,7 @@ const CAIRO_STATUS_BAR_COMMAND = "cairo1.statusBar.clicked"; export async function setupStatusBar(ctx: Context, client?: lc.LanguageClient) { ctx.extension.subscriptions.push( vscode.workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration("cairo1.enableStatusBar")) { + if (e.affectsConfiguration("cairo1.showInStatusBar")) { updateStatusBar(ctx); } }), @@ -30,9 +30,9 @@ export async function setupStatusBar(ctx: Context, client?: lc.LanguageClient) { async function updateStatusBar(ctx: Context) { const config = vscode.workspace.getConfiguration("cairo1"); - const enableStatusBar = config.get("enableStatusBar", true); + const showInStatusBar = config.get("showInStatusBar", true); - if (enableStatusBar) { + if (showInStatusBar) { ctx.statusBarItem.text = "Cairo"; ctx.statusBarItem.tooltip = "Cairo Language"; From 6d77b0154313e63a33c50afe7c78c9153e9c4653 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Fri, 18 Oct 2024 02:17:24 +0800 Subject: [PATCH 06/15] chore: remove logs --- vscode-cairo/src/extension.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/vscode-cairo/src/extension.ts b/vscode-cairo/src/extension.ts index fb106c809e6..04e6e434e80 100644 --- a/vscode-cairo/src/extension.ts +++ b/vscode-cairo/src/extension.ts @@ -18,9 +18,6 @@ export async function activate(extensionContext: vscode.ExtensionContext) { if (ctx.config.get("showInStatusBar")) { await setupStatusBar(ctx, client); - } else { - ctx.log.warn("status bar is disabled"); - ctx.log.warn("note: set `cairo1.showInStatusBar` to `true` to enable it"); } } From be66ce3793341b62f249be4482ccd95ceea7dc63 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Fri, 18 Oct 2024 02:32:46 +0800 Subject: [PATCH 07/15] refactor: create statusbar class --- vscode-cairo/src/context.ts | 10 ++-- vscode-cairo/src/extension.ts | 3 +- vscode-cairo/src/statusBar.ts | 96 +++++++++++++++++++++-------------- 3 files changed, 64 insertions(+), 45 deletions(-) diff --git a/vscode-cairo/src/context.ts b/vscode-cairo/src/context.ts index 43ac3e2cca5..742edadcf10 100644 --- a/vscode-cairo/src/context.ts +++ b/vscode-cairo/src/context.ts @@ -1,6 +1,7 @@ import * as vscode from "vscode"; import { Config } from "./config"; import { RootLogOutputChannel } from "./logging"; +import { StatusBar } from "./statusBar"; export class Context { public static create(extensionContext: vscode.ExtensionContext): Context { @@ -9,19 +10,20 @@ export class Context { log: true, }), ); - const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); extensionContext.subscriptions.push(log); - extensionContext.subscriptions.push(statusBarItem); - return new Context(extensionContext, log, statusBarItem); + const context = new Context(extensionContext, log); + context.statusBar = new StatusBar(context); + + return context; } public readonly config: Config = new Config(); + public statusBar!: StatusBar; private constructor( public readonly extension: vscode.ExtensionContext, public readonly log: RootLogOutputChannel, - public readonly statusBarItem: vscode.StatusBarItem, ) {} } diff --git a/vscode-cairo/src/extension.ts b/vscode-cairo/src/extension.ts index 04e6e434e80..43b032f8190 100644 --- a/vscode-cairo/src/extension.ts +++ b/vscode-cairo/src/extension.ts @@ -2,7 +2,6 @@ import * as vscode from "vscode"; import * as lc from "vscode-languageclient/node"; import { setupLanguageServer } from "./cairols"; import { Context } from "./context"; -import { setupStatusBar } from "./statusBar"; let client: lc.LanguageClient | undefined; @@ -17,7 +16,7 @@ export async function activate(extensionContext: vscode.ExtensionContext) { } if (ctx.config.get("showInStatusBar")) { - await setupStatusBar(ctx, client); + ctx.statusBar.setupStatusBar(client); } } diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index d1969d74536..bc3e82f6137 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -1,53 +1,71 @@ +import type { Context } from "./context"; import * as vscode from "vscode"; -import { Context } from "./context"; -import { Scarb } from "./scarb"; import * as lc from "vscode-languageclient/node"; +import { Scarb } from "./scarb"; const CAIRO_STATUS_BAR_COMMAND = "cairo1.statusBar.clicked"; -export async function setupStatusBar(ctx: Context, client?: lc.LanguageClient) { - ctx.extension.subscriptions.push( - vscode.workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration("cairo1.showInStatusBar")) { - updateStatusBar(ctx); - } - }), - ); - - ctx.extension.subscriptions.push( - vscode.commands.registerCommand(CAIRO_STATUS_BAR_COMMAND, () => { - if (client) { - client.outputChannel.show(); - } else { - vscode.window.showWarningMessage("Cairo Language Server is not active"); - } - }), - ); - ctx.statusBarItem.command = CAIRO_STATUS_BAR_COMMAND; +export class StatusBar { + private statusBarItem: vscode.StatusBarItem; - updateStatusBar(ctx); -} + constructor(private readonly context: Context) { + this.statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); + this.context.extension.subscriptions.push(this.statusBarItem); + } + + public setupStatusBar(client?: lc.LanguageClient): void { + this.context.extension.subscriptions.push( + vscode.workspace.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("cairo1.showInStatusBar")) { + this.updateStatusBar(); + } + }), + ); -async function updateStatusBar(ctx: Context) { - const config = vscode.workspace.getConfiguration("cairo1"); - const showInStatusBar = config.get("showInStatusBar", true); + this.context.extension.subscriptions.push( + vscode.commands.registerCommand(CAIRO_STATUS_BAR_COMMAND, () => { + if (client) { + client.outputChannel.show(); + } else { + vscode.window.showWarningMessage("Cairo Language Server is not active"); + } + }), + ); + this.statusBarItem.command = CAIRO_STATUS_BAR_COMMAND; - if (showInStatusBar) { - ctx.statusBarItem.text = "Cairo"; - ctx.statusBarItem.tooltip = "Cairo Language"; + this.updateStatusBar(); + } + + public async updateStatusBar(): Promise { + const config = vscode.workspace.getConfiguration("cairo1"); + const showInStatusBar = config.get("showInStatusBar", true); - try { - const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], ctx); - if (scarb) { - const version = await scarb.getVersion(ctx); - ctx.statusBarItem.tooltip = `Cairo Language\n${version}`; + if (showInStatusBar) { + this.statusBarItem.text = "Cairo"; + this.statusBarItem.tooltip = "Cairo Language"; + + try { + // TODO(mkaput): Support multi-root workspaces. + const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], this.context); + if (scarb) { + const version = await scarb.getVersion(this.context); + this.statusBarItem.tooltip = `Cairo Language\n${version}`; + } + } catch (error) { + this.context.log.error(`Error getting Scarb version: ${error}`); } - } catch (error) { - ctx.log.error(`Error getting Scarb version: ${error}`); + + this.statusBarItem.show(); + } else { + this.statusBarItem.hide(); } + } + + public showStatusBarItem(): void { + this.statusBarItem.show(); + } - ctx.statusBarItem.show(); - } else { - ctx.statusBarItem.hide(); + public hideStatusBarItem(): void { + this.statusBarItem.hide(); } } From da9674891dc4d22e609a862944292178dabef9e4 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Mon, 21 Oct 2024 20:24:03 +0800 Subject: [PATCH 08/15] chore: remove unnecessary ctx var check --- vscode-cairo/src/extension.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/vscode-cairo/src/extension.ts b/vscode-cairo/src/extension.ts index 43b032f8190..18bf1ed37aa 100644 --- a/vscode-cairo/src/extension.ts +++ b/vscode-cairo/src/extension.ts @@ -15,9 +15,7 @@ export async function activate(extensionContext: vscode.ExtensionContext) { ctx.log.warn("note: set `cairo1.enableLanguageServer` to `true` to enable it"); } - if (ctx.config.get("showInStatusBar")) { - ctx.statusBar.setupStatusBar(client); - } + ctx.statusBar.setupStatusBar(client); } export function deactivate(): Thenable | undefined { From 5547465c001f9cfe6d902acbd71acd4c184fa7c1 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Mon, 21 Oct 2024 20:25:13 +0800 Subject: [PATCH 09/15] chore: rename functions --- vscode-cairo/src/extension.ts | 2 +- vscode-cairo/src/statusBar.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/vscode-cairo/src/extension.ts b/vscode-cairo/src/extension.ts index 18bf1ed37aa..ce0733d49e9 100644 --- a/vscode-cairo/src/extension.ts +++ b/vscode-cairo/src/extension.ts @@ -15,7 +15,7 @@ export async function activate(extensionContext: vscode.ExtensionContext) { ctx.log.warn("note: set `cairo1.enableLanguageServer` to `true` to enable it"); } - ctx.statusBar.setupStatusBar(client); + ctx.statusBar.setup(client); } export function deactivate(): Thenable | undefined { diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index bc3e82f6137..85d0e0a3e00 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -13,11 +13,11 @@ export class StatusBar { this.context.extension.subscriptions.push(this.statusBarItem); } - public setupStatusBar(client?: lc.LanguageClient): void { + public setup(client?: lc.LanguageClient): void { this.context.extension.subscriptions.push( vscode.workspace.onDidChangeConfiguration((e) => { if (e.affectsConfiguration("cairo1.showInStatusBar")) { - this.updateStatusBar(); + this.update(); } }), ); @@ -33,10 +33,10 @@ export class StatusBar { ); this.statusBarItem.command = CAIRO_STATUS_BAR_COMMAND; - this.updateStatusBar(); + this.update(); } - public async updateStatusBar(): Promise { + private async update(): Promise { const config = vscode.workspace.getConfiguration("cairo1"); const showInStatusBar = config.get("showInStatusBar", true); From 35eb3389a1c5233fd8f3fedfaa0924af8d8db7d6 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Tue, 22 Oct 2024 15:58:44 +0800 Subject: [PATCH 10/15] chore: use instance methods --- vscode-cairo/src/statusBar.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index 85d0e0a3e00..1eb6927b21c 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -55,9 +55,9 @@ export class StatusBar { this.context.log.error(`Error getting Scarb version: ${error}`); } - this.statusBarItem.show(); + this.showStatusBarItem(); } else { - this.statusBarItem.hide(); + this.hideStatusBarItem(); } } From 9ca9bffa4ab7783fb3a05ec39ee9c97281ed99e1 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Tue, 22 Oct 2024 16:45:59 +0800 Subject: [PATCH 11/15] refactor: separate logic into instance methods --- vscode-cairo/src/extension.ts | 2 +- vscode-cairo/src/statusBar.ts | 42 +++++++++++++++++++++-------------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/vscode-cairo/src/extension.ts b/vscode-cairo/src/extension.ts index ce0733d49e9..e216513b996 100644 --- a/vscode-cairo/src/extension.ts +++ b/vscode-cairo/src/extension.ts @@ -15,7 +15,7 @@ export async function activate(extensionContext: vscode.ExtensionContext) { ctx.log.warn("note: set `cairo1.enableLanguageServer` to `true` to enable it"); } - ctx.statusBar.setup(client); + await ctx.statusBar.setup(client); } export function deactivate(): Thenable | undefined { diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index 1eb6927b21c..ea077ef3558 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -10,10 +10,11 @@ export class StatusBar { constructor(private readonly context: Context) { this.statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); - this.context.extension.subscriptions.push(this.statusBarItem); } - public setup(client?: lc.LanguageClient): void { + public async setup(client?: lc.LanguageClient): Promise { + this.context.extension.subscriptions.push(this.statusBarItem); + this.context.extension.subscriptions.push( vscode.workspace.onDidChangeConfiguration((e) => { if (e.affectsConfiguration("cairo1.showInStatusBar")) { @@ -31,9 +32,29 @@ export class StatusBar { } }), ); + + await this.initializeStatusBarItem(); + } + + private async initializeStatusBarItem(): Promise { this.statusBarItem.command = CAIRO_STATUS_BAR_COMMAND; + this.statusBarItem.text = "Cairo"; + this.statusBarItem.tooltip = "Cairo Language"; + + await this.updateScarbVersion(); + } - this.update(); + private async updateScarbVersion(): Promise { + try { + // TODO(mkaput): Support multi-root workspaces. + const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], this.context); + if (scarb) { + const version = await scarb.getVersion(this.context); + this.statusBarItem.tooltip = `Cairo Language\n${version}`; + } + } catch (error) { + this.context.log.error(`Error getting Scarb version: ${error}`); + } } private async update(): Promise { @@ -41,20 +62,7 @@ export class StatusBar { const showInStatusBar = config.get("showInStatusBar", true); if (showInStatusBar) { - this.statusBarItem.text = "Cairo"; - this.statusBarItem.tooltip = "Cairo Language"; - - try { - // TODO(mkaput): Support multi-root workspaces. - const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], this.context); - if (scarb) { - const version = await scarb.getVersion(this.context); - this.statusBarItem.tooltip = `Cairo Language\n${version}`; - } - } catch (error) { - this.context.log.error(`Error getting Scarb version: ${error}`); - } - + await this.updateScarbVersion(); this.showStatusBarItem(); } else { this.hideStatusBarItem(); From 3e7d6ac3ec1cef20b0cff05bedc539f38a19c602 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Tue, 22 Oct 2024 16:47:43 +0800 Subject: [PATCH 12/15] chore: remove redundant config check --- vscode-cairo/src/statusBar.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index ea077ef3558..294158df48b 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -1,6 +1,6 @@ -import type { Context } from "./context"; import * as vscode from "vscode"; import * as lc from "vscode-languageclient/node"; +import type { Context } from "./context"; import { Scarb } from "./scarb"; const CAIRO_STATUS_BAR_COMMAND = "cairo1.statusBar.clicked"; @@ -16,10 +16,8 @@ export class StatusBar { this.context.extension.subscriptions.push(this.statusBarItem); this.context.extension.subscriptions.push( - vscode.workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration("cairo1.showInStatusBar")) { - this.update(); - } + vscode.workspace.onDidChangeConfiguration(() => { + this.update(); }), ); @@ -57,6 +55,9 @@ export class StatusBar { } } + /** + * Updates the status bar item based on the current workspace configuration. + */ private async update(): Promise { const config = vscode.workspace.getConfiguration("cairo1"); const showInStatusBar = config.get("showInStatusBar", true); From bfca1bffb0552b8b86ecfd1d9f440665bfafaf10 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Tue, 22 Oct 2024 16:51:16 +0800 Subject: [PATCH 13/15] fix: add statusbar subscription in constructor --- vscode-cairo/src/statusBar.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index 294158df48b..23b3f915823 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -10,11 +10,11 @@ export class StatusBar { constructor(private readonly context: Context) { this.statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100); - } - public async setup(client?: lc.LanguageClient): Promise { this.context.extension.subscriptions.push(this.statusBarItem); + } + public async setup(client?: lc.LanguageClient): Promise { this.context.extension.subscriptions.push( vscode.workspace.onDidChangeConfiguration(() => { this.update(); @@ -43,6 +43,7 @@ export class StatusBar { } private async updateScarbVersion(): Promise { + this.context.log.info("Updating Scarb version"); try { // TODO(mkaput): Support multi-root workspaces. const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], this.context); From 15880ca6b0b0057d0ba19a9e069a05cb73744d86 Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Tue, 22 Oct 2024 16:53:35 +0800 Subject: [PATCH 14/15] chore: remove log --- vscode-cairo/src/statusBar.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/vscode-cairo/src/statusBar.ts b/vscode-cairo/src/statusBar.ts index 23b3f915823..068b332450b 100644 --- a/vscode-cairo/src/statusBar.ts +++ b/vscode-cairo/src/statusBar.ts @@ -43,7 +43,6 @@ export class StatusBar { } private async updateScarbVersion(): Promise { - this.context.log.info("Updating Scarb version"); try { // TODO(mkaput): Support multi-root workspaces. const scarb = await Scarb.find(vscode.workspace.workspaceFolders?.[0], this.context); From daec54963b78e6eaa4f8ef43f8abbef65a900e9a Mon Sep 17 00:00:00 2001 From: Marcus Pang Yu Yang Date: Tue, 22 Oct 2024 16:55:10 +0800 Subject: [PATCH 15/15] refactor: move status bar creation out of static method --- vscode-cairo/src/context.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/vscode-cairo/src/context.ts b/vscode-cairo/src/context.ts index 742edadcf10..527397f9015 100644 --- a/vscode-cairo/src/context.ts +++ b/vscode-cairo/src/context.ts @@ -13,17 +13,16 @@ export class Context { extensionContext.subscriptions.push(log); - const context = new Context(extensionContext, log); - context.statusBar = new StatusBar(context); - - return context; + return new Context(extensionContext, log); } public readonly config: Config = new Config(); - public statusBar!: StatusBar; + public readonly statusBar: StatusBar; private constructor( public readonly extension: vscode.ExtensionContext, public readonly log: RootLogOutputChannel, - ) {} + ) { + this.statusBar = new StatusBar(this); + } }