Skip to content

Commit 45158a6

Browse files
authored
Support tasks for all workspace folders (#488)
1 parent 2269a91 commit 45158a6

File tree

1 file changed

+119
-227
lines changed

1 file changed

+119
-227
lines changed

src/taskProvider.ts

Lines changed: 119 additions & 227 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import * as vscode from "vscode";
2+
import { getProjectDir } from "./project";
23

34
export class TaskProvider implements vscode.TaskProvider {
45
// Referenced in package.json::taskDefinitions
56
static TaskType = "mix";
67

78
public provideTasks(): vscode.Task[] {
89
const wsFolders = vscode.workspace.workspaceFolders;
9-
if (!wsFolders || !wsFolders[0]) {
10+
if (!wsFolders || wsFolders.length === 0) {
1011
vscode.window.showErrorMessage("no workspace open...");
1112
return [];
1213
}
@@ -16,234 +17,125 @@ export class TaskProvider implements vscode.TaskProvider {
1617

1718
const tasks = [];
1819

19-
const test = new vscode.Task(
20-
{ type: TaskProvider.TaskType, task: "Run tests" },
21-
wsFolders[0],
22-
"Run tests",
23-
TaskProvider.TaskType,
24-
new vscode.ShellExecution("mix test"),
25-
["$mixCompileError", "$mixCompileWarning", "$mixTestFailure"],
26-
);
27-
28-
test.group = vscode.TaskGroup.Test;
29-
30-
tasks.push(test);
31-
32-
const testCoverage = new vscode.Task(
33-
{ type: TaskProvider.TaskType, task: "Run tests with coverage" },
34-
wsFolders[0],
35-
"Run tests with coverage",
36-
TaskProvider.TaskType,
37-
new vscode.ShellExecution("mix test.coverage"),
38-
["$mixCompileError", "$mixCompileWarning", "$mixTestFailure"],
39-
);
40-
41-
testCoverage.group = vscode.TaskGroup.Test;
42-
43-
tasks.push(testCoverage);
44-
45-
const testUnderCursorTask = new vscode.Task(
46-
{ type: TaskProvider.TaskType, task: "Run test at cursor" },
47-
wsFolders[0],
48-
"Run test at cursor",
49-
TaskProvider.TaskType,
50-
new vscode.ShellExecution("mix test ${relativeFile}:${lineNumber}"),
51-
["$mixCompileError", "$mixCompileWarning", "$mixTestFailure"],
52-
);
53-
54-
testUnderCursorTask.group = vscode.TaskGroup.Test;
55-
56-
tasks.push(testUnderCursorTask);
57-
58-
const testsInFileTask = new vscode.Task(
59-
{ type: TaskProvider.TaskType, task: "Run tests in current file" },
60-
wsFolders[0],
61-
"Run tests in current file",
62-
TaskProvider.TaskType,
63-
new vscode.ShellExecution("mix test ${relativeFile}"),
64-
["$mixCompileError", "$mixCompileWarning", "$mixTestFailure"],
65-
);
66-
67-
testsInFileTask.group = vscode.TaskGroup.Test;
68-
69-
tasks.push(testsInFileTask);
70-
71-
const compile = new vscode.Task(
72-
{ type: TaskProvider.TaskType, task: "Build" },
73-
wsFolders[0],
74-
"Build",
75-
TaskProvider.TaskType,
76-
new vscode.ShellExecution("mix compile"),
77-
["$mixCompileError", "$mixCompileWarning"],
78-
);
79-
80-
compile.group = vscode.TaskGroup.Build;
81-
82-
tasks.push(compile);
83-
84-
const depsCompile = new vscode.Task(
85-
{ type: TaskProvider.TaskType, task: "Build dependencies" },
86-
wsFolders[0],
87-
"Build dependencies",
88-
TaskProvider.TaskType,
89-
new vscode.ShellExecution("mix deps.compile"),
90-
["$mixCompileError", "$mixCompileWarning"],
91-
);
92-
93-
depsCompile.group = vscode.TaskGroup.Build;
94-
95-
tasks.push(depsCompile);
96-
97-
const clean = new vscode.Task(
98-
{ type: TaskProvider.TaskType, task: "Clean project" },
99-
wsFolders[0],
100-
"Clean project",
101-
TaskProvider.TaskType,
102-
new vscode.ShellExecution("mix clean"),
103-
);
104-
105-
clean.group = vscode.TaskGroup.Clean;
106-
107-
tasks.push(clean);
108-
109-
const cleanWithDeps = new vscode.Task(
110-
{ type: TaskProvider.TaskType, task: "Clean project and deps" },
111-
wsFolders[0],
112-
"Clean project and deps",
113-
TaskProvider.TaskType,
114-
new vscode.ShellExecution("mix clean --deps"),
115-
);
116-
117-
cleanWithDeps.group = vscode.TaskGroup.Clean;
118-
119-
tasks.push(cleanWithDeps);
120-
121-
const appTree = new vscode.Task(
122-
{ type: TaskProvider.TaskType, task: "Print app tree" },
123-
wsFolders[0],
124-
"Print app tree",
125-
TaskProvider.TaskType,
126-
new vscode.ShellExecution("mix app.tree"),
127-
);
128-
129-
tasks.push(appTree);
130-
131-
const deps = new vscode.Task(
132-
{ type: TaskProvider.TaskType, task: "List deps" },
133-
wsFolders[0],
134-
"List deps",
135-
TaskProvider.TaskType,
136-
new vscode.ShellExecution("mix deps"),
137-
);
138-
139-
tasks.push(deps);
140-
141-
const depsCleanAll = new vscode.Task(
142-
{ type: TaskProvider.TaskType, task: "Clean all deps" },
143-
wsFolders[0],
144-
"Clean all deps",
145-
TaskProvider.TaskType,
146-
new vscode.ShellExecution("mix deps.clean --all"),
147-
);
148-
149-
depsCleanAll.group = vscode.TaskGroup.Clean;
150-
151-
tasks.push(depsCleanAll);
152-
153-
const depsCleanUnused = new vscode.Task(
154-
{ type: TaskProvider.TaskType, task: "Clean all unused deps" },
155-
wsFolders[0],
156-
"Clean all unused deps",
157-
TaskProvider.TaskType,
158-
new vscode.ShellExecution("mix deps.clean --unlock --unused"),
159-
);
160-
161-
depsCleanUnused.group = vscode.TaskGroup.Clean;
162-
163-
tasks.push(depsCleanUnused);
164-
165-
const depsGet = new vscode.Task(
166-
{ type: TaskProvider.TaskType, task: "Get deps" },
167-
wsFolders[0],
168-
"Get deps",
169-
TaskProvider.TaskType,
170-
new vscode.ShellExecution("mix deps.get"),
171-
);
172-
173-
tasks.push(depsGet);
174-
175-
const depsUpdateAll = new vscode.Task(
176-
{ type: TaskProvider.TaskType, task: "Update all deps" },
177-
wsFolders[0],
178-
"Update all deps",
179-
TaskProvider.TaskType,
180-
new vscode.ShellExecution("mix deps.update --all"),
181-
);
182-
183-
tasks.push(depsUpdateAll);
184-
185-
const format = new vscode.Task(
186-
{ type: TaskProvider.TaskType, task: "Format" },
187-
wsFolders[0],
188-
"Format",
189-
TaskProvider.TaskType,
190-
new vscode.ShellExecution("mix format"),
191-
);
192-
193-
tasks.push(format);
194-
195-
const run = new vscode.Task(
196-
{ type: TaskProvider.TaskType, task: "Run" },
197-
wsFolders[0],
198-
"Run",
199-
TaskProvider.TaskType,
200-
new vscode.ShellExecution("mix run"),
201-
);
202-
203-
tasks.push(run);
204-
205-
const runNoHalt = new vscode.Task(
206-
{ type: TaskProvider.TaskType, task: "Run no halt" },
207-
wsFolders[0],
208-
"Run no halt",
209-
TaskProvider.TaskType,
210-
new vscode.ShellExecution("mix run --no-halt"),
211-
);
212-
213-
tasks.push(runNoHalt);
214-
215-
const releaseInit = new vscode.Task(
20+
const taskSpecs = [
21621
{
217-
type: TaskProvider.TaskType,
218-
task: "Generates sample files for releases",
22+
name: "Run tests",
23+
command: "mix test",
24+
group: vscode.TaskGroup.Test,
25+
matchers: ["$mixCompileError", "$mixCompileWarning", "$mixTestFailure"],
21926
},
220-
wsFolders[0],
221-
"Generates sample files for releases",
222-
TaskProvider.TaskType,
223-
new vscode.ShellExecution("mix release.init"),
224-
);
225-
226-
tasks.push(releaseInit);
227-
228-
const xrefTraceFile = new vscode.Task(
229-
{ type: TaskProvider.TaskType, task: "Trace file dependencies" },
230-
wsFolders[0],
231-
"Trace file dependencies",
232-
TaskProvider.TaskType,
233-
new vscode.ShellExecution("mix xref trace ${relativeFile}"),
234-
);
235-
236-
tasks.push(xrefTraceFile);
237-
238-
const xrefGraph = new vscode.Task(
239-
{ type: TaskProvider.TaskType, task: "Print file dependency graph" },
240-
wsFolders[0],
241-
"Print file dependency graph",
242-
TaskProvider.TaskType,
243-
new vscode.ShellExecution("mix xref graph"),
244-
);
245-
246-
tasks.push(xrefGraph);
27+
{
28+
name: "Run tests with coverage",
29+
command: "mix test.coverage",
30+
group: vscode.TaskGroup.Test,
31+
matchers: ["$mixCompileError", "$mixCompileWarning", "$mixTestFailure"],
32+
},
33+
{
34+
name: "Run test at cursor",
35+
command: "mix test ${relativeFile}:${lineNumber}",
36+
group: vscode.TaskGroup.Test,
37+
matchers: ["$mixCompileError", "$mixCompileWarning", "$mixTestFailure"],
38+
},
39+
{
40+
name: "Run tests in current file",
41+
command: "mix test ${relativeFile}",
42+
group: vscode.TaskGroup.Test,
43+
matchers: ["$mixCompileError", "$mixCompileWarning", "$mixTestFailure"],
44+
},
45+
{
46+
name: "Build",
47+
command: "mix compile",
48+
group: vscode.TaskGroup.Build,
49+
matchers: ["$mixCompileError", "$mixCompileWarning"],
50+
},
51+
{
52+
name: "Build dependencies",
53+
command: "mix deps.compile",
54+
group: vscode.TaskGroup.Build,
55+
matchers: ["$mixCompileError", "$mixCompileWarning"],
56+
},
57+
{
58+
name: "Clean project",
59+
command: "mix clean",
60+
group: vscode.TaskGroup.Clean,
61+
},
62+
{
63+
name: "Clean project and deps",
64+
command: "mix clean --deps",
65+
group: vscode.TaskGroup.Clean,
66+
},
67+
{
68+
name: "Print app tree",
69+
command: "mix app.tree",
70+
},
71+
{
72+
name: "List deps",
73+
command: "mix deps",
74+
},
75+
{
76+
name: "Clean all deps",
77+
command: "mix deps.clean --all",
78+
group: vscode.TaskGroup.Clean,
79+
},
80+
{
81+
name: "Clean all unused deps",
82+
command: "mix deps.clean --unlock --unused",
83+
group: vscode.TaskGroup.Clean,
84+
},
85+
{
86+
name: "Get deps",
87+
command: "mix deps.get",
88+
},
89+
{
90+
name: "Update all deps",
91+
command: "mix deps.update --all",
92+
},
93+
{
94+
name: "Format",
95+
command: "mix format",
96+
},
97+
{
98+
name: "Run",
99+
command: "mix run",
100+
},
101+
{
102+
name: "Run no halt",
103+
command: "mix run --no-halt",
104+
},
105+
{
106+
name: "Generates sample files for releases",
107+
command: "mix release.init",
108+
},
109+
{
110+
name: "Trace file dependencies",
111+
command: "mix xref trace ${relativeFile}",
112+
},
113+
{
114+
name: "Print file dependency graph",
115+
command: "mix xref graph",
116+
},
117+
];
118+
119+
for (const folder of wsFolders) {
120+
const projectDir = getProjectDir(folder);
121+
122+
for (const spec of taskSpecs) {
123+
const task = new vscode.Task(
124+
{ type: TaskProvider.TaskType, task: spec.name },
125+
folder,
126+
spec.name,
127+
TaskProvider.TaskType,
128+
new vscode.ShellExecution(spec.command, { cwd: projectDir }),
129+
spec.matchers,
130+
);
131+
132+
if (spec.group) {
133+
task.group = spec.group;
134+
}
135+
136+
tasks.push(task);
137+
}
138+
}
247139

248140
return tasks;
249141
}

0 commit comments

Comments
 (0)