From 6d143bb4909ac293108bff98f1374fd35426b44d Mon Sep 17 00:00:00 2001 From: Stone Tickle Date: Fri, 14 Mar 2025 10:37:17 -0400 Subject: [PATCH 1/4] add muon as an available language server --- package.json | 1 + src/lsp/common.ts | 3 +++ src/lsp/muon.ts | 24 ++++++++++++++++++++++++ src/types.ts | 2 +- 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/lsp/muon.ts diff --git a/package.json b/package.json index f597456..0e71fe8 100644 --- a/package.json +++ b/package.json @@ -255,6 +255,7 @@ "enum": [ "Swift-MesonLSP", "mesonlsp", + "muon", null ], "description": "Select which language server to use. Swift-MesonLSP is a legacy alias for mesonlsp." diff --git a/src/lsp/common.ts b/src/lsp/common.ts index 0ee66f3..98cb81c 100644 --- a/src/lsp/common.ts +++ b/src/lsp/common.ts @@ -2,6 +2,7 @@ import * as vscode from "vscode"; import { LanguageServerClient } from "."; import { LanguageServer } from "../types"; import { MesonLSPLanguageClient } from "./mesonlsp"; +import { MuonLanguageClient } from "./muon"; import { Uri } from "vscode"; export function serverToClass(server: LanguageServer): any { @@ -9,6 +10,8 @@ export function serverToClass(server: LanguageServer): any { case "Swift-MesonLSP": case "mesonlsp": return MesonLSPLanguageClient; + case "muon": + return MuonLanguageClient; default: return null; } diff --git a/src/lsp/muon.ts b/src/lsp/muon.ts new file mode 100644 index 0000000..a3902cb --- /dev/null +++ b/src/lsp/muon.ts @@ -0,0 +1,24 @@ +import * as vscode from "vscode"; + +import type { Executable } from "vscode-languageclient/node"; +import { LanguageServerClient } from "../lsp"; + +export class MuonLanguageClient extends LanguageServerClient { + get runExe(): Executable { + return { + command: this.languageServerPath!.fsPath, + args: ["analyze", "lsp"], + }; + } + + get debugExe(): Executable { + return { + command: this.languageServerPath!.fsPath, + args: ["analyze", "lsp"], + }; + } + + constructor(languageServerPath: vscode.Uri, context: vscode.ExtensionContext, referenceVersion: string) { + super("muon", languageServerPath, context, referenceVersion); + } +} diff --git a/src/types.ts b/src/types.ts index dd340e5..c27f97d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -60,7 +60,7 @@ export type LinterConfiguration = { enabled: boolean; }; -export type LanguageServer = "Swift-MesonLSP" | "mesonlsp" | null; +export type LanguageServer = "Swift-MesonLSP" | "mesonlsp" | "muon" | null; export type ModifiableExtension = "ms-vscode.cpptools" | "rust-lang.rust-analyzer"; export type FormattingProvider = "muon" | "meson"; From 87c2585f4cdce9f7ee5dcccabbe1ebfcf89e972c Mon Sep 17 00:00:00 2001 From: Stone Tickle Date: Fri, 14 Mar 2025 10:39:47 -0400 Subject: [PATCH 2/4] fix language server trace output channel --- src/lsp/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lsp/index.ts b/src/lsp/index.ts index 60ccb83..3b82244 100644 --- a/src/lsp/index.ts +++ b/src/lsp/index.ts @@ -203,7 +203,7 @@ export abstract class LanguageServerClient { const options = LanguageServerClient.clientOptions; options.initializationOptions = vscode.workspace.getConfiguration(`mesonbuild.${this.server}`); this.ls = new LanguageClient( - this.server!, + "mesonbuild", `Meson Language Server (${this.server})`, serverOptions, LanguageServerClient.clientOptions, From d7727375688e6cd834db558360c322d1e05270f5 Mon Sep 17 00:00:00 2001 From: Stone Tickle Date: Fri, 14 Mar 2025 10:40:51 -0400 Subject: [PATCH 3/4] allow lsp server to be changed dynamically The current server is now queried inside the createLanguageServerClient function rather than once at startup. --- src/extension.ts | 15 +++++---------- src/lsp/common.ts | 6 ++++-- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/extension.ts b/src/extension.ts index af77dec..6850add 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -239,14 +239,11 @@ export async function activate(ctx: vscode.ExtensionContext) { await regenerateTests(controller); } - const server = extensionConfiguration(SettingsKey.languageServer); - let client = await createLanguageServerClient(server, await askShouldDownloadLanguageServer(), ctx); - // Basically every server supports formatting... - const serverSupportsFormatting = server == "mesonlsp" || server == "Swift-MesonLSP"; - if (client !== null && serverSupportsFormatting) { + let client = await createLanguageServerClient(await askShouldDownloadLanguageServer(), ctx); + if (client !== null) { ctx.subscriptions.push( vscode.workspace.onDidChangeConfiguration((e) => { - if (e.affectsConfiguration(`mesonbuild.${server}`)) { + if (e.affectsConfiguration(`mesonbuild.${client!.server}`)) { client?.reloadConfig(); } }), @@ -257,9 +254,7 @@ export async function activate(ctx: vscode.ExtensionContext) { client.start(); await client.reloadConfig(); - getOutputChannel().appendLine( - "Not enabling the muon linter/formatter because a language server supporting formatting is active.", - ); + getOutputChannel().appendLine("Linters and formatters disabled because a language server is active."); } else { activateLinters(sourceDir, ctx); activateFormatters(sourceDir, ctx); @@ -268,7 +263,7 @@ export async function activate(ctx: vscode.ExtensionContext) { ctx.subscriptions.push( vscode.commands.registerCommand("mesonbuild.restartLanguageServer", async () => { if (client === null) { - client = await createLanguageServerClient(server, await askShouldDownloadLanguageServer(), ctx); + client = await createLanguageServerClient(await askShouldDownloadLanguageServer(), ctx); if (client !== null) { ctx.subscriptions.push(client); client.start(); diff --git a/src/lsp/common.ts b/src/lsp/common.ts index 98cb81c..596e9d3 100644 --- a/src/lsp/common.ts +++ b/src/lsp/common.ts @@ -1,9 +1,10 @@ import * as vscode from "vscode"; import { LanguageServerClient } from "."; -import { LanguageServer } from "../types"; +import { LanguageServer, SettingsKey } from "../types"; import { MesonLSPLanguageClient } from "./mesonlsp"; import { MuonLanguageClient } from "./muon"; import { Uri } from "vscode"; +import { extensionConfiguration } from "../utils"; export function serverToClass(server: LanguageServer): any { switch (server) { @@ -18,10 +19,11 @@ export function serverToClass(server: LanguageServer): any { } export async function createLanguageServerClient( - server: LanguageServer, download: boolean, context: vscode.ExtensionContext, ): Promise { + const server = extensionConfiguration(SettingsKey.languageServer); + const klass = serverToClass(server); if (klass == null) { return null; From 03447991bc005b914ad83cf6e9716d1102ddca3a Mon Sep 17 00:00:00 2001 From: Stone Tickle Date: Fri, 14 Mar 2025 10:42:37 -0400 Subject: [PATCH 4/4] add config option to enable lsp traces --- package.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/package.json b/package.json index 0e71fe8..64349e3 100644 --- a/package.json +++ b/package.json @@ -98,6 +98,17 @@ "configuration": { "title": "Meson build configuration", "properties": { + "mesonbuild.trace.server": { + "type": "string", + "default": "off", + "scope": "window", + "enum": [ + "off", + "messages", + "verbose" + ], + "description": "Traces the communication between VS Code and the current Meson language server." + }, "mesonbuild.selectRootDir": { "type": "boolean", "default": true,