Merge pull request #2873 from github/starcke/language-context-store
Add language context store.
This commit is contained in:
@@ -1870,11 +1870,11 @@
|
||||
"codeQLDatabases.languages": [
|
||||
{
|
||||
"command": "codeQLDatabases.displayAllLanguages",
|
||||
"when": "codeQLDatabases.languageFilter != All"
|
||||
"when": "codeQLDatabases.languageFilter"
|
||||
},
|
||||
{
|
||||
"command": "codeQLDatabases.displayAllLanguagesSelected",
|
||||
"when": "codeQLDatabases.languageFilter == All"
|
||||
"when": "!codeQLDatabases.languageFilter"
|
||||
},
|
||||
{
|
||||
"command": "codeQLDatabases.displayCpp",
|
||||
|
||||
@@ -62,3 +62,9 @@ export const dbSchemeToLanguage: Record<string, QueryLanguage> = {
|
||||
export function isQueryLanguage(language: string): language is QueryLanguage {
|
||||
return Object.values(QueryLanguage).includes(language as QueryLanguage);
|
||||
}
|
||||
|
||||
export function tryGetQueryLanguage(
|
||||
language: string,
|
||||
): QueryLanguage | undefined {
|
||||
return isQueryLanguage(language) ? language : undefined;
|
||||
}
|
||||
|
||||
@@ -51,7 +51,8 @@ import {
|
||||
createMultiSelectionCommand,
|
||||
createSingleSelectionCommand,
|
||||
} from "../common/vscode/selection-commands";
|
||||
import { QueryLanguage } from "../common/query-language";
|
||||
import { QueryLanguage, tryGetQueryLanguage } 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,9 @@ 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(
|
||||
tryGetQueryLanguage(item.language),
|
||||
);
|
||||
});
|
||||
|
||||
// Sort items
|
||||
@@ -178,15 +182,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 +218,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 +226,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 +265,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,
|
||||
@@ -303,7 +299,7 @@ export class DatabaseUI extends DisposableObject {
|
||||
QueryLanguage.Swift,
|
||||
),
|
||||
"codeQLDatabases.displayAllLanguagesSelected":
|
||||
this.handleChangeLanguageFilter.bind(this, "All"),
|
||||
this.handleClearLanguageFilter.bind(this),
|
||||
"codeQLDatabases.displayCppSelected":
|
||||
this.handleChangeLanguageFilter.bind(this, QueryLanguage.Cpp),
|
||||
"codeQLDatabases.displayCsharpSelected":
|
||||
@@ -612,13 +608,12 @@ export class DatabaseUI extends DisposableObject {
|
||||
}
|
||||
}
|
||||
|
||||
private async handleChangeLanguageFilter(languageFilter: LanguageFilter) {
|
||||
this.treeDataProvider.languageFilter = languageFilter;
|
||||
await this.app.commands.execute(
|
||||
"setContext",
|
||||
"codeQLDatabases.languageFilter",
|
||||
languageFilter,
|
||||
);
|
||||
private async handleClearLanguageFilter() {
|
||||
await this.languageContext.clearLanguageContext();
|
||||
}
|
||||
|
||||
private async handleChangeLanguageFilter(languageFilter: QueryLanguage) {
|
||||
await 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,
|
||||
|
||||
49
extensions/ql-vscode/src/language-context-store.ts
Normal file
49
extensions/ql-vscode/src/language-context-store.ts
Normal file
@@ -0,0 +1,49 @@
|
||||
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 languageFilter: LanguageFilter;
|
||||
|
||||
constructor(private readonly app: App) {
|
||||
super();
|
||||
// State initialization
|
||||
this.languageFilter = "All";
|
||||
|
||||
// Set up event emitters
|
||||
this.onLanguageContextChangedEmitter = this.push(
|
||||
app.createEventEmitter<void>(),
|
||||
);
|
||||
this.onLanguageContextChanged = this.onLanguageContextChangedEmitter.event;
|
||||
}
|
||||
|
||||
public async clearLanguageContext() {
|
||||
this.languageFilter = "All";
|
||||
this.onLanguageContextChangedEmitter.fire();
|
||||
await this.app.commands.execute(
|
||||
"setContext",
|
||||
"codeQLDatabases.languageFilter",
|
||||
"",
|
||||
);
|
||||
}
|
||||
|
||||
public async setLanguageContext(language: QueryLanguage) {
|
||||
this.languageFilter = language;
|
||||
this.onLanguageContextChangedEmitter.fire();
|
||||
await this.app.commands.execute(
|
||||
"setContext",
|
||||
"codeQLDatabases.languageFilter",
|
||||
language,
|
||||
);
|
||||
}
|
||||
|
||||
public shouldInclude(language: QueryLanguage | undefined): boolean {
|
||||
return this.languageFilter === "All" || this.languageFilter === 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