Add language context store.
This commit is contained in:
@@ -52,6 +52,7 @@ import {
|
||||
createSingleSelectionCommand,
|
||||
} from "../common/vscode/selection-commands";
|
||||
import { QueryLanguage } from "../common/query-language";
|
||||
import { LanguageContextStore } from "../language-context-store";
|
||||
|
||||
enum SortOrder {
|
||||
NameAsc = "NameAsc",
|
||||
@@ -60,8 +61,6 @@ enum SortOrder {
|
||||
DateAddedDesc = "DateAddedDesc",
|
||||
}
|
||||
|
||||
type LanguageFilter = QueryLanguage | "All";
|
||||
|
||||
/**
|
||||
* Tree data provider for the databases view.
|
||||
*/
|
||||
@@ -70,14 +69,16 @@ class DatabaseTreeDataProvider
|
||||
implements TreeDataProvider<DatabaseItem>
|
||||
{
|
||||
private _sortOrder = SortOrder.NameAsc;
|
||||
private _languageFilter = "All" as LanguageFilter;
|
||||
|
||||
private readonly _onDidChangeTreeData = this.push(
|
||||
new EventEmitter<DatabaseItem | undefined>(),
|
||||
);
|
||||
private currentDatabaseItem: DatabaseItem | undefined;
|
||||
|
||||
constructor(private databaseManager: DatabaseManager) {
|
||||
constructor(
|
||||
private databaseManager: DatabaseManager,
|
||||
private languageContext: LanguageContextStore,
|
||||
) {
|
||||
super();
|
||||
|
||||
this.currentDatabaseItem = databaseManager.currentDatabaseItem;
|
||||
@@ -92,6 +93,11 @@ class DatabaseTreeDataProvider
|
||||
this.handleDidChangeCurrentDatabaseItem.bind(this),
|
||||
),
|
||||
);
|
||||
this.push(
|
||||
this.languageContext.onLanguageContextChanged(async () => {
|
||||
this._onDidChangeTreeData.fire(undefined);
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
public get onDidChangeTreeData(): Event<DatabaseItem | undefined> {
|
||||
@@ -137,11 +143,7 @@ class DatabaseTreeDataProvider
|
||||
if (element === undefined) {
|
||||
// Filter items by language
|
||||
const displayItems = this.databaseManager.databaseItems.filter((item) => {
|
||||
if (this.languageFilter === "All") {
|
||||
return true;
|
||||
} else {
|
||||
return item.language === this.languageFilter;
|
||||
}
|
||||
return this.languageContext.shouldInclude(item.language);
|
||||
});
|
||||
|
||||
// Sort items
|
||||
@@ -178,15 +180,6 @@ class DatabaseTreeDataProvider
|
||||
this._sortOrder = newSortOrder;
|
||||
this._onDidChangeTreeData.fire(undefined);
|
||||
}
|
||||
|
||||
public get languageFilter() {
|
||||
return this._languageFilter;
|
||||
}
|
||||
|
||||
public set languageFilter(newLanguageFilter: LanguageFilter) {
|
||||
this._languageFilter = newLanguageFilter;
|
||||
this._onDidChangeTreeData.fire(undefined);
|
||||
}
|
||||
}
|
||||
|
||||
/** Gets the first element in the given list, if any, or undefined if the list is empty or undefined. */
|
||||
@@ -223,6 +216,7 @@ export class DatabaseUI extends DisposableObject {
|
||||
public constructor(
|
||||
private app: App,
|
||||
private databaseManager: DatabaseManager,
|
||||
private languageContext: LanguageContextStore,
|
||||
private readonly queryServer: QueryRunner | undefined,
|
||||
private readonly storagePath: string,
|
||||
readonly extensionPath: string,
|
||||
@@ -230,7 +224,7 @@ export class DatabaseUI extends DisposableObject {
|
||||
super();
|
||||
|
||||
this.treeDataProvider = this.push(
|
||||
new DatabaseTreeDataProvider(databaseManager),
|
||||
new DatabaseTreeDataProvider(databaseManager, languageContext),
|
||||
);
|
||||
this.push(
|
||||
window.createTreeView("codeQLDatabases", {
|
||||
@@ -269,7 +263,7 @@ export class DatabaseUI extends DisposableObject {
|
||||
"codeQLDatabases.sortByName": this.handleSortByName.bind(this),
|
||||
"codeQLDatabases.sortByDateAdded": this.handleSortByDateAdded.bind(this),
|
||||
"codeQLDatabases.displayAllLanguages":
|
||||
this.handleChangeLanguageFilter.bind(this, "All"),
|
||||
this.handleClearLanguageFilter.bind(this),
|
||||
"codeQLDatabases.displayCpp": this.handleChangeLanguageFilter.bind(
|
||||
this,
|
||||
QueryLanguage.Cpp,
|
||||
@@ -592,8 +586,12 @@ export class DatabaseUI extends DisposableObject {
|
||||
}
|
||||
}
|
||||
|
||||
private async handleChangeLanguageFilter(languageFilter: LanguageFilter) {
|
||||
this.treeDataProvider.languageFilter = languageFilter;
|
||||
private async handleClearLanguageFilter() {
|
||||
this.languageContext.clearLanguageContext();
|
||||
}
|
||||
|
||||
private async handleChangeLanguageFilter(languageFilter: QueryLanguage) {
|
||||
this.languageContext.setLanguageContext(languageFilter);
|
||||
}
|
||||
|
||||
private async handleUpgradeCurrentDatabase(): Promise<void> {
|
||||
|
||||
@@ -135,6 +135,7 @@ import { TestManagerBase } from "./query-testing/test-manager-base";
|
||||
import { NewQueryRunner, QueryRunner, QueryServerClient } from "./query-server";
|
||||
import { QueriesModule } from "./queries-panel/queries-module";
|
||||
import { OpenReferencedFileCodeLensProvider } from "./local-queries/open-referenced-file-code-lens-provider";
|
||||
import { LanguageContextStore } from "./language-context-store";
|
||||
|
||||
/**
|
||||
* extension.ts
|
||||
@@ -774,10 +775,15 @@ async function activateWithInstalledDistribution(
|
||||
void dbm.loadPersistedState();
|
||||
|
||||
ctx.subscriptions.push(dbm);
|
||||
|
||||
void extLogger.log("Initializing language context.");
|
||||
const languageContext = new LanguageContextStore(app);
|
||||
|
||||
void extLogger.log("Initializing database panel.");
|
||||
const databaseUI = new DatabaseUI(
|
||||
app,
|
||||
dbm,
|
||||
languageContext,
|
||||
qs,
|
||||
getContextStoragePath(ctx),
|
||||
ctx.extensionPath,
|
||||
|
||||
40
extensions/ql-vscode/src/language-context-store.ts
Normal file
40
extensions/ql-vscode/src/language-context-store.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import { App } from "./common/app";
|
||||
import { DisposableObject } from "./common/disposable-object";
|
||||
import { AppEvent, AppEventEmitter } from "./common/events";
|
||||
import { QueryLanguage } from "./common/query-language";
|
||||
|
||||
type LanguageFilter = QueryLanguage | "All";
|
||||
|
||||
export class LanguageContextStore extends DisposableObject {
|
||||
public readonly onLanguageContextChanged: AppEvent<void>;
|
||||
private readonly onLanguageContextChangedEmitter: AppEventEmitter<void>;
|
||||
|
||||
private state: LanguageFilter;
|
||||
|
||||
constructor(app: App) {
|
||||
super();
|
||||
// State initialization
|
||||
this.state = "All";
|
||||
|
||||
// Set up event emitters
|
||||
this.onLanguageContextChangedEmitter = this.push(
|
||||
app.createEventEmitter<void>(),
|
||||
);
|
||||
this.onLanguageContextChanged = this.onLanguageContextChangedEmitter.event;
|
||||
}
|
||||
|
||||
public clearLanguageContext() {
|
||||
this.state = "All";
|
||||
this.onLanguageContextChangedEmitter.fire();
|
||||
}
|
||||
|
||||
public setLanguageContext(language: QueryLanguage) {
|
||||
this.state = language;
|
||||
this.onLanguageContextChangedEmitter.fire();
|
||||
}
|
||||
|
||||
// TODO: comment on why string is used here
|
||||
public shouldInclude(language: string): boolean {
|
||||
return this.state === "All" || this.state === language;
|
||||
}
|
||||
}
|
||||
@@ -99,6 +99,11 @@ describe("local-databases-ui", () => {
|
||||
/**/
|
||||
},
|
||||
} as any,
|
||||
{
|
||||
onLanguageContextChanged: () => {
|
||||
/**/
|
||||
},
|
||||
} as any,
|
||||
{} as any,
|
||||
storageDir,
|
||||
storageDir,
|
||||
|
||||
Reference in New Issue
Block a user