| import * as vscode from 'vscode'; |
| import * as vscodelc from 'vscode-languageclient/node'; |
| |
| // Global object to dispose of previous language clients. |
| let client: undefined | vscodelc.LanguageClient = undefined; |
| |
| function initLanguageClient() { |
| const config = vscode.workspace.getConfiguration('verible'); |
| const binary_path: string = config.get('path') as string; |
| |
| const clangd: vscodelc.Executable = { |
| command: binary_path |
| }; |
| |
| const serverOptions: vscodelc.ServerOptions = clangd; |
| |
| // Options to control the language client |
| const clientOptions: vscodelc.LanguageClientOptions = { |
| // Register the server for plain text documents |
| documentSelector: [{ scheme: 'file', language: 'system-verilog' }] |
| }; |
| |
| // Create the language client and start the client. |
| client = new vscodelc.LanguageClient( |
| 'verible', |
| 'Verible Language Server', |
| serverOptions, |
| clientOptions |
| ); |
| client.start(); |
| } |
| |
| // VSCode entrypoint to bootstrap an extension |
| export function activate(_: vscode.ExtensionContext) { |
| // If a configuration change even it fired, let's dispose |
| // of the previous client and create a new one. |
| vscode.workspace.onDidChangeConfiguration((event) => { |
| if (!event.affectsConfiguration('verible')) { |
| return; |
| } |
| if (!client) { |
| return initLanguageClient(); |
| } |
| client.stop().finally(() => { |
| initLanguageClient(); |
| }); |
| }); |
| return initLanguageClient(); |
| } |
| |
| // Entrypoint to tear it down. |
| export function deactivate(): Thenable<void> | undefined { |
| if (!client) { |
| return undefined; |
| } |
| return client.stop(); |
| } |