Skip to content

Commit 3be7eb9

Browse files
authored
Add ability to filter DB view by language (#2856)
1 parent e0509f6 commit 3be7eb9

File tree

3 files changed

+183
-1
lines changed

3 files changed

+183
-1
lines changed

extensions/ql-vscode/package.json

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -753,6 +753,42 @@
753753
"command": "codeQLDatabases.addDatabaseSource",
754754
"title": "Add Database Source to Workspace"
755755
},
756+
{
757+
"command": "codeQLDatabases.displayAllLanguages",
758+
"title": "All languages"
759+
},
760+
{
761+
"command": "codeQLDatabases.displayCpp",
762+
"title": "C/C++"
763+
},
764+
{
765+
"command": "codeQLDatabases.displayCsharp",
766+
"title": "C#"
767+
},
768+
{
769+
"command": "codeQLDatabases.displayGo",
770+
"title": "Go"
771+
},
772+
{
773+
"command": "codeQLDatabases.displayJava",
774+
"title": "Java/Kotlin"
775+
},
776+
{
777+
"command": "codeQLDatabases.displayJavascript",
778+
"title": "JavaScript/TypeScript"
779+
},
780+
{
781+
"command": "codeQLDatabases.displayPython",
782+
"title": "Python"
783+
},
784+
{
785+
"command": "codeQLDatabases.displayRuby",
786+
"title": "Ruby"
787+
},
788+
{
789+
"command": "codeQLDatabases.displaySwift",
790+
"title": "Swift"
791+
},
756792
{
757793
"command": "codeQL.chooseDatabaseFolder",
758794
"title": "CodeQL: Choose Database from Folder"
@@ -1003,6 +1039,11 @@
10031039
"when": "view == codeQLDatabases",
10041040
"group": "1_databases@1"
10051041
},
1042+
{
1043+
"submenu": "codeQLDatabases.languages",
1044+
"when": "view == codeQLDatabases && config.codeQL.canary",
1045+
"group": "2_databases@0"
1046+
},
10061047
{
10071048
"command": "codeQLQueries.createQuery",
10081049
"when": "view == codeQLQueries",
@@ -1523,6 +1564,42 @@
15231564
"command": "codeQLDatabases.upgradeDatabase",
15241565
"when": "false"
15251566
},
1567+
{
1568+
"command": "codeQLDatabases.displayAllLanguages",
1569+
"when": "false"
1570+
},
1571+
{
1572+
"command": "codeQLDatabases.displayCpp",
1573+
"when": "false"
1574+
},
1575+
{
1576+
"command": "codeQLDatabases.displayCsharp",
1577+
"when": "false"
1578+
},
1579+
{
1580+
"command": "codeQLDatabases.displayGo",
1581+
"when": "false"
1582+
},
1583+
{
1584+
"command": "codeQLDatabases.displayJava",
1585+
"when": "false"
1586+
},
1587+
{
1588+
"command": "codeQLDatabases.displayJavascript",
1589+
"when": "false"
1590+
},
1591+
{
1592+
"command": "codeQLDatabases.displayPython",
1593+
"when": "false"
1594+
},
1595+
{
1596+
"command": "codeQLDatabases.displayRuby",
1597+
"when": "false"
1598+
},
1599+
{
1600+
"command": "codeQLDatabases.displaySwift",
1601+
"when": "false"
1602+
},
15261603
{
15271604
"command": "codeQLQueryHistory.openQueryContextMenu",
15281605
"when": "false"
@@ -1717,8 +1794,43 @@
17171794
"command": "codeQL.gotoQLContextEditor",
17181795
"when": "editorLangId == ql-summary && config.codeQL.canary"
17191796
}
1797+
],
1798+
"codeQLDatabases.languages": [
1799+
{
1800+
"command": "codeQLDatabases.displayAllLanguages"
1801+
},
1802+
{
1803+
"command": "codeQLDatabases.displayCpp"
1804+
},
1805+
{
1806+
"command": "codeQLDatabases.displayCsharp"
1807+
},
1808+
{
1809+
"command": "codeQLDatabases.displayGo"
1810+
},
1811+
{
1812+
"command": "codeQLDatabases.displayJava"
1813+
},
1814+
{
1815+
"command": "codeQLDatabases.displayJavascript"
1816+
},
1817+
{
1818+
"command": "codeQLDatabases.displayPython"
1819+
},
1820+
{
1821+
"command": "codeQLDatabases.displayRuby"
1822+
},
1823+
{
1824+
"command": "codeQLDatabases.displaySwift"
1825+
}
17201826
]
17211827
},
1828+
"submenus": [
1829+
{
1830+
"id": "codeQLDatabases.languages",
1831+
"label": "Languages"
1832+
}
1833+
],
17221834
"viewsContainers": {
17231835
"activitybar": [
17241836
{

extensions/ql-vscode/src/common/commands.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,15 @@ export type LocalDatabasesCommands = {
219219
"codeQLDatabases.chooseDatabaseGithub": () => Promise<void>;
220220
"codeQLDatabases.sortByName": () => Promise<void>;
221221
"codeQLDatabases.sortByDateAdded": () => Promise<void>;
222+
"codeQLDatabases.displayAllLanguages": () => Promise<void>;
223+
"codeQLDatabases.displayCpp": () => Promise<void>;
224+
"codeQLDatabases.displayCsharp": () => Promise<void>;
225+
"codeQLDatabases.displayGo": () => Promise<void>;
226+
"codeQLDatabases.displayJava": () => Promise<void>;
227+
"codeQLDatabases.displayJavascript": () => Promise<void>;
228+
"codeQLDatabases.displayPython": () => Promise<void>;
229+
"codeQLDatabases.displayRuby": () => Promise<void>;
230+
"codeQLDatabases.displaySwift": () => Promise<void>;
222231

223232
// Database panel context menu
224233
"codeQLDatabases.setCurrentDatabase": (

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

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import {
5151
createMultiSelectionCommand,
5252
createSingleSelectionCommand,
5353
} from "../common/vscode/selection-commands";
54+
import { QueryLanguage } from "../common/query-language";
5455

5556
enum SortOrder {
5657
NameAsc = "NameAsc",
@@ -59,6 +60,8 @@ enum SortOrder {
5960
DateAddedDesc = "DateAddedDesc",
6061
}
6162

63+
type LanguageFilter = QueryLanguage | "All";
64+
6265
/**
6366
* Tree data provider for the databases view.
6467
*/
@@ -67,6 +70,7 @@ class DatabaseTreeDataProvider
6770
implements TreeDataProvider<DatabaseItem>
6871
{
6972
private _sortOrder = SortOrder.NameAsc;
73+
private _languageFilter = "All" as LanguageFilter;
7074

7175
private readonly _onDidChangeTreeData = this.push(
7276
new EventEmitter<DatabaseItem | undefined>(),
@@ -131,7 +135,17 @@ class DatabaseTreeDataProvider
131135

132136
public getChildren(element?: DatabaseItem): ProviderResult<DatabaseItem[]> {
133137
if (element === undefined) {
134-
return this.databaseManager.databaseItems.slice(0).sort((db1, db2) => {
138+
// Filter items by language
139+
const displayItems = this.databaseManager.databaseItems.filter((item) => {
140+
if (this.languageFilter === "All") {
141+
return true;
142+
} else {
143+
return item.language === this.languageFilter;
144+
}
145+
});
146+
147+
// Sort items
148+
return displayItems.slice(0).sort((db1, db2) => {
135149
switch (this.sortOrder) {
136150
case SortOrder.NameAsc:
137151
return db1.name.localeCompare(db2.name, env.language);
@@ -164,6 +178,15 @@ class DatabaseTreeDataProvider
164178
this._sortOrder = newSortOrder;
165179
this._onDidChangeTreeData.fire(undefined);
166180
}
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+
}
167190
}
168191

169192
/** Gets the first element in the given list, if any, or undefined if the list is empty or undefined. */
@@ -245,6 +268,40 @@ export class DatabaseUI extends DisposableObject {
245268
this.handleMakeCurrentDatabase.bind(this),
246269
"codeQLDatabases.sortByName": this.handleSortByName.bind(this),
247270
"codeQLDatabases.sortByDateAdded": this.handleSortByDateAdded.bind(this),
271+
"codeQLDatabases.displayAllLanguages":
272+
this.handleChangeLanguageFilter.bind(this, "All"),
273+
"codeQLDatabases.displayCpp": this.handleChangeLanguageFilter.bind(
274+
this,
275+
QueryLanguage.Cpp,
276+
),
277+
"codeQLDatabases.displayCsharp": this.handleChangeLanguageFilter.bind(
278+
this,
279+
QueryLanguage.CSharp,
280+
),
281+
"codeQLDatabases.displayGo": this.handleChangeLanguageFilter.bind(
282+
this,
283+
QueryLanguage.Go,
284+
),
285+
"codeQLDatabases.displayJava": this.handleChangeLanguageFilter.bind(
286+
this,
287+
QueryLanguage.Java,
288+
),
289+
"codeQLDatabases.displayJavascript": this.handleChangeLanguageFilter.bind(
290+
this,
291+
QueryLanguage.Javascript,
292+
),
293+
"codeQLDatabases.displayPython": this.handleChangeLanguageFilter.bind(
294+
this,
295+
QueryLanguage.Python,
296+
),
297+
"codeQLDatabases.displayRuby": this.handleChangeLanguageFilter.bind(
298+
this,
299+
QueryLanguage.Ruby,
300+
),
301+
"codeQLDatabases.displaySwift": this.handleChangeLanguageFilter.bind(
302+
this,
303+
QueryLanguage.Swift,
304+
),
248305
"codeQLDatabases.removeDatabase": createMultiSelectionCommand(
249306
this.handleRemoveDatabase.bind(this),
250307
),
@@ -535,6 +592,10 @@ export class DatabaseUI extends DisposableObject {
535592
}
536593
}
537594

595+
private async handleChangeLanguageFilter(languageFilter: LanguageFilter) {
596+
this.treeDataProvider.languageFilter = languageFilter;
597+
}
598+
538599
private async handleUpgradeCurrentDatabase(): Promise<void> {
539600
return withProgress(
540601
async (progress, token) => {

0 commit comments

Comments
 (0)