Skip to content

Commit 552a4f6

Browse files
authored
Merge pull request #2873 from github/starcke/language-context-store
Add language context store.
2 parents 493e8d9 + dc632d5 commit 552a4f6

File tree

6 files changed

+92
-31
lines changed

6 files changed

+92
-31
lines changed

extensions/ql-vscode/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1870,11 +1870,11 @@
18701870
"codeQLDatabases.languages": [
18711871
{
18721872
"command": "codeQLDatabases.displayAllLanguages",
1873-
"when": "codeQLDatabases.languageFilter != All"
1873+
"when": "codeQLDatabases.languageFilter"
18741874
},
18751875
{
18761876
"command": "codeQLDatabases.displayAllLanguagesSelected",
1877-
"when": "codeQLDatabases.languageFilter == All"
1877+
"when": "!codeQLDatabases.languageFilter"
18781878
},
18791879
{
18801880
"command": "codeQLDatabases.displayCpp",

extensions/ql-vscode/src/common/query-language.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,9 @@ export const dbSchemeToLanguage: Record<string, QueryLanguage> = {
6262
export function isQueryLanguage(language: string): language is QueryLanguage {
6363
return Object.values(QueryLanguage).includes(language as QueryLanguage);
6464
}
65+
66+
export function tryGetQueryLanguage(
67+
language: string,
68+
): QueryLanguage | undefined {
69+
return isQueryLanguage(language) ? language : undefined;
70+
}

extensions/ql-vscode/src/databases/local-databases-ui.ts

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ import {
5151
createMultiSelectionCommand,
5252
createSingleSelectionCommand,
5353
} from "../common/vscode/selection-commands";
54-
import { QueryLanguage } from "../common/query-language";
54+
import { QueryLanguage, tryGetQueryLanguage } from "../common/query-language";
55+
import { LanguageContextStore } from "../language-context-store";
5556

5657
enum SortOrder {
5758
NameAsc = "NameAsc",
@@ -60,8 +61,6 @@ enum SortOrder {
6061
DateAddedDesc = "DateAddedDesc",
6162
}
6263

63-
type LanguageFilter = QueryLanguage | "All";
64-
6564
/**
6665
* Tree data provider for the databases view.
6766
*/
@@ -70,14 +69,16 @@ class DatabaseTreeDataProvider
7069
implements TreeDataProvider<DatabaseItem>
7170
{
7271
private _sortOrder = SortOrder.NameAsc;
73-
private _languageFilter = "All" as LanguageFilter;
7472

7573
private readonly _onDidChangeTreeData = this.push(
7674
new EventEmitter<DatabaseItem | undefined>(),
7775
);
7876
private currentDatabaseItem: DatabaseItem | undefined;
7977

80-
constructor(private databaseManager: DatabaseManager) {
78+
constructor(
79+
private databaseManager: DatabaseManager,
80+
private languageContext: LanguageContextStore,
81+
) {
8182
super();
8283

8384
this.currentDatabaseItem = databaseManager.currentDatabaseItem;
@@ -92,6 +93,11 @@ class DatabaseTreeDataProvider
9293
this.handleDidChangeCurrentDatabaseItem.bind(this),
9394
),
9495
);
96+
this.push(
97+
this.languageContext.onLanguageContextChanged(async () => {
98+
this._onDidChangeTreeData.fire(undefined);
99+
}),
100+
);
95101
}
96102

97103
public get onDidChangeTreeData(): Event<DatabaseItem | undefined> {
@@ -137,11 +143,9 @@ class DatabaseTreeDataProvider
137143
if (element === undefined) {
138144
// Filter items by language
139145
const displayItems = this.databaseManager.databaseItems.filter((item) => {
140-
if (this.languageFilter === "All") {
141-
return true;
142-
} else {
143-
return item.language === this.languageFilter;
144-
}
146+
return this.languageContext.shouldInclude(
147+
tryGetQueryLanguage(item.language),
148+
);
145149
});
146150

147151
// Sort items
@@ -178,15 +182,6 @@ class DatabaseTreeDataProvider
178182
this._sortOrder = newSortOrder;
179183
this._onDidChangeTreeData.fire(undefined);
180184
}
181-
182-
public get languageFilter() {
183-
return this._languageFilter;
184-
}
185-
186-
public set languageFilter(newLanguageFilter: LanguageFilter) {
187-
this._languageFilter = newLanguageFilter;
188-
this._onDidChangeTreeData.fire(undefined);
189-
}
190185
}
191186

192187
/** Gets the first element in the given list, if any, or undefined if the list is empty or undefined. */
@@ -223,14 +218,15 @@ export class DatabaseUI extends DisposableObject {
223218
public constructor(
224219
private app: App,
225220
private databaseManager: DatabaseManager,
221+
private languageContext: LanguageContextStore,
226222
private readonly queryServer: QueryRunner | undefined,
227223
private readonly storagePath: string,
228224
readonly extensionPath: string,
229225
) {
230226
super();
231227

232228
this.treeDataProvider = this.push(
233-
new DatabaseTreeDataProvider(databaseManager),
229+
new DatabaseTreeDataProvider(databaseManager, languageContext),
234230
);
235231
this.push(
236232
window.createTreeView("codeQLDatabases", {
@@ -269,7 +265,7 @@ export class DatabaseUI extends DisposableObject {
269265
"codeQLDatabases.sortByName": this.handleSortByName.bind(this),
270266
"codeQLDatabases.sortByDateAdded": this.handleSortByDateAdded.bind(this),
271267
"codeQLDatabases.displayAllLanguages":
272-
this.handleChangeLanguageFilter.bind(this, "All"),
268+
this.handleClearLanguageFilter.bind(this),
273269
"codeQLDatabases.displayCpp": this.handleChangeLanguageFilter.bind(
274270
this,
275271
QueryLanguage.Cpp,
@@ -303,7 +299,7 @@ export class DatabaseUI extends DisposableObject {
303299
QueryLanguage.Swift,
304300
),
305301
"codeQLDatabases.displayAllLanguagesSelected":
306-
this.handleChangeLanguageFilter.bind(this, "All"),
302+
this.handleClearLanguageFilter.bind(this),
307303
"codeQLDatabases.displayCppSelected":
308304
this.handleChangeLanguageFilter.bind(this, QueryLanguage.Cpp),
309305
"codeQLDatabases.displayCsharpSelected":
@@ -612,13 +608,12 @@ export class DatabaseUI extends DisposableObject {
612608
}
613609
}
614610

615-
private async handleChangeLanguageFilter(languageFilter: LanguageFilter) {
616-
this.treeDataProvider.languageFilter = languageFilter;
617-
await this.app.commands.execute(
618-
"setContext",
619-
"codeQLDatabases.languageFilter",
620-
languageFilter,
621-
);
611+
private async handleClearLanguageFilter() {
612+
await this.languageContext.clearLanguageContext();
613+
}
614+
615+
private async handleChangeLanguageFilter(languageFilter: QueryLanguage) {
616+
await this.languageContext.setLanguageContext(languageFilter);
622617
}
623618

624619
private async handleUpgradeCurrentDatabase(): Promise<void> {

extensions/ql-vscode/src/extension.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ import { TestManagerBase } from "./query-testing/test-manager-base";
135135
import { NewQueryRunner, QueryRunner, QueryServerClient } from "./query-server";
136136
import { QueriesModule } from "./queries-panel/queries-module";
137137
import { OpenReferencedFileCodeLensProvider } from "./local-queries/open-referenced-file-code-lens-provider";
138+
import { LanguageContextStore } from "./language-context-store";
138139

139140
/**
140141
* extension.ts
@@ -774,10 +775,15 @@ async function activateWithInstalledDistribution(
774775
void dbm.loadPersistedState();
775776

776777
ctx.subscriptions.push(dbm);
778+
779+
void extLogger.log("Initializing language context.");
780+
const languageContext = new LanguageContextStore(app);
781+
777782
void extLogger.log("Initializing database panel.");
778783
const databaseUI = new DatabaseUI(
779784
app,
780785
dbm,
786+
languageContext,
781787
qs,
782788
getContextStoragePath(ctx),
783789
ctx.extensionPath,
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { App } from "./common/app";
2+
import { DisposableObject } from "./common/disposable-object";
3+
import { AppEvent, AppEventEmitter } from "./common/events";
4+
import { QueryLanguage } from "./common/query-language";
5+
6+
type LanguageFilter = QueryLanguage | "All";
7+
8+
export class LanguageContextStore extends DisposableObject {
9+
public readonly onLanguageContextChanged: AppEvent<void>;
10+
private readonly onLanguageContextChangedEmitter: AppEventEmitter<void>;
11+
12+
private languageFilter: LanguageFilter;
13+
14+
constructor(private readonly app: App) {
15+
super();
16+
// State initialization
17+
this.languageFilter = "All";
18+
19+
// Set up event emitters
20+
this.onLanguageContextChangedEmitter = this.push(
21+
app.createEventEmitter<void>(),
22+
);
23+
this.onLanguageContextChanged = this.onLanguageContextChangedEmitter.event;
24+
}
25+
26+
public async clearLanguageContext() {
27+
this.languageFilter = "All";
28+
this.onLanguageContextChangedEmitter.fire();
29+
await this.app.commands.execute(
30+
"setContext",
31+
"codeQLDatabases.languageFilter",
32+
"",
33+
);
34+
}
35+
36+
public async setLanguageContext(language: QueryLanguage) {
37+
this.languageFilter = language;
38+
this.onLanguageContextChangedEmitter.fire();
39+
await this.app.commands.execute(
40+
"setContext",
41+
"codeQLDatabases.languageFilter",
42+
language,
43+
);
44+
}
45+
46+
public shouldInclude(language: QueryLanguage | undefined): boolean {
47+
return this.languageFilter === "All" || this.languageFilter === language;
48+
}
49+
}

extensions/ql-vscode/test/vscode-tests/no-workspace/databases/local-databases-ui.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ describe("local-databases-ui", () => {
9999
/**/
100100
},
101101
} as any,
102+
{
103+
onLanguageContextChanged: () => {
104+
/**/
105+
},
106+
} as any,
102107
{} as any,
103108
storageDir,
104109
storageDir,

0 commit comments

Comments
 (0)