Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'editors/code/src/toolchain.ts')
| -rw-r--r-- | editors/code/src/toolchain.ts | 74 |
1 files changed, 39 insertions, 35 deletions
diff --git a/editors/code/src/toolchain.ts b/editors/code/src/toolchain.ts index 681932c93b..c23a9a8d9e 100644 --- a/editors/code/src/toolchain.ts +++ b/editors/code/src/toolchain.ts @@ -1,9 +1,9 @@ -import * as cp from 'child_process'; -import * as os from 'os'; -import * as path from 'path'; -import * as readline from 'readline'; -import * as vscode from 'vscode'; -import { execute, log, memoizeAsync } from './util'; +import * as cp from "child_process"; +import * as os from "os"; +import * as path from "path"; +import * as readline from "readline"; +import * as vscode from "vscode"; +import { execute, log, memoizeAsync } from "./util"; interface CompilationArtifact { fileName: string; @@ -18,7 +18,7 @@ export interface ArtifactSpec { } export class Cargo { - constructor(readonly rootFolder: string, readonly output: vscode.OutputChannel) { } + constructor(readonly rootFolder: string, readonly output: vscode.OutputChannel) {} // Made public for testing purposes static artifactSpec(args: readonly string[]): ArtifactSpec { @@ -27,7 +27,9 @@ export class Cargo { // arguments for a runnable from the quick pick should be updated. // see crates\rust-analyzer\src\main_loop\handlers.rs, handle_code_lens switch (cargoArgs[0]) { - case "run": cargoArgs[0] = "build"; break; + case "run": + cargoArgs[0] = "build"; + break; case "test": { if (!cargoArgs.includes("--no-run")) { cargoArgs.push("--no-run"); @@ -40,7 +42,7 @@ export class Cargo { if (cargoArgs[0] === "test") { // for instance, `crates\rust-analyzer\tests\heavy_tests\main.rs` tests // produce 2 artifacts: {"kind": "bin"} and {"kind": "test"} - result.filter = (artifacts) => artifacts.filter(it => it.isTest); + result.filter = (artifacts) => artifacts.filter((it) => it.isTest); } return result; @@ -50,24 +52,25 @@ export class Cargo { const artifacts: CompilationArtifact[] = []; try { - await this.runCargo(spec.cargoArgs, - message => { - if (message.reason === 'compiler-artifact' && message.executable) { - const isBinary = message.target.crate_types.includes('bin'); - const isBuildScript = message.target.kind.includes('custom-build'); + await this.runCargo( + spec.cargoArgs, + (message) => { + if (message.reason === "compiler-artifact" && message.executable) { + const isBinary = message.target.crate_types.includes("bin"); + const isBuildScript = message.target.kind.includes("custom-build"); if ((isBinary && !isBuildScript) || message.profile.test) { artifacts.push({ fileName: message.executable, name: message.target.name, kind: message.target.kind[0], - isTest: message.profile.test + isTest: message.profile.test, }); } - } else if (message.reason === 'compiler-message') { + } else if (message.reason === "compiler-message") { this.output.append(message.message.rendered); } }, - stderr => this.output.append(stderr), + (stderr) => this.output.append(stderr) ); } catch (err) { this.output.show(true); @@ -81,9 +84,9 @@ export class Cargo { const artifacts = await this.getArtifacts(Cargo.artifactSpec(args)); if (artifacts.length === 0) { - throw new Error('No compilation artifacts'); + throw new Error("No compilation artifacts"); } else if (artifacts.length > 1) { - throw new Error('Multiple compilation artifacts are not supported.'); + throw new Error("Multiple compilation artifacts are not supported."); } return artifacts[0].fileName; @@ -97,25 +100,23 @@ export class Cargo { const path = await cargoPath(); return await new Promise((resolve, reject) => { const cargo = cp.spawn(path, cargoArgs, { - stdio: ['ignore', 'pipe', 'pipe'], - cwd: this.rootFolder + stdio: ["ignore", "pipe", "pipe"], + cwd: this.rootFolder, }); - cargo.on('error', err => reject(new Error(`could not launch cargo: ${err}`))); + cargo.on("error", (err) => reject(new Error(`could not launch cargo: ${err}`))); - cargo.stderr.on('data', chunk => onStderrString(chunk.toString())); + cargo.stderr.on("data", (chunk) => onStderrString(chunk.toString())); const rl = readline.createInterface({ input: cargo.stdout }); - rl.on('line', line => { + rl.on("line", (line) => { const message = JSON.parse(line); onStdoutJson(message); }); - cargo.on('exit', (exitCode, _) => { - if (exitCode === 0) - resolve(exitCode); - else - reject(new Error(`exit code: ${exitCode}.`)); + cargo.on("exit", (exitCode, _) => { + if (exitCode === 0) resolve(exitCode); + else reject(new Error(`exit code: ${exitCode}.`)); }); }); } @@ -158,7 +159,12 @@ export const getPathForExecutable = memoizeAsync( try { // hmm, `os.homedir()` seems to be infallible // it is not mentioned in docs and cannot be infered by the type signature... - const standardPath = vscode.Uri.joinPath(vscode.Uri.file(os.homedir()), ".cargo", "bin", executableName); + const standardPath = vscode.Uri.joinPath( + vscode.Uri.file(os.homedir()), + ".cargo", + "bin", + executableName + ); if (await isFileAtUri(standardPath)) return standardPath.fsPath; } catch (err) { @@ -169,13 +175,11 @@ export const getPathForExecutable = memoizeAsync( ); async function lookupInPath(exec: string): Promise<boolean> { - const paths = process.env.PATH ?? "";; + const paths = process.env.PATH ?? ""; - const candidates = paths.split(path.delimiter).flatMap(dirInPath => { + const candidates = paths.split(path.delimiter).flatMap((dirInPath) => { const candidate = path.join(dirInPath, exec); - return os.type() === "Windows_NT" - ? [candidate, `${candidate}.exe`] - : [candidate]; + return os.type() === "Windows_NT" ? [candidate, `${candidate}.exe`] : [candidate]; }); for await (const isFile of candidates.map(isFileAtPath)) { |