Skip to content

Commit aa89748

Browse files
Restore client in extension.ts (#218)
## Summary In #194, we stopped setting the `client` returned by the `clientPromise`. As a result, the "Fix all" action stopped working, since it relies on the `client`. Closes #194.
1 parent 66e5b12 commit aa89748

3 files changed

Lines changed: 27 additions & 31 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"lint": "eslint src --ext ts",
4949
"typecheck": "tsc --noEmit",
5050
"package": "webpack --mode production --devtool source-map --config ./webpack.config.js",
51+
"watch": "webpack --watch",
5152
"vsce-package": "vsce package -o ruff.vsix",
5253
"vscode:prepublish": "npm run package"
5354
},

src/common/server.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,11 @@ export async function restartServer(
112112
serverId: string,
113113
serverName: string,
114114
outputChannel: OutputChannel,
115-
lsClient?: LanguageClient,
115+
client?: LanguageClient,
116116
): Promise<LanguageClient | undefined> {
117-
if (lsClient) {
117+
if (client) {
118118
traceInfo(`Server: Stop requested`);
119-
await lsClient.stop();
119+
await client.stop();
120120
_disposables.forEach((d) => d.dispose());
121121
_disposables = [];
122122
}
@@ -132,7 +132,7 @@ export async function restartServer(
132132
return undefined;
133133
}
134134

135-
const newLSClient = await createServer(
135+
const newClient = await createServer(
136136
resourceSettings.interpreter,
137137
serverId,
138138
serverName,
@@ -144,10 +144,10 @@ export async function restartServer(
144144
resourceSettings,
145145
);
146146

147-
newLSClient.trace = traceLevelToLSTrace(resourceSettings.logLevel);
147+
newClient.trace = traceLevelToLSTrace(resourceSettings.logLevel);
148148
traceInfo(`Server: Start requested.`);
149149
_disposables.push(
150-
newLSClient.onDidChangeState((e) => {
150+
newClient.onDidChangeState((e) => {
151151
switch (e.newState) {
152152
case State.Stopped:
153153
traceVerbose(`Server State: Stopped`);
@@ -160,7 +160,7 @@ export async function restartServer(
160160
break;
161161
}
162162
}),
163-
newLSClient.start(),
163+
newClient.start(),
164164
);
165-
return newLSClient;
165+
return newClient;
166166
}

src/extension.ts

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import { createOutputChannel, onDidChangeConfiguration, registerCommand } from "
1717
const issueTracker = "https://github.com/charliermarsh/ruff/issues";
1818

1919
let client: LanguageClient | undefined;
20-
let clientPromise: Promise<LanguageClient | undefined> | undefined = undefined;
21-
let isNewRestartQueued = false;
20+
let restartInProgress = false;
21+
let restartQueued = false;
2222

2323
export async function activate(context: vscode.ExtensionContext): Promise<void> {
2424
// This is required to get server name and module. This should be
@@ -37,31 +37,26 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
3737
traceVerbose(`Configuration: ${JSON.stringify(serverInfo)}`);
3838

3939
const runServer = async () => {
40-
if (clientPromise != null) {
41-
traceLog(
42-
`Triggered ${serverName} restart while restart already in progress, queuing another restart`,
43-
);
44-
if (!isNewRestartQueued) {
45-
// Schedule a new restart after the current one, but also make it so that there is one restart queue at a time,
46-
// this restart will have the latest settings anyway.
47-
isNewRestartQueued = true;
48-
try {
49-
await clientPromise;
50-
} catch {
51-
// We don't care whether this failed, we'll restart afterward anyway.
52-
}
53-
} else {
54-
// In this case, we're currently restarting and a new restart is also queued, so we just do nothing and
55-
// let the other restart handle this
40+
if (restartInProgress) {
41+
if (!restartQueued) {
42+
// Schedule a new restart after the current restart.
5643
traceLog(
57-
`Triggered ${serverName} restart while restart already in progress and another already queued, doing nothing`,
44+
`Triggered ${serverName} restart while restart is in progress; queuing a restart.`,
5845
);
59-
return;
46+
restartQueued = true;
6047
}
48+
return;
49+
}
50+
51+
restartInProgress = true;
52+
client = await restartServer(serverId, serverName, outputChannel, client);
53+
54+
restartInProgress = false;
55+
56+
if (restartQueued) {
57+
restartQueued = false;
58+
await runServer();
6159
}
62-
clientPromise = restartServer(serverId, serverName, outputChannel, client);
63-
isNewRestartQueued = false;
64-
await clientPromise;
6560
};
6661

6762
context.subscriptions.push(

0 commit comments

Comments
 (0)