Skip to content

Commit d9c81f3

Browse files
committed
Added configure/build/clean context menus where appropriate to meson project view.
Moved reconfigure button to project node from sidebar header (when multiple roots / build dirs are supported, header position wouldn't make sense). Build icons from vscode-cmake-tools.
1 parent 459c3e0 commit d9c81f3

File tree

8 files changed

+127
-14
lines changed

8 files changed

+127
-14
lines changed

package.json

Lines changed: 72 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,11 @@
6666
},
6767
{
6868
"command": "mesonbuild.build",
69-
"title": "Meson: Build"
69+
"title": "Meson: Build",
70+
"icon": {
71+
"dark": "res/build-icon-dark.svg",
72+
"light": "res/build-icon-light.svg"
73+
}
7074
},
7175
{
7276
"command": "mesonbuild.test",
@@ -88,6 +92,26 @@
8892
"command": "mesonbuild.restartLanguageServer",
8993
"title": "Meson: Restart Language Server"
9094
},
95+
{
96+
"command": "mesonbuild.node.reconfigure",
97+
"title": "Reconfigure",
98+
"icon": {
99+
"dark": "res/meson_32.svg",
100+
"light": "res/meson_32.svg"
101+
}
102+
},
103+
{
104+
"command": "mesonbuild.node.build",
105+
"title": "Build",
106+
"icon": {
107+
"dark": "res/build-icon-dark.svg",
108+
"light": "res/build-icon-light.svg"
109+
}
110+
},
111+
{
112+
"command": "mesonbuild.node.clean",
113+
"title": "Clean"
114+
},
91115
{
92116
"command": "mesonbuild.node.runAll",
93117
"title": "Run all",
@@ -398,11 +422,46 @@
398422
},
399423
"menus": {
400424
"view/item/context": [
425+
{
426+
"command": "mesonbuild.node.reconfigure",
427+
"when": "view == meson-project && viewItem == meson-projectroot",
428+
"group": "inline"
429+
},
430+
{
431+
"command": "mesonbuild.node.reconfigure",
432+
"when": "view == meson-project && viewItem == meson-projectroot",
433+
"group": "build@0"
434+
},
435+
{
436+
"command": "mesonbuild.node.build",
437+
"when": "view == meson-project && viewItem == meson-projectroot",
438+
"group": "inline"
439+
},
440+
{
441+
"command": "mesonbuild.node.build",
442+
"when": "view == meson-project && viewItem == meson-projectroot",
443+
"group": "build@1"
444+
},
445+
{
446+
"command": "mesonbuild.node.clean",
447+
"when": "view == meson-project && viewItem == meson-projectroot",
448+
"group": "build@2"
449+
},
401450
{
402451
"command": "mesonbuild.openBuildFile",
403452
"when": "view == meson-project && viewItem == meson-target",
404453
"group": "inline"
405454
},
455+
{
456+
"command": "mesonbuild.openBuildFile",
457+
"when": "view == meson-project && viewItem == meson-target",
458+
"group": "build"
459+
},
460+
{
461+
"command": "mesonbuild.node.build",
462+
"when": "view == meson-project && viewItem == meson-target",
463+
"group": "build"
464+
},
406465
{
407466
"command": "mesonbuild.node.runAll",
408467
"when": "view == meson-project && viewItem == meson-test-root",
@@ -424,18 +483,23 @@
424483
"group": "run"
425484
}
426485
],
427-
"view/title": [
428-
{
429-
"command": "mesonbuild.reconfigure",
430-
"when": "view == meson-project",
431-
"group": "navigation"
432-
}
433-
],
434486
"commandPalette": [
435487
{
436488
"command": "mesonbuild.openBuildFile",
437489
"when": "false"
438490
},
491+
{
492+
"command": "mesonbuild.node.reconfigure",
493+
"when": "false"
494+
},
495+
{
496+
"command": "mesonbuild.node.build",
497+
"when": "false"
498+
},
499+
{
500+
"command": "mesonbuild.node.clean",
501+
"when": "false"
502+
},
439503
{
440504
"command": "mesonbuild.node.run",
441505
"when": "false"

res/build-icon-dark.svg

Lines changed: 8 additions & 0 deletions
Loading

res/build-icon-light.svg

Lines changed: 8 additions & 0 deletions
Loading

src/extension.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { activateFormatters } from "./formatters";
2121
import { SettingsKey, TaskQuickPickItem } from "./types";
2222
import { createLanguageServerClient } from "./lsp/common";
2323
import { dirname, relative } from "path";
24-
import { IRunnableNode } from "./treeview/nodes/base";
24+
import { IBuildableNode, IRunnableNode } from "./treeview/nodes/base";
2525

2626
export let extensionPath: string;
2727
export let workspaceState: vscode.Memento;
@@ -202,6 +202,22 @@ export async function activate(ctx: vscode.ExtensionContext) {
202202
}),
203203
);
204204

205+
ctx.subscriptions.push(
206+
vscode.commands.registerCommand("mesonbuild.node.reconfigure", async () => {
207+
runFirstTask("reconfigure");
208+
}),
209+
);
210+
211+
ctx.subscriptions.push(
212+
vscode.commands.registerCommand("mesonbuild.node.build", async (node: IBuildableNode) => node.build()),
213+
);
214+
215+
ctx.subscriptions.push(
216+
vscode.commands.registerCommand("mesonbuild.node.clean", async () => {
217+
runFirstTask("clean");
218+
}),
219+
);
220+
205221
// Two commands just to have different icons.
206222
ctx.subscriptions.push(
207223
vscode.commands.registerCommand("mesonbuild.node.runAll", async (node: IRunnableNode) => node.run()),

src/tasks.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ function createReconfigureTask(buildDir: string, sourceDir: string) {
6868
export async function getMesonTasks(buildDir: string, sourceDir: string) {
6969
try {
7070
const defaultBuildTask = new vscode.Task(
71-
{ type: "meson", mode: "build" },
71+
{ type: "meson", mode: "build", target: pseudoAllTarget },
7272
"Build all targets",
7373
"Meson",
7474
new vscode.ShellExecution(extensionConfiguration("mesonPath"), ["compile", "-C", buildDir]),

src/treeview/nodes/base.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ export abstract class BaseDirectoryNode<T> extends BaseNode {
3232
abstract buildFileTree(fpaths: T[]): FolderMap<T> | Thenable<FolderMap<T>>;
3333
}
3434

35+
// A node in the meson tree view that can be built.
36+
export interface IBuildableNode {
37+
build(): Thenable<any>;
38+
}
39+
3540
// A node in the meson tree view that can be run.
3641
export interface IRunnableNode {
3742
run(): Thenable<any>;

src/treeview/nodes/targets.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { BaseNode } from "../basenode";
55
import { Target, Targets } from "../../types";
66
import { TargetSourcesRootNode, TargetGeneratedSourcesRootNode } from "./sources";
77
import { extensionRelative, getTargetName } from "../../utils";
8-
import { BaseDirectoryNode } from "./base";
8+
import { BaseDirectoryNode, IBuildableNode } from "./base";
99

1010
export class TargetDirectoryNode extends BaseDirectoryNode<Target> {
1111
constructor(parentId: string, folder: string, targets: Targets) {
@@ -72,7 +72,7 @@ export class TargetDirectoryNode extends BaseDirectoryNode<Target> {
7272
}
7373
}
7474

75-
export class TargetNode extends BaseNode {
75+
export class TargetNode extends BaseNode implements IBuildableNode {
7676
constructor(
7777
parentId: string,
7878
private readonly target: Target,
@@ -123,6 +123,10 @@ export class TargetNode extends BaseNode {
123123
return item;
124124
}
125125

126+
async build() {
127+
return vscode.commands.executeCommand("mesonbuild.build", await getTargetName(this.target));
128+
}
129+
126130
private getIconPath() {
127131
switch (this.target.type) {
128132
case "executable":

src/treeview/nodes/toplevel.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import * as vscode from "vscode";
22

33
import { BaseNode } from "../basenode";
4-
import { ProjectInfo, Subproject, Targets, Tests } from "../../types";
4+
import { ProjectInfo, Subproject, Targets, Tests, pseudoAllTarget } from "../../types";
55
import { extensionRelative } from "../../utils";
66
import { TargetDirectoryNode } from "./targets";
77
import { getMesonBenchmarks, getMesonTargets, getMesonTests } from "../../introspection";
88
import { TestRootNode } from "./tests";
9+
import { IBuildableNode } from "./base";
910

10-
export class ProjectNode extends BaseNode {
11+
export class ProjectNode extends BaseNode implements IBuildableNode {
1112
constructor(
1213
private readonly project: ProjectInfo,
1314
projectDir: string,
@@ -26,6 +27,9 @@ export class ProjectNode extends BaseNode {
2627
item.iconPath = extensionRelative("res/meson_32.svg");
2728
item.collapsibleState = vscode.TreeItemCollapsibleState.Expanded;
2829

30+
// To key in to "when": "view == meson-project && viewItem == test" in package.json.
31+
item.contextValue = "meson-projectroot";
32+
2933
return item;
3034
}
3135

@@ -60,6 +64,10 @@ export class ProjectNode extends BaseNode {
6064

6165
return children;
6266
}
67+
68+
async build() {
69+
return vscode.commands.executeCommand("mesonbuild.build", pseudoAllTarget);
70+
}
6371
}
6472

6573
class SubprojectsRootNode extends BaseNode {

0 commit comments

Comments
 (0)