Skip to content

Commit

Permalink
Add basic support for Native Debug
Browse files Browse the repository at this point in the history
  • Loading branch information
lnicola committed Feb 29, 2024
1 parent 0ac05c0 commit 26352e1
Showing 1 changed file with 48 additions and 12 deletions.
60 changes: 48 additions & 12 deletions editors/code/src/debug.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,9 @@ async function getDebugConfiguration(
if (!editor) return;

const knownEngines: Record<string, DebugConfigProvider> = {
"vadimcn.vscode-lldb": getLldbDebugConfig,
"ms-vscode.cpptools": getCppvsDebugConfig,
"ms-vscode.cpptools": getCCppDebugConfig,
"vadimcn.vscode-lldb": getCodeLldbDebugConfig,
"webfreak.debug": getNativeDebugConfig,
};
const debugOptions = ctx.config.debug;

Expand All @@ -97,12 +98,14 @@ async function getDebugConfiguration(
}

if (!debugEngine) {
const commandCCpp: string = createCommandLink("ms-vscode.cpptools");
const commandCodeLLDB: string = createCommandLink("vadimcn.vscode-lldb");
const commandCpp: string = createCommandLink("ms-vscode.cpptools");
const commandNativeDebug: string = createCommandLink("webfreak.debug");

await vscode.window.showErrorMessage(
`Install [CodeLLDB](command:${commandCodeLLDB} "Open CodeLLDB")` +
` or [C/C++](command:${commandCpp} "Open C/C++") extension for debugging.`,
`, [C/C++](command:${commandCCpp} "Open C/C++") ` +
`or [Native Debug](command:${commandNativeDebug} "Open Native Debug") for debugging.`,
);
return;
}
Expand All @@ -120,7 +123,7 @@ async function getDebugConfiguration(
!isMultiFolderWorkspace || !runnable.args.workspaceRoot
? firstWorkspace
: workspaceFolders.find((w) => runnable.args.workspaceRoot?.includes(w.uri.fsPath)) ||
firstWorkspace;
firstWorkspace;

const workspace = unwrapUndefinable(maybeWorkspace);
const wsFolder = path.normalize(workspace.uri.fsPath);
Expand Down Expand Up @@ -184,41 +187,74 @@ async function getDebugExecutableInfo(
return executableInfo;
}

function getLldbDebugConfig(
function getCCppDebugConfig(
runnable: ra.Runnable,
executable: string,
cargoWorkspace: string,
env: Record<string, string>,
sourceFileMap?: Record<string, string>,
): vscode.DebugConfiguration {
return {
type: "lldb",
type: os.platform() === "win32" ? "cppvsdbg" : "cppdbg",
request: "launch",
name: runnable.label,
program: executable,
args: runnable.args.executableArgs,
cwd: cargoWorkspace || runnable.args.workspaceRoot,
sourceMap: sourceFileMap,
sourceLanguages: ["rust"],
sourceFileMap,
env,
};
}

function getCppvsDebugConfig(
function getCodeLldbDebugConfig(
runnable: ra.Runnable,
executable: string,
cargoWorkspace: string,
env: Record<string, string>,
sourceFileMap?: Record<string, string>,
): vscode.DebugConfiguration {
return {
type: os.platform() === "win32" ? "cppvsdbg" : "cppdbg",
type: "lldb",
request: "launch",
name: runnable.label,
program: executable,
args: runnable.args.executableArgs,
cwd: cargoWorkspace || runnable.args.workspaceRoot,
sourceFileMap,
sourceMap: sourceFileMap,
sourceLanguages: ["rust"],
env,
};
}

function getNativeDebugConfig(
runnable: ra.Runnable,
executable: string,
cargoWorkspace: string,
env: Record<string, string>,
_sourceFileMap?: Record<string, string>,
): vscode.DebugConfiguration {
return {
type: "gdb",
request: "launch",
name: runnable.label,
target: executable,
// See https://github.com/WebFreak001/code-debug/issues/359
arguments: quote(runnable.args.executableArgs),
cwd: cargoWorkspace || runnable.args.workspaceRoot,
env,
valuesFormatting: "prettyPrinters",
};
}

// Based on https://github.com/ljharb/shell-quote/blob/main/quote.js
function quote(xs: string[]) {
return xs.map(function (s) {
if ((/["\s]/).test(s) && !(/'/).test(s)) {
return "'" + s.replace(/(['\\])/g, '\\$1') + "'";
}
if ((/["'\s]/).test(s)) {
return '"' + s.replace(/(["\\$`!])/g, '\\$1') + '"';
}
return s.replace(/([A-Za-z]:)?([#!"$&'()*,:;<=>?@[\\\]^`{|}])/g, '$1\\$2');
}).join(' ');
}

0 comments on commit 26352e1

Please sign in to comment.