https://github.com/vogelsgesang updated 
https://github.com/llvm/llvm-project/pull/125843

>From 48e900c6a8bd24c7cbee057eb0d96b9f0b2b4f84 Mon Sep 17 00:00:00 2001
From: Adrian Vogelsgesang <avogelsges...@salesforce.com>
Date: Wed, 5 Feb 2025 10:11:38 +0000
Subject: [PATCH 1/3] [lldb-dap] Support vscode launch URLs

This commit adds support for starting debug sessions through special
`vscode://llvm-vs-code-extensions.lldb-dap/launch/config?config={launch-config}`
URIs. This allows tighter integration with custom scripts. One potential
use case is providing similar functionality to `xcdebug`, see #125777
for some discussion on that use case.

The functionality was inspired by @vadimcn's CodeLLDB extension, which
[provides similar 
functionality](https://github.com/vadimcn/codelldb/blob/master/MANUAL.md#debugging-externally-launched-code).
---
 lldb/tools/lldb-dap/README.md                 | 16 +++++++-
 lldb/tools/lldb-dap/package.json              |  3 +-
 lldb/tools/lldb-dap/src-ts/extension.ts       |  5 +++
 .../lldb-dap/src-ts/uri-launch-handler.ts     | 37 +++++++++++++++++++
 4 files changed, 59 insertions(+), 2 deletions(-)
 create mode 100644 lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts

diff --git a/lldb/tools/lldb-dap/README.md b/lldb/tools/lldb-dap/README.md
index 123869a033724..34876c4c37cb6 100644
--- a/lldb/tools/lldb-dap/README.md
+++ b/lldb/tools/lldb-dap/README.md
@@ -174,6 +174,20 @@ The default hostname being used `localhost`.
 }
 ```
 
+### Launching via `vscode://` URIs
+
+Debugging sessions can also be starting using special URIs.
+
+The 
`vscode://llvm-vs-code-extensions.lldb-dap/launch/config?config={launch-config}`
+URI accepts a [URL-encoded](https://en.wikipedia.org/wiki/Percent-encoding)
+JSON launch config.
+
+This is useful, e.g., to integrate with custom scripts which start debugging
+sessions. The URIs might be printed to the terminal, potentially using
+[OSC-8 
hyperlinks](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda),
+or passed to `vscode --open-url` or `xdg-open`, although mileage may vary
+depending on your specific debugging setup.
+
 ### Configuration Settings Reference
 
 For both launch and attach configurations, lldb-dap accepts the following 
`lldb-dap`
@@ -328,4 +342,4 @@ The source code is part of the [LLVM 
repository](https://github.com/llvm/llvm-pr
 We use Github's [issue 
tracker](https://github.com/llvm/llvm-project/issues?q=label%3Alldb-dap) and 
patches can be submitted via [pull 
requests](https://github.com/llvm/llvm-project/pulls?q=label%3Alldb-dap).
 Furthermore, there is a [LLDB 
category](https://discourse.llvm.org/c/subprojects/lldb/8) on the LLVM 
discourse forum.
 
-For instructions on how to get started with development on lldb-dap, see the 
"[Contributing to lldb-dap](https://lldb.llvm.org/resources/lldbdap.html)"
+For instructions on how to get started with development on lldb-dap, see the 
"[Contributing to lldb-dap](https://lldb.llvm.org/resources/lldbdap.html)" 
guide.
diff --git a/lldb/tools/lldb-dap/package.json b/lldb/tools/lldb-dap/package.json
index cd450a614b3f7..428624f46feba 100644
--- a/lldb/tools/lldb-dap/package.json
+++ b/lldb/tools/lldb-dap/package.json
@@ -35,7 +35,8 @@
     "typescript": "^5.7.3"
   },
   "activationEvents": [
-    "onDebug"
+    "onDebug",
+    "onUri"
   ],
   "main": "./out/extension",
   "scripts": {
diff --git a/lldb/tools/lldb-dap/src-ts/extension.ts 
b/lldb/tools/lldb-dap/src-ts/extension.ts
index a07bcdebcb68b..f0c7fb5bd1a71 100644
--- a/lldb/tools/lldb-dap/src-ts/extension.ts
+++ b/lldb/tools/lldb-dap/src-ts/extension.ts
@@ -5,6 +5,7 @@ import {
   isExecutable,
 } from "./debug-adapter-factory";
 import { DisposableContext } from "./disposable-context";
+import { LaunchUriHandler } from "./uri-launch-handler";
 
 /**
  * This class represents the extension and manages its life cycle. Other 
extensions
@@ -37,6 +38,10 @@ export class LLDBDapExtension extends DisposableContext {
         }
       }),
     );
+
+    this.pushSubscription(
+      vscode.window.registerUriHandler(new LaunchUriHandler())
+    );
   }
 }
 
diff --git a/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts 
b/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts
new file mode 100644
index 0000000000000..0a29ddda05713
--- /dev/null
+++ b/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts
@@ -0,0 +1,37 @@
+import * as vscode from "vscode";
+
+export class LaunchUriHandler implements vscode.UriHandler {
+    async handleUri(uri: vscode.Uri) {
+        try {
+            const params = new URLSearchParams(uri.query);
+            if (uri.path == '/launch/config') {
+                const configJson = params.get("config");
+                if (configJson === null) {
+                    throw new Error("Missing `config` URI parameter");
+                }
+                // Build the debug config
+                let debugConfig: vscode.DebugConfiguration = {
+                    type: 'lldb-dap',
+                    request: 'launch',
+                    name: '',
+                };
+                Object.assign(debugConfig, JSON.parse(configJson));
+                debugConfig.name = debugConfig.name || debugConfig.program || 
"Adhoc Launch";
+                // Force the type to `lldb-dap`. We don't want to allow 
launching any other
+                // Debug Adapters using this URI scheme.
+                if (debugConfig.type != "lldb-dap") {
+                    throw new Error(`Unsupported debugger type: 
${debugConfig.type}`);
+                }
+                await vscode.debug.startDebugging(undefined, debugConfig);
+            } else {
+                throw new Error(`Unsupported Uri path: ${uri.path}`);
+            }
+        } catch (err) {
+            if (err instanceof Error) {
+                await vscode.window.showErrorMessage(`Failed to handle 
lldb-dap URI request: ${err.message}`);
+            } else {
+                await vscode.window.showErrorMessage(`Failed to handle 
lldb-dap URI request`);
+            }
+        }
+    }
+}
\ No newline at end of file

>From b315e09158dafea47d106f4fdad0250568a4d295 Mon Sep 17 00:00:00 2001
From: Adrian Vogelsgesang <avogelsges...@salesforce.com>
Date: Wed, 5 Feb 2025 19:13:24 +0000
Subject: [PATCH 2/3] Address review comments

---
 lldb/tools/lldb-dap/README.md                    | 4 ++--
 lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/lldb/tools/lldb-dap/README.md b/lldb/tools/lldb-dap/README.md
index 34876c4c37cb6..4966d5a82c2d7 100644
--- a/lldb/tools/lldb-dap/README.md
+++ b/lldb/tools/lldb-dap/README.md
@@ -182,8 +182,8 @@ The 
`vscode://llvm-vs-code-extensions.lldb-dap/launch/config?config={launch-conf
 URI accepts a [URL-encoded](https://en.wikipedia.org/wiki/Percent-encoding)
 JSON launch config.
 
-This is useful, e.g., to integrate with custom scripts which start debugging
-sessions. The URIs might be printed to the terminal, potentially using
+This is useful for integration with custom scripts to start debugging
+sessions. The URI might be printed to the terminal, potentially using
 [OSC-8 
hyperlinks](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda),
 or passed to `vscode --open-url` or `xdg-open`, although mileage may vary
 depending on your specific debugging setup.
diff --git a/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts 
b/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts
index 0a29ddda05713..a7f5c3b79fb7b 100644
--- a/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts
+++ b/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts
@@ -9,7 +9,7 @@ export class LaunchUriHandler implements vscode.UriHandler {
                 if (configJson === null) {
                     throw new Error("Missing `config` URI parameter");
                 }
-                // Build the debug config
+                // Build the debug config.
                 let debugConfig: vscode.DebugConfiguration = {
                     type: 'lldb-dap',
                     request: 'launch',

>From be0484ce607f4f3d9cb73a7c6c7855c63d5d8bfc Mon Sep 17 00:00:00 2001
From: Adrian Vogelsgesang <avogelsges...@salesforce.com>
Date: Tue, 11 Mar 2025 13:02:17 +0000
Subject: [PATCH 3/3] Address more review comments

---
 lldb/tools/lldb-dap/README.md                    | 8 +++++---
 lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts | 9 +++++----
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/lldb/tools/lldb-dap/README.md b/lldb/tools/lldb-dap/README.md
index 4966d5a82c2d7..bc732ef7c0695 100644
--- a/lldb/tools/lldb-dap/README.md
+++ b/lldb/tools/lldb-dap/README.md
@@ -178,15 +178,17 @@ The default hostname being used `localhost`.
 
 Debugging sessions can also be starting using special URIs.
 
-The 
`vscode://llvm-vs-code-extensions.lldb-dap/launch/config?config={launch-config}`
+The `vscode://llvm-vs-code-extensions.lldb-dap/start?config={launch-config}`
 URI accepts a [URL-encoded](https://en.wikipedia.org/wiki/Percent-encoding)
 JSON launch config.
 
 This is useful for integration with custom scripts to start debugging
 sessions. The URI might be printed to the terminal, potentially using
 [OSC-8 
hyperlinks](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda),
-or passed to `vscode --open-url` or `xdg-open`, although mileage may vary
-depending on your specific debugging setup.
+or passed to `code --open-url` or `xdg-open`, although mileage may vary 
depending
+on your specific debugging setup. E.g., `code --open-url` will not work when 
using a
+SSH remote session. Furthermore, placeholders such as `${workspaceFolder}` are 
not
+supported within launch URLs.
 
 ### Configuration Settings Reference
 
diff --git a/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts 
b/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts
index a7f5c3b79fb7b..a6e0ad5ce64ee 100644
--- a/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts
+++ b/lldb/tools/lldb-dap/src-ts/uri-launch-handler.ts
@@ -4,7 +4,7 @@ export class LaunchUriHandler implements vscode.UriHandler {
     async handleUri(uri: vscode.Uri) {
         try {
             const params = new URLSearchParams(uri.query);
-            if (uri.path == '/launch/config') {
+            if (uri.path == '/start') {
                 const configJson = params.get("config");
                 if (configJson === null) {
                     throw new Error("Missing `config` URI parameter");
@@ -16,7 +16,8 @@ export class LaunchUriHandler implements vscode.UriHandler {
                     name: '',
                 };
                 Object.assign(debugConfig, JSON.parse(configJson));
-                debugConfig.name = debugConfig.name || debugConfig.program || 
"Adhoc Launch";
+                const defaultName = debugConfig.request == 'launch' ? 
"URL-based Launch" : "URL-based Attach";
+                debugConfig.name = debugConfig.name || debugConfig.program || 
defaultName;
                 // Force the type to `lldb-dap`. We don't want to allow 
launching any other
                 // Debug Adapters using this URI scheme.
                 if (debugConfig.type != "lldb-dap") {
@@ -30,8 +31,8 @@ export class LaunchUriHandler implements vscode.UriHandler {
             if (err instanceof Error) {
                 await vscode.window.showErrorMessage(`Failed to handle 
lldb-dap URI request: ${err.message}`);
             } else {
-                await vscode.window.showErrorMessage(`Failed to handle 
lldb-dap URI request`);
+                await vscode.window.showErrorMessage(`Failed to handle 
lldb-dap URI request: ${JSON.stringify(err)}`);
             }
         }
     }
-}
\ No newline at end of file
+}

_______________________________________________
lldb-commits mailing list
lldb-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to