import * as vscode from 'vscode';
import * as fs from 'fs';
interface LITTaskDefinition extends vscode.TaskDefinition {
/**
* The task name
*/
task: string;
}
export class LITTaskProvider implements vscode.TaskProvider {
static LITType: string = 'llvm-lit';
private cmd: string;
private args: string[] = [];
private litPromise: Thenable<vscode.Task[]> | undefined = undefined;
constructor() {
const isWindows = process.platform === 'win32';
if (isWindows) {
this.cmd = "py"
this.args = ["-3", "${config:cmake.buildDirectory}\\bin\\llvm-lit.py", "-vv"]
} else {
this.cmd = "python3"
this.args = ["${config:cmake.buildDirectory}/bin/llvm-lit", "-vv"]
}
}
public provideTasks(): Thenable<vscode.Task[]> | undefined {
if (!this.litPromise) {
this.litPromise = this.getLITTasks();
}
return this.litPromise;
}
public resolveTask(_task: vscode.Task): vscode.Task | undefined {
const task = _task.definition.task;
if (task) {
let args: string[] = this.args;
const definition: LITTaskDefinition = <any>_task.definition;
if (definition.task === 'llvm-lit file') {
args.push("${file}")
} else if (definition.task === 'llvm-lit directory') {
args.push("${fileDirname}")
}
return new vscode.Task(
definition,
definition.task,
'llvm',
new vscode.ShellExecution(this.cmd, args),
["$llvm-lit", "$llvm-filecheck"]
);
}
return undefined;
}
private async getLITTasks(): Promise<vscode.Task[]> {
let result: vscode.Task[] = [];
let bld_dir: string | undefined = vscode.workspace.getConfiguration().get("cmake.buildDirectory");
if (bld_dir == undefined || !fs.existsSync(bld_dir)) {
return result;
}
let taskName = 'llvm-lit file';
result.push(new vscode.Task({ type: 'llvm-lit', task: taskName },
taskName, 'llvm',
new vscode.ShellExecution(this.cmd, this.args.concat(["${file}"])),
["$llvm-lit", "$llvm-filecheck"]));
taskName = 'llvm-lit directory';
result.push(new vscode.Task({ type: 'llvm-lit', task: taskName },
taskName, 'llvm',
new vscode.ShellExecution(this.cmd, this.args.concat(["${fileDirname}"])),
["$llvm-lit", "$llvm-filecheck"])
);
return result;
}
}