blob: b8a71b97e1656dfb0956a8ffda88ed23f749c5ca [file] [log] [blame]
import * as vscode from 'vscode';
import * as vscodelc from 'vscode-languageclient';
import * as config from './config';
import * as configWatcher from './configWatcher';
/**
* This class manages all of the MLIR extension state,
* including the language client.
*/
export class MLIRContext implements vscode.Disposable {
subscriptions: vscode.Disposable[] = [];
client!: vscodelc.LanguageClient;
/**
* Activate the MLIR context, and start the language client.
*/
async activate(outputChannel: vscode.OutputChannel) {
// Get the path of the mlir-lsp-server that is used to provide language
// functionality.
const userDefinedServerPath = config.get<string>('server_path');
const serverPath = (userDefinedServerPath === '') ? 'mlir-lsp-server'
: userDefinedServerPath;
// Configure the server options.
const serverOptions: vscodelc.ServerOptions = {
run : {
command : serverPath,
transport : vscodelc.TransportKind.stdio,
args : []
},
debug : {
command : serverPath,
transport : vscodelc.TransportKind.stdio,
args : []
}
};
// Configure the client options.
const clientOptions: vscodelc.LanguageClientOptions = {
documentSelector : [ {scheme : 'file', language : 'mlir'} ],
synchronize : {
// Notify the server about file changes to *.mlir files contained in the
// workspace.
fileEvents : vscode.workspace.createFileSystemWatcher('**/*.mlir')
},
outputChannel : outputChannel,
};
// Create the language client and start the client.
this.client = new vscodelc.LanguageClient(
'mlir-lsp', 'MLIR Language Client', serverOptions, clientOptions);
this.subscriptions.push(this.client.start());
// Watch for configuration changes.
configWatcher.activate(this);
}
dispose() {
this.subscriptions.forEach((d) => { d.dispose(); });
this.subscriptions = [];
}
}