From 750c1beb4f3a67e9f1c7c11af7d3ee3c50d99508 Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Mon, 25 Sep 2023 14:47:01 +0200 Subject: [PATCH 1/2] Add ability to filter DB view by language --- extensions/ql-vscode/package.json | 112 ++++++++++++++++++ extensions/ql-vscode/src/common/commands.ts | 9 ++ .../src/databases/local-databases-ui.ts | 73 +++++++++++- 3 files changed, 193 insertions(+), 1 deletion(-) diff --git a/extensions/ql-vscode/package.json b/extensions/ql-vscode/package.json index 54e2ba7a4f0..1c8abd5af24 100644 --- a/extensions/ql-vscode/package.json +++ b/extensions/ql-vscode/package.json @@ -753,6 +753,42 @@ "command": "codeQLDatabases.addDatabaseSource", "title": "Add Database Source to Workspace" }, + { + "command": "codeQLDatabases.displayAllLanguages", + "title": "All languages" + }, + { + "command": "codeQLDatabases.displayCpp", + "title": "C/C++" + }, + { + "command": "codeQLDatabases.displayCsharp", + "title": "C#" + }, + { + "command": "codeQLDatabases.displayGo", + "title": "Go" + }, + { + "command": "codeQLDatabases.displayJava", + "title": "Java/Kotlin" + }, + { + "command": "codeQLDatabases.displayJavascript", + "title": "JavaScript/TypeScript" + }, + { + "command": "codeQLDatabases.displayPython", + "title": "Python" + }, + { + "command": "codeQLDatabases.displayRuby", + "title": "Ruby" + }, + { + "command": "codeQLDatabases.displaySwift", + "title": "Swift" + }, { "command": "codeQL.chooseDatabaseFolder", "title": "CodeQL: Choose Database from Folder" @@ -1003,6 +1039,11 @@ "when": "view == codeQLDatabases", "group": "1_databases@1" }, + { + "submenu": "codeQLDatabases.languages", + "when": "view == codeQLDatabases && config.codeQL.canary", + "group": "2_databases@0" + }, { "command": "codeQLQueries.createQuery", "when": "view == codeQLQueries", @@ -1523,6 +1564,42 @@ "command": "codeQLDatabases.upgradeDatabase", "when": "false" }, + { + "command": "codeQLDatabases.displayAllLanguages", + "when": "false" + }, + { + "command": "codeQLDatabases.displayCpp", + "when": "false" + }, + { + "command": "codeQLDatabases.displayCsharp", + "when": "false" + }, + { + "command": "codeQLDatabases.displayGo", + "when": "false" + }, + { + "command": "codeQLDatabases.displayJava", + "when": "false" + }, + { + "command": "codeQLDatabases.displayJavascript", + "when": "false" + }, + { + "command": "codeQLDatabases.displayPython", + "when": "false" + }, + { + "command": "codeQLDatabases.displayRuby", + "when": "false" + }, + { + "command": "codeQLDatabases.displaySwift", + "when": "false" + }, { "command": "codeQLQueryHistory.openQueryContextMenu", "when": "false" @@ -1717,8 +1794,43 @@ "command": "codeQL.gotoQLContextEditor", "when": "editorLangId == ql-summary && config.codeQL.canary" } + ], + "codeQLDatabases.languages": [ + { + "command": "codeQLDatabases.displayAllLanguages" + }, + { + "command": "codeQLDatabases.displayCpp" + }, + { + "command": "codeQLDatabases.displayCsharp" + }, + { + "command": "codeQLDatabases.displayGo" + }, + { + "command": "codeQLDatabases.displayJava" + }, + { + "command": "codeQLDatabases.displayJavascript" + }, + { + "command": "codeQLDatabases.displayPython" + }, + { + "command": "codeQLDatabases.displayRuby" + }, + { + "command": "codeQLDatabases.displaySwift" + } ] }, + "submenus": [ + { + "id": "codeQLDatabases.languages", + "label": "Languages" + } + ], "viewsContainers": { "activitybar": [ { diff --git a/extensions/ql-vscode/src/common/commands.ts b/extensions/ql-vscode/src/common/commands.ts index 973ca70f033..0d330afa9bd 100644 --- a/extensions/ql-vscode/src/common/commands.ts +++ b/extensions/ql-vscode/src/common/commands.ts @@ -219,6 +219,15 @@ export type LocalDatabasesCommands = { "codeQLDatabases.chooseDatabaseGithub": () => Promise; "codeQLDatabases.sortByName": () => Promise; "codeQLDatabases.sortByDateAdded": () => Promise; + "codeQLDatabases.displayAllLanguages": () => Promise; + "codeQLDatabases.displayCpp": () => Promise; + "codeQLDatabases.displayCsharp": () => Promise; + "codeQLDatabases.displayGo": () => Promise; + "codeQLDatabases.displayJava": () => Promise; + "codeQLDatabases.displayJavascript": () => Promise; + "codeQLDatabases.displayPython": () => Promise; + "codeQLDatabases.displayRuby": () => Promise; + "codeQLDatabases.displaySwift": () => Promise; // Database panel context menu "codeQLDatabases.setCurrentDatabase": ( diff --git a/extensions/ql-vscode/src/databases/local-databases-ui.ts b/extensions/ql-vscode/src/databases/local-databases-ui.ts index f0b4532d7ca..a4347c60684 100644 --- a/extensions/ql-vscode/src/databases/local-databases-ui.ts +++ b/extensions/ql-vscode/src/databases/local-databases-ui.ts @@ -51,6 +51,7 @@ import { createMultiSelectionCommand, createSingleSelectionCommand, } from "../common/vscode/selection-commands"; +import { QueryLanguage } from "../common/query-language"; enum SortOrder { NameAsc = "NameAsc", @@ -59,6 +60,18 @@ enum SortOrder { DateAddedDesc = "DateAddedDesc", } +enum LanguageFilter { + All = "All", + Cpp = QueryLanguage.Cpp, + CSharp = QueryLanguage.CSharp, + Go = QueryLanguage.Go, + Java = QueryLanguage.Java, + Javascript = QueryLanguage.Javascript, + Python = QueryLanguage.Python, + Ruby = QueryLanguage.Ruby, + Swift = QueryLanguage.Swift, +} + /** * Tree data provider for the databases view. */ @@ -67,6 +80,7 @@ class DatabaseTreeDataProvider implements TreeDataProvider { private _sortOrder = SortOrder.NameAsc; + private _languageFilter = LanguageFilter.All; private readonly _onDidChangeTreeData = this.push( new EventEmitter(), @@ -131,7 +145,17 @@ class DatabaseTreeDataProvider public getChildren(element?: DatabaseItem): ProviderResult { if (element === undefined) { - return this.databaseManager.databaseItems.slice(0).sort((db1, db2) => { + // Filter items by language + const displayItems = this.databaseManager.databaseItems.filter((item) => { + if (this.languageFilter === LanguageFilter.All) { + return true; + } else { + return item.language === this.languageFilter; + } + }); + + // Sort items + return displayItems.slice(0).sort((db1, db2) => { switch (this.sortOrder) { case SortOrder.NameAsc: return db1.name.localeCompare(db2.name, env.language); @@ -164,6 +188,15 @@ 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. */ @@ -245,6 +278,40 @@ export class DatabaseUI extends DisposableObject { this.handleMakeCurrentDatabase.bind(this), "codeQLDatabases.sortByName": this.handleSortByName.bind(this), "codeQLDatabases.sortByDateAdded": this.handleSortByDateAdded.bind(this), + "codeQLDatabases.displayAllLanguages": + this.handleChangeLanguageFilter.bind(this, LanguageFilter.All), + "codeQLDatabases.displayCpp": this.handleChangeLanguageFilter.bind( + this, + LanguageFilter.Cpp, + ), + "codeQLDatabases.displayCsharp": this.handleChangeLanguageFilter.bind( + this, + LanguageFilter.CSharp, + ), + "codeQLDatabases.displayGo": this.handleChangeLanguageFilter.bind( + this, + LanguageFilter.Go, + ), + "codeQLDatabases.displayJava": this.handleChangeLanguageFilter.bind( + this, + LanguageFilter.Java, + ), + "codeQLDatabases.displayJavascript": this.handleChangeLanguageFilter.bind( + this, + LanguageFilter.Javascript, + ), + "codeQLDatabases.displayPython": this.handleChangeLanguageFilter.bind( + this, + LanguageFilter.Python, + ), + "codeQLDatabases.displayRuby": this.handleChangeLanguageFilter.bind( + this, + LanguageFilter.Ruby, + ), + "codeQLDatabases.displaySwift": this.handleChangeLanguageFilter.bind( + this, + LanguageFilter.Swift, + ), "codeQLDatabases.removeDatabase": createMultiSelectionCommand( this.handleRemoveDatabase.bind(this), ), @@ -535,6 +602,10 @@ export class DatabaseUI extends DisposableObject { } } + private async handleChangeLanguageFilter(languageFilter: LanguageFilter) { + this.treeDataProvider.languageFilter = languageFilter; + } + private async handleUpgradeCurrentDatabase(): Promise { return withProgress( async (progress, token) => { From db23feb0c92691651c185734996a08a8449f313c Mon Sep 17 00:00:00 2001 From: shati-patel <42641846+shati-patel@users.noreply.github.com> Date: Tue, 26 Sep 2023 10:28:06 +0200 Subject: [PATCH 2/2] Remove some duplication in the `LanguageFilter` type --- .../src/databases/local-databases-ui.ts | 34 +++++++------------ 1 file changed, 12 insertions(+), 22 deletions(-) diff --git a/extensions/ql-vscode/src/databases/local-databases-ui.ts b/extensions/ql-vscode/src/databases/local-databases-ui.ts index a4347c60684..c0bf418840f 100644 --- a/extensions/ql-vscode/src/databases/local-databases-ui.ts +++ b/extensions/ql-vscode/src/databases/local-databases-ui.ts @@ -60,17 +60,7 @@ enum SortOrder { DateAddedDesc = "DateAddedDesc", } -enum LanguageFilter { - All = "All", - Cpp = QueryLanguage.Cpp, - CSharp = QueryLanguage.CSharp, - Go = QueryLanguage.Go, - Java = QueryLanguage.Java, - Javascript = QueryLanguage.Javascript, - Python = QueryLanguage.Python, - Ruby = QueryLanguage.Ruby, - Swift = QueryLanguage.Swift, -} +type LanguageFilter = QueryLanguage | "All"; /** * Tree data provider for the databases view. @@ -80,7 +70,7 @@ class DatabaseTreeDataProvider implements TreeDataProvider { private _sortOrder = SortOrder.NameAsc; - private _languageFilter = LanguageFilter.All; + private _languageFilter = "All" as LanguageFilter; private readonly _onDidChangeTreeData = this.push( new EventEmitter(), @@ -147,7 +137,7 @@ class DatabaseTreeDataProvider if (element === undefined) { // Filter items by language const displayItems = this.databaseManager.databaseItems.filter((item) => { - if (this.languageFilter === LanguageFilter.All) { + if (this.languageFilter === "All") { return true; } else { return item.language === this.languageFilter; @@ -279,38 +269,38 @@ export class DatabaseUI extends DisposableObject { "codeQLDatabases.sortByName": this.handleSortByName.bind(this), "codeQLDatabases.sortByDateAdded": this.handleSortByDateAdded.bind(this), "codeQLDatabases.displayAllLanguages": - this.handleChangeLanguageFilter.bind(this, LanguageFilter.All), + this.handleChangeLanguageFilter.bind(this, "All"), "codeQLDatabases.displayCpp": this.handleChangeLanguageFilter.bind( this, - LanguageFilter.Cpp, + QueryLanguage.Cpp, ), "codeQLDatabases.displayCsharp": this.handleChangeLanguageFilter.bind( this, - LanguageFilter.CSharp, + QueryLanguage.CSharp, ), "codeQLDatabases.displayGo": this.handleChangeLanguageFilter.bind( this, - LanguageFilter.Go, + QueryLanguage.Go, ), "codeQLDatabases.displayJava": this.handleChangeLanguageFilter.bind( this, - LanguageFilter.Java, + QueryLanguage.Java, ), "codeQLDatabases.displayJavascript": this.handleChangeLanguageFilter.bind( this, - LanguageFilter.Javascript, + QueryLanguage.Javascript, ), "codeQLDatabases.displayPython": this.handleChangeLanguageFilter.bind( this, - LanguageFilter.Python, + QueryLanguage.Python, ), "codeQLDatabases.displayRuby": this.handleChangeLanguageFilter.bind( this, - LanguageFilter.Ruby, + QueryLanguage.Ruby, ), "codeQLDatabases.displaySwift": this.handleChangeLanguageFilter.bind( this, - LanguageFilter.Swift, + QueryLanguage.Swift, ), "codeQLDatabases.removeDatabase": createMultiSelectionCommand( this.handleRemoveDatabase.bind(this),