55 lines
1.7 KiB
JavaScript
55 lines
1.7 KiB
JavaScript
// @ts-check
|
|
"use strict";
|
|
|
|
const path = require("node:path");
|
|
const vscode = require("vscode");
|
|
const { LanguageClient, TransportKind } = require("vscode-languageclient/node");
|
|
|
|
const WRN_LANGUAGE_ID = "wrn";
|
|
/** @type {LanguageClient | undefined} */
|
|
let client;
|
|
|
|
/** @param {vscode.TextDocument} document */
|
|
async function recoverWrnLanguage(document) {
|
|
if (!document.fileName.toLowerCase().endsWith(".wrn")) return;
|
|
if (!["plaintext", "wrn"].includes(document.languageId)) return;
|
|
try {
|
|
await vscode.languages.setTextDocumentLanguage(document, WRN_LANGUAGE_ID);
|
|
} catch (error) {
|
|
console.warn(
|
|
"[wrnexus] unable to recover .wrn language association:",
|
|
error instanceof Error ? error.message : String(error),
|
|
);
|
|
}
|
|
}
|
|
|
|
/** @param {vscode.ExtensionContext} context */
|
|
async function activate(context) {
|
|
for (const document of vscode.workspace.textDocuments) void recoverWrnLanguage(document);
|
|
context.subscriptions.push(
|
|
vscode.workspace.onDidOpenTextDocument((document) => void recoverWrnLanguage(document)),
|
|
);
|
|
|
|
if (!vscode.workspace.getConfiguration("wrnexus").get("languageServer.enable", true)) return;
|
|
|
|
const module = path.join(context.extensionPath, "src", "language-server.cjs");
|
|
client = new LanguageClient(
|
|
"wrnexusLanguageServer",
|
|
"WRNexus Language Server",
|
|
{
|
|
run: { module, transport: TransportKind.stdio },
|
|
debug: { module, transport: TransportKind.stdio, options: { execArgv: ["--nolazy"] } },
|
|
},
|
|
{ documentSelector: [{ scheme: "file", language: WRN_LANGUAGE_ID }] },
|
|
);
|
|
await client.start();
|
|
}
|
|
|
|
async function deactivate() {
|
|
const running = client;
|
|
client = undefined;
|
|
if (running) await running.stop();
|
|
}
|
|
|
|
module.exports = { activate, deactivate, recoverWrnLanguage };
|