11import * as vscode from "vscode" ;
2+ import { getProjectDir } from "./project" ;
23
34export 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