oxc/editor/vscode/client/extension.ts
2023-11-05 15:03:22 +08:00

121 lines
3 KiB
TypeScript

import {
ExtensionContext,
window,
commands,
workspace,
} from "vscode";
import {
Executable,
LanguageClient,
LanguageClientOptions,
ServerOptions,
} from "vscode-languageclient/node";
import { join } from 'node:path'
const languageClientId = 'oxc-client';
const languageClientName = 'oxc';
const outputChannelName = 'oxc';
const traceOutputChannelName = 'oxc.trace';
const enum OxcCommands {
RestartServer = "oxc.restartServer",
ApplyAllFixes = "oxc.applyAllFixes",
ShowOutputChannel = "oxc.showOutputChannel",
ShowTraceOutputChannel = "oxc.showTraceOutputChannel"
};
let client: LanguageClient;
export async function activate(context: ExtensionContext) {
const restartCommand = commands.registerCommand(OxcCommands.RestartServer, async () => {
if(!client) {
window.showErrorMessage("oxc client not found");
return
}
try {
if (client.isRunning()) {
await client.restart();
window.showInformationMessage("oxc server restarted.");
} else {
await client.start();
}
} catch (err) {
client.error("Restarting client failed", err, "force");
}
})
const showOutputCommand = commands.registerCommand(OxcCommands.ShowOutputChannel, () => {
client?.outputChannel?.show()
})
const showTraceOutputCommand = commands.registerCommand(OxcCommands.ShowTraceOutputChannel, () => {
client?.traceOutputChannel?.show()
})
context.subscriptions.push(
restartCommand,
showOutputCommand,
showTraceOutputCommand
);
const outputChannel = window.createOutputChannel(outputChannelName);
const traceOutputChannel = window.createOutputChannel(traceOutputChannelName);
const ext = process.platform === "win32" ? ".exe" : "";
const command = join(context.extensionPath, `./target/release/oxc_vscode${ext}`);
// window.showInformationMessage(`oxc server path: ${command}`);
const run: Executable = {
command: command!,
options: {
env: {
...process.env,
RUST_LOG: 'debug',
},
},
};
const serverOptions: ServerOptions = {
run,
debug: run,
};
// If the extension is launched in debug mode then the debug server options are used
// Otherwise the run options are used
// Options to control the language client
let clientOptions: LanguageClientOptions = {
// Register the server for plain text documents
documentSelector: [
"typescript",
"javascript",
"typescriptreact",
"javascriptreact",
].map(lang => ({ language: lang, scheme: "file" })),
synchronize: {
// Notify the server about file changes to '.clientrc files contained in the workspace
fileEvents: workspace.createFileSystemWatcher("**/.clientrc"),
},
outputChannel,
traceOutputChannel,
};
// Create the language client and start the client.
client = new LanguageClient(languageClientId, languageClientName, serverOptions, clientOptions);
client.start();
}
export function deactivate(): Thenable<void> | undefined {
if (!client) {
return undefined;
}
return client.stop();
}