Skip to content

Commit 9a97b7b

Browse files
authored
Deselect current db when the language context changes (#3007)
1 parent 3f83027 commit 9a97b7b

File tree

3 files changed

+38
-10
lines changed

3 files changed

+38
-10
lines changed

extensions/ql-vscode/src/databases/local-databases/database-manager.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ import {
1919
getFirstWorkspaceFolder,
2020
isFolderAlreadyInWorkspace,
2121
} from "../../common/vscode/workspace-folders";
22-
import { isQueryLanguage } from "../../common/query-language";
22+
import {
23+
isQueryLanguage,
24+
tryGetQueryLanguage,
25+
} from "../../common/query-language";
2326
import { existsSync } from "fs";
2427
import { QlPackGenerator } from "../../local-queries/qlpack-generator";
2528
import { asError, getErrorMessage } from "../../common/helpers-pure";
@@ -30,6 +33,7 @@ import { containsPath } from "../../common/files";
3033
import { DatabaseChangedEvent, DatabaseEventKind } from "./database-events";
3134
import { DatabaseResolver } from "./database-resolver";
3235
import { telemetryListener } from "../../common/vscode/telemetry";
36+
import { LanguageContextStore } from "../../language-context-store";
3337

3438
/**
3539
* The name of the key in the workspaceState dictionary in which we
@@ -100,11 +104,25 @@ export class DatabaseManager extends DisposableObject {
100104
private readonly app: App,
101105
private readonly qs: QueryRunner,
102106
private readonly cli: cli.CodeQLCliServer,
107+
private readonly languageContext: LanguageContextStore,
103108
public logger: Logger,
104109
) {
105110
super();
106111

107112
qs.onStart(this.reregisterDatabases.bind(this));
113+
114+
this.push(
115+
this.languageContext.onLanguageContextChanged(async () => {
116+
if (
117+
this.currentDatabaseItem !== undefined &&
118+
!this.languageContext.isSelectedLanguage(
119+
tryGetQueryLanguage(this.currentDatabaseItem.language),
120+
)
121+
) {
122+
await this.setCurrentDatabaseItem(undefined);
123+
}
124+
}),
125+
);
108126
}
109127

110128
/**

extensions/ql-vscode/src/extension.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -769,21 +769,28 @@ async function activateWithInstalledDistribution(
769769
fsWatcher.onDidDelete(clearPackCache);
770770
}
771771

772-
void extLogger.log("Initializing database manager.");
773-
const dbm = new DatabaseManager(ctx, app, qs, cliServer, extLogger);
774-
775-
// Let this run async.
776-
void dbm.loadPersistedState();
777-
778-
ctx.subscriptions.push(dbm);
779-
780772
void extLogger.log("Initializing language context.");
781773
const languageContext = new LanguageContextStore(app);
782774

783775
void extLogger.log("Initializing language selector.");
784776
const languageSelectionPanel = new LanguageSelectionPanel(languageContext);
785777
ctx.subscriptions.push(languageSelectionPanel);
786778

779+
void extLogger.log("Initializing database manager.");
780+
const dbm = new DatabaseManager(
781+
ctx,
782+
app,
783+
qs,
784+
cliServer,
785+
languageContext,
786+
extLogger,
787+
);
788+
789+
// Let this run async.
790+
void dbm.loadPersistedState();
791+
792+
ctx.subscriptions.push(dbm);
793+
787794
void extLogger.log("Initializing database panel.");
788795
const databaseUI = new DatabaseUI(
789796
app,

extensions/ql-vscode/test/vscode-tests/minimal-workspace/local-queries/local-databases.test.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import {
3131
sourceLocationUri,
3232
} from "../../../factories/databases/databases";
3333
import { findSourceArchive } from "../../../../src/databases/local-databases/database-resolver";
34+
import { LanguageContextStore } from "../../../../src/language-context-store";
3435

3536
describe("local databases", () => {
3637
let databaseManager: DatabaseManager;
@@ -84,9 +85,10 @@ describe("local databases", () => {
8485
},
8586
);
8687

88+
const mockApp = createMockApp({});
8789
databaseManager = new DatabaseManager(
8890
extensionContext,
89-
createMockApp({}),
91+
mockApp,
9092
mockedObject<QueryRunner>({
9193
registerDatabase: registerSpy,
9294
deregisterDatabase: deregisterSpy,
@@ -98,6 +100,7 @@ describe("local databases", () => {
98100
resolveDatabase: resolveDatabaseSpy,
99101
packAdd: packAddSpy,
100102
}),
103+
new LanguageContextStore(mockApp),
101104
mockedObject<Logger>({
102105
log: logSpy,
103106
}),

0 commit comments

Comments
 (0)