1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
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(); }));
}
}
|