diff --git a/package.json b/package.json index 3562555..4d8974d 100644 --- a/package.json +++ b/package.json @@ -99,6 +99,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, @@ -256,6 +267,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/extension.ts b/src/extension.ts index b0524fc..8a052ca 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -246,14 +246,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(); } }), @@ -264,9 +261,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); @@ -275,7 +270,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 c8e297a..c964a69 100644 --- a/src/lsp/common.ts +++ b/src/lsp/common.ts @@ -1,24 +1,29 @@ import * as vscode from "vscode"; import { LanguageServerClient } from "./index.js"; -import { LanguageServer } from "../types.js"; +import { LanguageServer, SettingsKey } from "../types.js"; import { MesonLSPLanguageClient } from "./mesonlsp.js"; +import { MuonLanguageClient } from "./muon.js"; import { Uri } from "vscode"; +import { extensionConfiguration } from "../utils.js"; export function serverToClass(server: LanguageServer): any { switch (server) { case "Swift-MesonLSP": case "mesonlsp": return MesonLSPLanguageClient; + case "muon": + return MuonLanguageClient; default: return null; } } 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; diff --git a/src/lsp/index.ts b/src/lsp/index.ts index 53cf0e3..2179e71 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, diff --git a/src/lsp/muon.ts b/src/lsp/muon.ts new file mode 100644 index 0000000..24a25ec --- /dev/null +++ b/src/lsp/muon.ts @@ -0,0 +1,24 @@ +import * as vscode from "vscode"; + +import type { Executable } from "vscode-languageclient/node.js"; +import { LanguageServerClient } from "../lsp/index.js"; + +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 1307af1..cc2974c 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";