1import * as vscode from 'vscode'; 2import * as fs from 'fs'; 3 4interface LITTaskDefinition extends vscode.TaskDefinition { 5 /** 6 * The task name 7 */ 8 task: string; 9} 10 11export class LITTaskProvider implements vscode.TaskProvider { 12 static LITType: string = 'llvm-lit'; 13 private cmd: string; 14 private args: string[] = []; 15 private litPromise: Thenable<vscode.Task[]> | undefined = undefined; 16 17 constructor() { 18 const isWindows = process.platform === 'win32'; 19 if (isWindows) { 20 this.cmd = "py" 21 this.args = ["-3", "${config:cmake.buildDirectory}\\bin\\llvm-lit.py", "-vv"] 22 } else { 23 this.cmd = "python3" 24 this.args = ["${config:cmake.buildDirectory}/bin/llvm-lit", "-vv"] 25 } 26 } 27 28 public provideTasks(): Thenable<vscode.Task[]> | undefined { 29 if (!this.litPromise) { 30 this.litPromise = this.getLITTasks(); 31 } 32 return this.litPromise; 33 } 34 35 public resolveTask(_task: vscode.Task): vscode.Task | undefined { 36 const task = _task.definition.task; 37 if (task) { 38 let args: string[] = this.args; 39 const definition: LITTaskDefinition = <any>_task.definition; 40 if (definition.task === 'llvm-lit file') { 41 args.push("${file}") 42 } else if (definition.task === 'llvm-lit directory') { 43 args.push("${fileDirname}") 44 } 45 46 return new vscode.Task( 47 definition, 48 definition.task, 49 'llvm', 50 new vscode.ShellExecution(this.cmd, args), 51 ["$llvm-lit", "$llvm-filecheck"] 52 ); 53 } 54 return undefined; 55 } 56 57 private async getLITTasks(): Promise<vscode.Task[]> { 58 let result: vscode.Task[] = []; 59 60 let bld_dir: string | undefined = vscode.workspace.getConfiguration().get("cmake.buildDirectory"); 61 if (bld_dir == undefined || !fs.existsSync(bld_dir)) { 62 return result; 63 } 64 65 let taskName = 'llvm-lit file'; 66 result.push(new vscode.Task({ type: 'llvm-lit', task: taskName }, 67 taskName, 'llvm', 68 new vscode.ShellExecution(this.cmd, this.args.concat(["${file}"])), 69 ["$llvm-lit", "$llvm-filecheck"])); 70 71 taskName = 'llvm-lit directory'; 72 result.push(new vscode.Task({ type: 'llvm-lit', task: taskName }, 73 taskName, 'llvm', 74 new vscode.ShellExecution(this.cmd, this.args.concat(["${fileDirname}"])), 75 ["$llvm-lit", "$llvm-filecheck"]) 76 ); 77 return result; 78 } 79} 80