Skip to content

Commit 7bfe0df

Browse files
committed
Add language context store.
1 parent b1debee commit 7bfe0df

File tree

4 files changed

+71
-22
lines changed

4 files changed

+71
-22
lines changed

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

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ import {
5252
createSingleSelectionCommand,
5353
} from "../common/vscode/selection-commands";
5454
import { QueryLanguage } 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,7 @@ 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(item.language);
145147
});
146148

147149
// Sort items
@@ -178,15 +180,6 @@ class DatabaseTreeDataProvider
178180
this._sortOrder = newSortOrder;
179181
this._onDidChangeTreeData.fire(undefined);
180182
}
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-
}
190183
}
191184

192185
/** Gets the first element in the given list, if any, or undefined if the list is empty or undefined. */
@@ -223,14 +216,15 @@ export class DatabaseUI extends DisposableObject {
223216
public constructor(
224217
private app: App,
225218
private databaseManager: DatabaseManager,
219+
private languageContext: LanguageContextStore,
226220
private readonly queryServer: QueryRunner | undefined,
227221
private readonly storagePath: string,
228222
readonly extensionPath: string,
229223
) {
230224
super();
231225

232226
this.treeDataProvider = this.push(
233-
new DatabaseTreeDataProvider(databaseManager),
227+
new DatabaseTreeDataProvider(databaseManager, languageContext),
234228
);
235229
this.push(
236230
window.createTreeView("codeQLDatabases", {
@@ -269,7 +263,7 @@ export class DatabaseUI extends DisposableObject {
269263
"codeQLDatabases.sortByName": this.handleSortByName.bind(this),
270264
"codeQLDatabases.sortByDateAdded": this.handleSortByDateAdded.bind(this),
271265
"codeQLDatabases.displayAllLanguages":
272-
this.handleChangeLanguageFilter.bind(this, "All"),
266+
this.handleClearLanguageFilter.bind(this),
273267
"codeQLDatabases.displayCpp": this.handleChangeLanguageFilter.bind(
274268
this,
275269
QueryLanguage.Cpp,
@@ -592,8 +586,12 @@ export class DatabaseUI extends DisposableObject {
592586
}
593587
}
594588

595-
private async handleChangeLanguageFilter(languageFilter: LanguageFilter) {
596-
this.treeDataProvider.languageFilter = languageFilter;
589+
private async handleClearLanguageFilter() {
590+
this.languageContext.clearLanguageContext();
591+
}
592+
593+
private async handleChangeLanguageFilter(languageFilter: QueryLanguage) {
594+
this.languageContext.setLanguageContext(languageFilter);
597595
}
598596

599597
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: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
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 state: LanguageFilter;
13+
14+
constructor(app: App) {
15+
super();
16+
// State initialization
17+
this.state = "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 clearLanguageContext() {
27+
this.state = "All";
28+
this.onLanguageContextChangedEmitter.fire();
29+
}
30+
31+
public setLanguageContext(language: QueryLanguage) {
32+
this.state = language;
33+
this.onLanguageContextChangedEmitter.fire();
34+
}
35+
36+
// TODO: comment on why string is used here
37+
public shouldInclude(language: string): boolean {
38+
return this.state === "All" || this.state === language;
39+
}
40+
}

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)