Add special auto value for debug.sourceFileMap

This commit is contained in:
vsrs 2021-04-22 16:09:46 +03:00
parent 8f781e782c
commit 1ebfe11730
5 changed files with 38 additions and 27 deletions

View file

@ -353,8 +353,9 @@
"Use [MS C++ tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)" "Use [MS C++ tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools)"
] ]
}, },
"rust-analyzer.debug.sourceFileMap": { "rust-analyzer.debug.sourceFileMap": {
"type": "object", "type": ["object", "string"],
"const": "auto",
"description": "Optional source file mappings passed to the debug engine.", "description": "Optional source file mappings passed to the debug engine.",
"default": { "default": {
"/rustc/<id>": "${env:USERPROFILE}/.rustup/toolchains/<toolchain-id>/lib/rustlib/src/rust" "/rustc/<id>": "${env:USERPROFILE}/.rustup/toolchains/<toolchain-id>/lib/rustlib/src/rust"

View file

@ -134,8 +134,12 @@ export class Config {
} }
get debug() { get debug() {
// "/rustc/<id>" used by suggestions only. let sourceFileMap = this.get<Record<string, string> | "auto">("debug.sourceFileMap");
const { ["/rustc/<id>"]: _, ...sourceFileMap } = this.get<Record<string, string>>("debug.sourceFileMap"); if (sourceFileMap !== "auto") {
// "/rustc/<id>" used by suggestions only.
const { ["/rustc/<id>"]: _, ...trimmed } = this.get<Record<string, string>>("debug.sourceFileMap");
sourceFileMap = trimmed;
}
return { return {
engine: this.get<string>("debug.engine"), engine: this.get<string>("debug.engine"),

View file

@ -3,7 +3,7 @@ import * as vscode from 'vscode';
import * as path from 'path'; import * as path from 'path';
import * as ra from './lsp_ext'; import * as ra from './lsp_ext';
import { Cargo, sysrootForDir as getSysroot } from './toolchain'; import { Cargo, getSysroot } from './toolchain';
import { Ctx } from "./ctx"; import { Ctx } from "./ctx";
import { prepareEnv } from "./run"; import { prepareEnv } from "./run";
@ -105,11 +105,11 @@ async function getDebugConfiguration(ctx: Ctx, runnable: ra.Runnable): Promise<v
const executable = await getDebugExecutable(runnable); const executable = await getDebugExecutable(runnable);
const env = prepareEnv(runnable, ctx.config.runnableEnv); const env = prepareEnv(runnable, ctx.config.runnableEnv);
let sourceFileMap = debugOptions.sourceFileMap; let sourceFileMap = debugOptions.sourceFileMap;
if ( !sourceFileMap || Object.keys(sourceFileMap).length === 0 ) { if (sourceFileMap === "auto") {
// let's try to use the default toolchain // let's try to use the default toolchain
const sysroot = await getSysroot(wsFolder); const sysroot = await getSysroot(wsFolder);
const rustlib_src = path.normalize(sysroot + "/lib/rustlib/src/rust"); const rustlib = path.normalize(sysroot + "/lib/rustlib/src/rust");
sourceFileMap = { "/rustc/*": rustlib_src }; sourceFileMap = { "/rustc/*": rustlib };
} }
const debugConfig = knownEngines[debugEngine.id](runnable, simplifyPath(executable), env, sourceFileMap); const debugConfig = knownEngines[debugEngine.id](runnable, simplifyPath(executable), env, sourceFileMap);

View file

@ -4,7 +4,7 @@ import * as path from 'path';
import * as fs from 'fs'; import * as fs from 'fs';
import * as readline from 'readline'; import * as readline from 'readline';
import { OutputChannel } from 'vscode'; import { OutputChannel } from 'vscode';
import { log, memoize } from './util'; import { execute, log, memoize } from './util';
interface CompilationArtifact { interface CompilationArtifact {
fileName: string; fileName: string;
@ -122,24 +122,11 @@ export class Cargo {
} }
/** Mirrors `project_model::sysroot::discover_sysroot_dir()` implementation*/ /** Mirrors `project_model::sysroot::discover_sysroot_dir()` implementation*/
export function sysrootForDir(dir: string): Promise<string> { export function getSysroot(dir: string): Promise<string> {
const rustc_path = getPathForExecutable("rustc"); const rustcPath = getPathForExecutable("rustc");
return new Promise((resolve, reject) => { // do not memoize the result because the toolchain may change between runs
cp.exec(`${rustc_path} --print sysroot`, { cwd: dir }, (err, stdout, stderr) => { return execute(`${rustcPath} --print sysroot`, { cwd: dir });
if (err) {
reject(err);
return;
}
if (stderr) {
reject(new Error(stderr));
return;
}
resolve(stdout.trimEnd());
});
});
} }
/** Mirrors `toolchain::cargo()` implementation */ /** Mirrors `toolchain::cargo()` implementation */

View file

@ -1,7 +1,7 @@
import * as lc from "vscode-languageclient/node"; import * as lc from "vscode-languageclient/node";
import * as vscode from "vscode"; import * as vscode from "vscode";
import { strict as nativeAssert } from "assert"; import { strict as nativeAssert } from "assert";
import { spawnSync } from "child_process"; import { exec, ExecOptions, spawnSync } from "child_process";
import { inspect } from "util"; import { inspect } from "util";
export function assert(condition: boolean, explanation: string): asserts condition { export function assert(condition: boolean, explanation: string): asserts condition {
@ -141,3 +141,22 @@ export function memoize<Ret, TThis, Param extends string>(func: (this: TThis, ar
return result; return result;
}; };
} }
/** Awaitable wrapper around `child_process.exec` */
export function execute(command: string, options: ExecOptions): Promise<string> {
return new Promise((resolve, reject) => {
exec(command, options, (err, stdout, stderr) => {
if (err) {
reject(err);
return;
}
if (stderr) {
reject(new Error(stderr));
return;
}
resolve(stdout.trimEnd());
});
});
}