Skip to content

Commit d7ea3ce

Browse files
Create Bazel task provider
1 parent 566a346 commit d7ea3ce

File tree

3 files changed

+61
-2
lines changed

3 files changed

+61
-2
lines changed

package.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,12 @@
4242
"group": "MenuViewTitle"
4343
}
4444
]
45-
}
45+
},
46+
"taskDefinitions": [
47+
{
48+
"type": "bazel"
49+
}
50+
]
4651
},
4752
"scripts": {
4853
"vscode:prepublish": "gulp build-plugin",

src/bazelTaskProvider.ts

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
2+
import * as vscode from 'vscode';
3+
4+
export class BazelTaskProvider implements vscode.TaskProvider {
5+
6+
static BazelType = 'bazel';
7+
private bazelPromise: Thenable<vscode.Task[]> | undefined = undefined;
8+
9+
public provideTasks(): Thenable<vscode.Task[]> | undefined {
10+
if (!this.bazelPromise) {
11+
this.bazelPromise = getBazelTasks();
12+
}
13+
return this.bazelPromise;
14+
}
15+
16+
public resolveTask(_task: vscode.Task): vscode.Task | undefined {
17+
const task = _task.definition.task;
18+
if (task) {
19+
// resolveTask requires that the same definition object be used.
20+
const definition: BazelTaskDefinition = <any>_task.definition;
21+
return new vscode.Task(definition, _task.scope ?? vscode.TaskScope.Workspace, definition.task, 'bazel', new vscode.ShellExecution(`bazel ${definition.task}`));
22+
}
23+
return undefined;
24+
}
25+
26+
}
27+
28+
interface BazelTaskDefinition extends vscode.TaskDefinition {
29+
30+
}
31+
32+
async function getBazelTasks(): Promise<vscode.Task[]> {
33+
const result: vscode.Task[] = [];
34+
35+
const kind: BazelTaskDefinition = {
36+
type: 'bazel',
37+
};
38+
39+
result.push(new vscode.Task(kind, vscode.TaskScope.Workspace, 'Build', 'bazel', new vscode.ShellExecution(`bazel build //...`)));
40+
result.push(new vscode.Task(kind, vscode.TaskScope.Workspace, 'Test', 'bazel', new vscode.ShellExecution(`bazel test //...`)));
41+
result.push(new vscode.Task(kind, vscode.TaskScope.Workspace, 'Dependencies', 'bazel', new vscode.ShellExecution(`bazel query --notool_deps --noimplicit_deps \"deps(//...)\" --output graph`)));
42+
43+
return result;
44+
}

src/extension.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import * as vscode from 'vscode';
22
import * as path from 'path';
33
import * as pieditor from './editor';
4+
import { BazelTaskProvider } from './bazelTaskProvider';
5+
6+
let bazelTaskProvider: vscode.Disposable | undefined;
47

58
export function activate(context: vscode.ExtensionContext) {
69
let panel: vscode.WebviewPanel | undefined = undefined;
@@ -49,7 +52,14 @@ export function activate(context: vscode.ExtensionContext) {
4952
});
5053

5154
context.subscriptions.push(viewTitleDisp);
55+
56+
bazelTaskProvider = vscode.tasks.registerTaskProvider(BazelTaskProvider.BazelType, new BazelTaskProvider());
57+
5258
}
5359

5460
// this method is called when your extension is deactivated
55-
export function deactivate() { }
61+
export function deactivate() {
62+
if (bazelTaskProvider) {
63+
bazelTaskProvider.dispose();
64+
}
65+
}

0 commit comments

Comments
 (0)