import * as chokidar from 'chokidar';
import * as vscode from 'vscode';
import * as config from './config';
import {MLIRContext} from './mlirContext';
/**
* Prompt the user to see if we should restart the server.
*/
async function promptRestart(settingName: string, promptMessage: string) {
switch (config.get<string>(settingName)) {
case 'restart':
vscode.commands.executeCommand('mlir.restart');
break;
case 'ignore':
break;
case 'prompt':
default:
switch (await vscode.window.showInformationMessage(
promptMessage, 'Yes', 'Yes, always', 'No, never')) {
case 'Yes':
vscode.commands.executeCommand('mlir.restart');
break;
case 'Yes, always':
vscode.commands.executeCommand('mlir.restart');
config.update<string>(settingName, 'restart',
vscode.ConfigurationTarget.Global);
break;
case 'No, never':
config.update<string>(settingName, 'ignore',
vscode.ConfigurationTarget.Global);
break;
default:
break;
}
break;
}
}
/**
* Activate watchers that track configuration changes for the given workspace
* folder, or null if the workspace is top-level.
*/
export async function activate(
mlirContext: MLIRContext, workspaceFolder: vscode.WorkspaceFolder,
serverSettings: string[], serverPaths: string[]) {
// When a configuration change happens, check to see if we should restart the
// server.
mlirContext.subscriptions.push(vscode.workspace.onDidChangeConfiguration(event => {
for (const serverSetting of serverSettings) {
const expandedSetting = `mlir.${serverSetting}`;
if (event.affectsConfiguration(expandedSetting, workspaceFolder)) {
promptRestart(
'onSettingsChanged',
`setting '${
expandedSetting}' has changed. Do you want to reload the server?`);
}
}
}));
// Setup watchers for the provided server paths.
const fileWatcherConfig = {
disableGlobbing : true,
followSymlinks : true,
ignoreInitial : true,
awaitWriteFinish : true,
};
for (const serverPath of serverPaths) {
if (serverPath === '') {
return;
}
// If the server path actually exists, track it in case it changes.
const fileWatcher = chokidar.watch(serverPath, fileWatcherConfig);
fileWatcher.on('all', (event, _filename, _details) => {
if (event != 'unlink') {
promptRestart(
'onSettingsChanged',
'MLIR language server file has changed. Do you want to reload the server?');
}
});
mlirContext.subscriptions.push(
new vscode.Disposable(() => { fileWatcher.close(); }));
}
}