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