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