mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
Uniformed way to get Debug Lens target executable.
This commit is contained in:
parent
1116c9a0e9
commit
c4ca6e29c2
2 changed files with 37 additions and 28 deletions
|
@ -64,29 +64,19 @@ export function runSingle(ctx: Ctx): Cmd {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function getLldbDebugConfig(config: ra.Runnable, sourceFileMap: Record<string, string>): vscode.DebugConfiguration {
|
function getLldbDebugConfig(config: ra.Runnable, executable: string, sourceFileMap?: Record<string, string>): vscode.DebugConfiguration {
|
||||||
return {
|
return {
|
||||||
type: "lldb",
|
type: "lldb",
|
||||||
request: "launch",
|
request: "launch",
|
||||||
name: config.label,
|
name: config.label,
|
||||||
cargo: {
|
program: executable,
|
||||||
args: config.args,
|
|
||||||
},
|
|
||||||
args: config.extraArgs,
|
args: config.extraArgs,
|
||||||
cwd: config.cwd,
|
cwd: config.cwd,
|
||||||
sourceMap: sourceFileMap
|
sourceMap: sourceFileMap
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const debugOutput = vscode.window.createOutputChannel("Debug");
|
function getCppvsDebugConfig(config: ra.Runnable, executable: string, sourceFileMap?: Record<string, string>): vscode.DebugConfiguration {
|
||||||
|
|
||||||
async function getCppvsDebugConfig(config: ra.Runnable, sourceFileMap: Record<string, string>): Promise<vscode.DebugConfiguration> {
|
|
||||||
debugOutput.clear();
|
|
||||||
|
|
||||||
const cargo = new Cargo(config.cwd || '.', debugOutput);
|
|
||||||
const executable = await cargo.executableFromArgs(config.args);
|
|
||||||
|
|
||||||
// if we are here, there were no compilation errors.
|
|
||||||
return {
|
return {
|
||||||
type: (os.platform() === "win32") ? "cppvsdbg" : 'cppdbg',
|
type: (os.platform() === "win32") ? "cppvsdbg" : 'cppdbg',
|
||||||
request: "launch",
|
request: "launch",
|
||||||
|
@ -98,36 +88,53 @@ async function getCppvsDebugConfig(config: ra.Runnable, sourceFileMap: Record<st
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const debugOutput = vscode.window.createOutputChannel("Debug");
|
||||||
|
|
||||||
|
async function getDebugExecutable(config: ra.Runnable): Promise<string> {
|
||||||
|
debugOutput.clear();
|
||||||
|
|
||||||
|
const cargo = new Cargo(config.cwd || '.', debugOutput);
|
||||||
|
const executable = await cargo.executableFromArgs(config.args);
|
||||||
|
|
||||||
|
// if we are here, there were no compilation errors.
|
||||||
|
return executable;
|
||||||
|
}
|
||||||
|
|
||||||
|
type DebugConfigProvider = (config: ra.Runnable, executable: string, sourceFileMap?: Record<string, string>) => vscode.DebugConfiguration;
|
||||||
|
|
||||||
export function debugSingle(ctx: Ctx): Cmd {
|
export function debugSingle(ctx: Ctx): Cmd {
|
||||||
return async (config: ra.Runnable) => {
|
return async (config: ra.Runnable) => {
|
||||||
const editor = ctx.activeRustEditor;
|
const editor = ctx.activeRustEditor;
|
||||||
if (!editor) return;
|
if (!editor) return;
|
||||||
|
|
||||||
const lldbId = "vadimcn.vscode-lldb";
|
const knownEngines: Record<string, DebugConfigProvider> = {
|
||||||
const cpptoolsId = "ms-vscode.cpptools";
|
"vadimcn.vscode-lldb": getLldbDebugConfig,
|
||||||
|
"ms-vscode.cpptools": getCppvsDebugConfig
|
||||||
|
};
|
||||||
|
const debugOptions = ctx.config.debug;
|
||||||
|
|
||||||
const debugEngineId = ctx.config.debug.engine;
|
|
||||||
let debugEngine = null;
|
let debugEngine = null;
|
||||||
if (debugEngineId === "auto") {
|
if (debugOptions.engine === "auto") {
|
||||||
debugEngine = vscode.extensions.getExtension(lldbId);
|
for (var engineId in knownEngines) {
|
||||||
if (!debugEngine) {
|
debugEngine = vscode.extensions.getExtension(engineId);
|
||||||
debugEngine = vscode.extensions.getExtension(cpptoolsId);
|
if (debugEngine) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
debugEngine = vscode.extensions.getExtension(debugEngineId);
|
debugEngine = vscode.extensions.getExtension(debugOptions.engine);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!debugEngine) {
|
if (!debugEngine) {
|
||||||
vscode.window.showErrorMessage(`Install [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=${lldbId})`
|
vscode.window.showErrorMessage(`Install [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb)`
|
||||||
+ ` or [MS C++ tools](https://marketplace.visualstudio.com/items?itemName=${cpptoolsId}) extension for debugging.`);
|
+ ` or [MS C++ tools](https://marketplace.visualstudio.com/items?itemName=ms-vscode.cpptools) extension for debugging.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const debugConfig = lldbId === debugEngine.id
|
const executable = await getDebugExecutable(config);
|
||||||
? getLldbDebugConfig(config, ctx.config.debug.sourceFileMap)
|
const debugConfig = knownEngines[debugEngine.id](config, executable, debugOptions.sourceFileMap);
|
||||||
: await getCppvsDebugConfig(config, ctx.config.debug.sourceFileMap);
|
|
||||||
|
|
||||||
|
debugOutput.appendLine("Launching debug configuration:");
|
||||||
|
debugOutput.appendLine(JSON.stringify(debugConfig, null, 2));
|
||||||
return vscode.debug.startDebugging(undefined, debugConfig);
|
return vscode.debug.startDebugging(undefined, debugConfig);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -108,10 +108,12 @@ export class Config {
|
||||||
}
|
}
|
||||||
|
|
||||||
get debug() {
|
get debug() {
|
||||||
|
// "/rustc/<id>" used by suggestions only.
|
||||||
|
const { ["/rustc/<id>"]: _, ...sourceFileMap } = this.get<Record<string, string>>("debug.sourceFileMap");
|
||||||
|
|
||||||
return {
|
return {
|
||||||
engine: this.get<string>("debug.engine"),
|
engine: this.get<string>("debug.engine"),
|
||||||
sourceFileMap: this.get<Record<string, string>>("debug.sourceFileMap"),
|
sourceFileMap: sourceFileMap,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue