Uniformed way to get Debug Lens target executable.

This commit is contained in:
vsrs 2020-05-06 16:01:35 +03:00
parent 1116c9a0e9
commit c4ca6e29c2
2 changed files with 37 additions and 28 deletions

View file

@ -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);
}; };
} }

View file

@ -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,
}; };
} }
} }