xref: /llvm-project/llvm/utils/vscode/llvm/src/litTaskProvider.ts (revision 1f7badf9793b9591e324d5e94e0c47843a4c0cd2)
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