1
1
import * as vscode from "vscode" ;
2
+ import { getProjectDir } from "./project" ;
2
3
3
4
export class TaskProvider implements vscode . TaskProvider {
4
5
// Referenced in package.json::taskDefinitions
5
6
static TaskType = "mix" ;
6
7
7
8
public provideTasks ( ) : vscode . Task [ ] {
8
9
const wsFolders = vscode . workspace . workspaceFolders ;
9
- if ( ! wsFolders || ! wsFolders [ 0 ] ) {
10
+ if ( ! wsFolders || wsFolders . length === 0 ) {
10
11
vscode . window . showErrorMessage ( "no workspace open..." ) ;
11
12
return [ ] ;
12
13
}
@@ -16,234 +17,125 @@ export class TaskProvider implements vscode.TaskProvider {
16
17
17
18
const tasks = [ ] ;
18
19
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 = [
216
21
{
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" ] ,
219
26
} ,
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
+ }
247
139
248
140
return tasks ;
249
141
}
0 commit comments