Skip to content

Commit

Permalink
Auto merge of #18320 - davidbarsky:davidbarsky/fix-lldb-dap-calling-r…
Browse files Browse the repository at this point in the history
…ustc, r=Veykril

internal: fix lldb-dap unconditionally calling rustc

Fixes rust-lang/rust-analyzer#18318. I also took the opportunity to refactor how `discoverSourceFileMap` worked—it now returns a type instead of mutating a map in place.

I tested this change using the LLDB DAP extension. I needed to set `"lldb-dap.executable-path": "/Applications/Xcode.app/Contents/Developer/usr/bin/lldb-dap"` for everything to work, however, but once I did, was able to successfully debug a test.
  • Loading branch information
bors committed Oct 18, 2024
2 parents 03cfa8e + 325d48f commit 4fc5172
Showing 1 changed file with 27 additions and 16 deletions.
43 changes: 27 additions & 16 deletions src/tools/rust-analyzer/editors/code/src/debug.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import type * as ra from "./lsp_ext";
import { Cargo } from "./toolchain";
import type { Ctx } from "./ctx";
import { createTaskFromRunnable, prepareEnv } from "./run";
import { execSync } from "node:child_process";
import { execute, isCargoRunnableArgs, unwrapUndefinable } from "./util";
import type { Config } from "./config";

Expand Down Expand Up @@ -152,9 +151,24 @@ async function getDebugConfiguration(
const env = prepareEnv(inheritEnv, runnable.label, runnableArgs, config.runnablesExtraEnv);
const executable = await getDebugExecutable(runnableArgs, env);
let sourceFileMap = debugOptions.sourceFileMap;

if (sourceFileMap === "auto") {
sourceFileMap = {};
await discoverSourceFileMap(sourceFileMap, env, wsFolder);
const computedSourceFileMap = await discoverSourceFileMap(env, wsFolder);

if (computedSourceFileMap) {
// lldb-dap requires passing the source map as an array of two element arrays.
// the two element array contains a source and destination pathname.
// TODO: remove lldb-dap-specific post-processing once
// https://github.com/llvm/llvm-project/pull/106919/ is released in the extension.
if (provider.type === "lldb-dap") {
provider.additional["sourceMap"] = [
[computedSourceFileMap?.source, computedSourceFileMap?.destination],
];
} else {
sourceFileMap[computedSourceFileMap.source] = computedSourceFileMap.destination;
}
}
}

const debugConfig = getDebugConfig(
Expand Down Expand Up @@ -189,11 +203,15 @@ async function getDebugConfiguration(
return debugConfig;
}

type SourceFileMap = {
source: string;
destination: string;
};

async function discoverSourceFileMap(
sourceFileMap: Record<string, string>,
env: Record<string, string>,
cwd: string,
) {
): Promise<SourceFileMap | undefined> {
const sysroot = env["RUSTC_TOOLCHAIN"];
if (sysroot) {
// let's try to use the default toolchain
Expand All @@ -203,9 +221,11 @@ async function discoverSourceFileMap(
const commitHash = rx.exec(data)?.[1];
if (commitHash) {
const rustlib = path.normalize(sysroot + "/lib/rustlib/src/rust");
sourceFileMap[`/rustc/${commitHash}/`] = rustlib;
return { source: rustlib, destination: rustlib };
}
}

return;
}

type PropertyFetcher<Config, Input, Key extends keyof Config> = (
Expand All @@ -218,7 +238,7 @@ type DebugConfigProvider<Type extends string, DebugConfig extends BaseDebugConfi
runnableArgsProperty: PropertyFetcher<DebugConfig, ra.CargoRunnableArgs, keyof DebugConfig>;
sourceFileMapProperty?: keyof DebugConfig;
type: Type;
additional?: Record<string, unknown>;
additional: Record<string, unknown>;
};

type KnownEnginesType = (typeof knownEngines)[keyof typeof knownEngines];
Expand All @@ -236,16 +256,7 @@ const knownEngines: {
"args",
runnableArgs.executableArgs,
],
additional: {
sourceMap: [
[
`/rustc/${/commit-hash:\s(.*)$/m.exec(
execSync("rustc -V -v", {}).toString(),
)?.[1]}/library`,
"${config:rust-analyzer.cargo.sysroot}/lib/rustlib/src/rust/library",
],
],
},
additional: {},
},
"vadimcn.vscode-lldb": {
type: "lldb",
Expand Down

0 comments on commit 4fc5172

Please sign in to comment.