-
Notifications
You must be signed in to change notification settings - Fork 29
/
Copy pathextension.ts
115 lines (104 loc) · 4.7 KB
/
extension.ts
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
import * as vscode from 'vscode';
import { LanguageClient } from 'vscode-languageclient/node';
import { registerLogger, traceError, traceLog, traceVerbose } from './common/logging';
import { initializePython, onDidChangePythonInterpreter } from './common/python';
import { restartServer } from './common/server';
import { checkIfConfigurationChanged, getWorkspaceSettings, logLegacySettings } from './common/settings';
import { loadServerDefaults } from './common/setup';
import { getInterpreterFromSetting, getLSClientTraceLevel, getProjectRoot } from './common/utilities';
import { createOutputChannel, onDidChangeConfiguration, registerCommand } from './common/vscodeapi';
import { registerLanguageStatusItem, updateStatus } from './common/status';
import { LS_SERVER_RESTART_DELAY, PYTHON_VERSION } from './common/constants';
let lsClient: LanguageClient | undefined;
export async function activate(context: vscode.ExtensionContext): Promise<void> {
// This is required to get server name and module. This should be
// the first thing that we do in this extension.
const serverInfo = loadServerDefaults();
const serverName = `${serverInfo.name} Type Checker`;
const serverId = `${serverInfo.module}-type-checker`;
// Setup logging
const outputChannel = createOutputChannel(serverName);
context.subscriptions.push(outputChannel, registerLogger(outputChannel));
const changeLogLevel = async (c: vscode.LogLevel, g: vscode.LogLevel) => {
const level = getLSClientTraceLevel(c, g);
await lsClient?.setTrace(level);
};
context.subscriptions.push(
outputChannel.onDidChangeLogLevel(async (e) => {
await changeLogLevel(e, vscode.env.logLevel);
}),
vscode.env.onDidChangeLogLevel(async (e) => {
await changeLogLevel(outputChannel.logLevel, e);
}),
);
traceLog(`Name: ${serverName}`);
traceLog(`Module: ${serverInfo.module}`);
traceVerbose(`Configuration: ${JSON.stringify(serverInfo)}`);
let isRestarting = false;
let restartTimer: NodeJS.Timeout | undefined;
const runServer = async () => {
if (isRestarting) {
if (restartTimer) {
clearTimeout(restartTimer);
}
restartTimer = setTimeout(runServer, LS_SERVER_RESTART_DELAY);
return;
}
isRestarting = true;
try {
const projectRoot = await getProjectRoot();
const workspaceSetting = await getWorkspaceSettings(serverId, projectRoot, true);
if (workspaceSetting.interpreter.length === 0) {
updateStatus(vscode.l10n.t('Please select a Python interpreter.'), vscode.LanguageStatusSeverity.Error);
traceError(
'Python interpreter missing:\r\n' +
'[Option 1] Select python interpreter using the ms-python.python (select interpreter command).\r\n' +
`[Option 2] Set an interpreter using "${serverId}.interpreter" setting.\r\n`,
`Please use Python ${PYTHON_VERSION} or greater.`,
);
} else {
lsClient = await restartServer(workspaceSetting, serverId, serverName, outputChannel, lsClient);
}
} finally {
isRestarting = false;
}
};
context.subscriptions.push(
onDidChangePythonInterpreter(async () => {
await runServer();
}),
registerCommand(`${serverId}.showLogs`, async () => {
outputChannel.show();
}),
registerCommand(`${serverId}.restart`, async () => {
await runServer();
}),
onDidChangeConfiguration(async (e: vscode.ConfigurationChangeEvent) => {
if (checkIfConfigurationChanged(e, serverId)) {
await runServer();
}
}),
registerLanguageStatusItem(serverId, serverName, `${serverId}.showLogs`),
);
// This is needed to inform users that they might have some legacy settings that
// are no longer supported. Instructions are printed in the output channel on how
// to update them.
logLegacySettings(serverId);
setImmediate(async () => {
const interpreter = getInterpreterFromSetting(serverId);
if (interpreter === undefined || interpreter.length === 0) {
traceLog(`Python extension loading`);
await initializePython(context.subscriptions);
traceLog(`Python extension loaded`);
} else {
await runServer();
}
});
}
export async function deactivate(): Promise<void> {
if (lsClient) {
await lsClient.stop();
}
}