Skip to content

Commit 13a5b78

Browse files
authored
Merge pull request #2534 from github/nora/run-local-query-panel
Queries Panel: run local query from panel
2 parents 971d146 + 2b48991 commit 13a5b78

File tree

7 files changed

+51
-22
lines changed

7 files changed

+51
-22
lines changed

extensions/ql-vscode/package.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,11 @@
501501
"command": "codeQL.copyVersion",
502502
"title": "CodeQL: Copy Version Information"
503503
},
504+
{
505+
"command": "codeQLQueries.runLocalQueryFromQueriesPanel",
506+
"title": "Run local query",
507+
"icon": "$(run)"
508+
},
504509
{
505510
"command": "codeQLVariantAnalysisRepositories.openConfigFile",
506511
"title": "Open database configuration file",
@@ -1095,6 +1100,11 @@
10951100
"group": "1_queryHistory@1",
10961101
"when": "viewItem == remoteResultsItem"
10971102
},
1103+
{
1104+
"command": "codeQLQueries.runLocalQueryFromQueriesPanel",
1105+
"group": "inline",
1106+
"when": "view == codeQLQueries && viewItem == queryFile && codeQL.currentDatabaseItem"
1107+
},
10981108
{
10991109
"command": "codeQLTests.showOutputDifferences",
11001110
"group": "qltest@1",
@@ -1154,6 +1164,10 @@
11541164
"command": "codeQL.runQuery",
11551165
"when": "resourceLangId == ql && resourceExtname == .ql"
11561166
},
1167+
{
1168+
"command": "codeQLQueries.runLocalQueryFromQueriesPanel",
1169+
"when": "false"
1170+
},
11571171
{
11581172
"command": "codeQL.runQueryContextEditor",
11591173
"when": "false"

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type {
1212
VariantAnalysisScannedRepositoryResult,
1313
} from "../variant-analysis/shared/variant-analysis";
1414
import type { QLDebugConfiguration } from "../debugger/debug-configuration";
15+
import type { QueryTreeViewItem } from "../queries-panel/query-tree-view-item";
1516

1617
// A command function matching the signature that VS Code calls when
1718
// a command is invoked from a context menu on a TreeView with
@@ -129,6 +130,7 @@ export type LocalQueryCommands = {
129130
"codeQL.runQueryOnMultipleDatabasesContextEditor": (
130131
uri?: Uri,
131132
) => Promise<void>;
133+
"codeQLQueries.runLocalQueryFromQueriesPanel": TreeViewContextSingleSelectionCommandFunction<QueryTreeViewItem>;
132134
"codeQL.runQueries": ExplorerSelectionCommandFunction<Uri>;
133135
"codeQL.quickEval": (uri: Uri) => Promise<void>;
134136
"codeQL.quickEvalContextEditor": (uri: Uri) => Promise<void>;

extensions/ql-vscode/src/local-queries/local-queries.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ import { SkeletonQueryWizard } from "../skeleton-query-wizard";
4848
import { LocalQueryRun } from "./local-query-run";
4949
import { createMultiSelectionCommand } from "../common/vscode/selection-commands";
5050
import { findLanguage } from "../codeql-cli/query-language";
51+
import { QueryTreeViewItem } from "../queries-panel/query-tree-view-item";
5152

5253
interface DatabaseQuickPickItem extends QuickPickItem {
5354
databaseItem: DatabaseItem;
@@ -100,6 +101,8 @@ export class LocalQueries extends DisposableObject {
100101
this.runQueryOnMultipleDatabases.bind(this),
101102
"codeQL.runQueryOnMultipleDatabasesContextEditor":
102103
this.runQueryOnMultipleDatabases.bind(this),
104+
"codeQLQueries.runLocalQueryFromQueriesPanel":
105+
this.runQueryFromQueriesPanel.bind(this),
103106
"codeQL.runQueries": createMultiSelectionCommand(
104107
this.runQueries.bind(this),
105108
),
@@ -118,6 +121,12 @@ export class LocalQueries extends DisposableObject {
118121
};
119122
}
120123

124+
private async runQueryFromQueriesPanel(
125+
queryTreeViewItem: QueryTreeViewItem,
126+
): Promise<void> {
127+
await this.runQuery(Uri.file(queryTreeViewItem.path));
128+
}
129+
121130
private async runQuery(uri: Uri | undefined): Promise<void> {
122131
await withProgress(
123132
async (progress, token) => {

extensions/ql-vscode/src/queries-panel/queries-module.ts

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,27 @@ import { QueryDiscovery } from "./query-discovery";
88
import { QueryPackDiscovery } from "./query-pack-discovery";
99

1010
export class QueriesModule extends DisposableObject {
11+
private queriesPanel: QueriesPanel | undefined;
12+
1113
private constructor(readonly app: App) {
1214
super();
1315
}
1416

17+
public static initialize(
18+
app: App,
19+
cliServer: CodeQLCliServer,
20+
): QueriesModule {
21+
const queriesModule = new QueriesModule(app);
22+
app.subscriptions.push(queriesModule);
23+
24+
queriesModule.initialize(app, cliServer);
25+
return queriesModule;
26+
}
27+
1528
private initialize(app: App, cliServer: CodeQLCliServer): void {
29+
// Currently, we only want to expose the new panel when we are in canary mode
30+
// and the user has enabled the "Show queries panel" flag.
1631
if (!isCanary() || !showQueriesPanel()) {
17-
// Currently, we only want to expose the new panel when we are in canary mode
18-
// and the user has enabled the "Show queries panel" flag.
1932
return;
2033
}
2134
void extLogger.log("Initializing queries panel.");
@@ -31,18 +44,7 @@ export class QueriesModule extends DisposableObject {
3144
this.push(queryDiscovery);
3245
void queryDiscovery.initialRefresh();
3346

34-
const queriesPanel = new QueriesPanel(queryDiscovery);
35-
this.push(queriesPanel);
36-
}
37-
38-
public static initialize(
39-
app: App,
40-
cliServer: CodeQLCliServer,
41-
): QueriesModule {
42-
const queriesModule = new QueriesModule(app);
43-
app.subscriptions.push(queriesModule);
44-
45-
queriesModule.initialize(app, cliServer);
46-
return queriesModule;
47+
this.queriesPanel = new QueriesPanel(queryDiscovery);
48+
this.push(this.queriesPanel);
4749
}
4850
}

extensions/ql-vscode/src/queries-panel/queries-panel.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
import * as vscode from "vscode";
21
import { DisposableObject } from "../common/disposable-object";
32
import { QueryTreeDataProvider } from "./query-tree-data-provider";
43
import { QueryDiscovery } from "./query-discovery";
4+
import { window } from "vscode";
55

66
export class QueriesPanel extends DisposableObject {
77
public constructor(queryDiscovery: QueryDiscovery) {
88
super();
99

1010
const dataProvider = new QueryTreeDataProvider(queryDiscovery);
1111

12-
const treeView = vscode.window.createTreeView("codeQLQueries", {
12+
const treeView = window.createTreeView("codeQLQueries", {
1313
treeDataProvider: dataProvider,
1414
});
1515
this.push(treeView);

extensions/ql-vscode/src/queries-panel/query-tree-view-item.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,23 @@ import * as vscode from "vscode";
33
export class QueryTreeViewItem extends vscode.TreeItem {
44
constructor(
55
name: string,
6-
path: string,
6+
public readonly path: string,
77
language: string | undefined,
88
public readonly children: QueryTreeViewItem[],
99
) {
1010
super(name);
1111
this.tooltip = path;
12-
this.description = language;
13-
this.collapsibleState = this.children.length
14-
? vscode.TreeItemCollapsibleState.Collapsed
15-
: vscode.TreeItemCollapsibleState.None;
1612
if (this.children.length === 0) {
13+
this.description = language;
14+
this.collapsibleState = vscode.TreeItemCollapsibleState.None;
15+
this.contextValue = "queryFile";
1716
this.command = {
1817
title: "Open",
1918
command: "vscode.open",
2019
arguments: [vscode.Uri.file(path)],
2120
};
21+
} else {
22+
this.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed;
2223
}
2324
}
2425
}

extensions/ql-vscode/test/unit-tests/command-lint.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ describe("commands declared in package.json", () => {
3939
commandTitles[command] = title!;
4040
} else if (
4141
command.match(/^codeQLDatabases\./) ||
42+
command.match(/^codeQLQueries\./) ||
4243
command.match(/^codeQLVariantAnalysisRepositories\./) ||
4344
command.match(/^codeQLQueryHistory\./) ||
4445
command.match(/^codeQLAstViewer\./) ||

0 commit comments

Comments
 (0)