diff --git a/extensions/ql-vscode/src/extension.ts b/extensions/ql-vscode/src/extension.ts index dd33e00fb..08135dec5 100644 --- a/extensions/ql-vscode/src/extension.ts +++ b/extensions/ql-vscode/src/extension.ts @@ -177,7 +177,13 @@ function getCommands( cliServer.restartCliServer(); await Promise.all([ queryRunner.restartQueryServer(progress, token), - ideServer.restart(), + async () => { + if (ideServer.isRunning()) { + await ideServer.restart(); + } else { + await ideServer.start(); + } + }, ]); void showAndLogInformationMessage("CodeQL Query Server restarted.", { outputLogger: queryServerLogger, diff --git a/extensions/ql-vscode/src/json-rpc-server.ts b/extensions/ql-vscode/src/json-rpc-server.ts index d6f7db2c8..88f656b54 100644 --- a/extensions/ql-vscode/src/json-rpc-server.ts +++ b/extensions/ql-vscode/src/json-rpc-server.ts @@ -23,6 +23,7 @@ export class ServerProcess implements Disposable { dispose(): void { void this.logger.log(`Stopping ${this.name}...`); this.connection.dispose(); + this.connection.end(); this.child.stdin!.end(); this.child.stderr!.destroy(); // TODO kill the process if it doesn't terminate after a certain time limit. diff --git a/extensions/ql-vscode/src/local-databases.ts b/extensions/ql-vscode/src/local-databases.ts index 6cfec5874..9b0b35bd8 100644 --- a/extensions/ql-vscode/src/local-databases.ts +++ b/extensions/ql-vscode/src/local-databases.ts @@ -1029,7 +1029,19 @@ export class DatabaseManager extends DisposableObject { token: vscode.CancellationToken, dbItem: DatabaseItem, ) { - await this.qs.deregisterDatabase(progress, token, dbItem); + try { + await this.qs.deregisterDatabase(progress, token, dbItem); + } catch (e) { + const message = getErrorMessage(e); + if (message === "Connection is disposed.") { + // This is expected if the query server is not running. + void extLogger.log( + `Could not de-register database '${dbItem.name}' because query server is not running.`, + ); + return; + } + throw e; + } } private async registerDatabase( progress: ProgressCallback, diff --git a/extensions/ql-vscode/src/query-server/queryserver-client.ts b/extensions/ql-vscode/src/query-server/queryserver-client.ts index e992d323e..1c84482a8 100644 --- a/extensions/ql-vscode/src/query-server/queryserver-client.ts +++ b/extensions/ql-vscode/src/query-server/queryserver-client.ts @@ -1,6 +1,6 @@ import { ensureFile } from "fs-extra"; -import { DisposableObject } from "../pure/disposable-object"; +import { DisposableObject, DisposeHandler } from "../pure/disposable-object"; import { CancellationToken } from "vscode"; import { createMessageConnection, RequestType } from "vscode-jsonrpc/node"; import * as cli from "../cli"; @@ -224,4 +224,10 @@ export class QueryServerClient extends DisposableObject { delete this.progressCallbacks[id]; } } + + public dispose(disposeHandler?: DisposeHandler | undefined): void { + this.progressCallbacks = {}; + this.stopQueryServer(); + super.dispose(disposeHandler); + } }