diff --git a/package-lock.json b/package-lock.json index 5bce57e..2d3db18 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "probe-rs-debugger", - "version": "0.26.0", + "version": "0.31.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "probe-rs-debugger", - "version": "0.26.0", + "version": "0.31.0", "license": "(MIT OR Apache-2.0)", "devDependencies": { "@types/mocha": "^10.0.10", @@ -17,7 +17,7 @@ "@vscode/debugadapter": "^1.68.0", "@vscode/debugprotocol": "^1.68.0", "@vscode/vsce": "^3.9.1", - "esbuild": "^0.28.0", + "esbuild": "0.28.0", "eslint": "^10.2.1", "get-port": "^7.2.0", "glob": "^13.0.6", diff --git a/package.json b/package.json index 8ff5a14..28db120 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "@vscode/debugadapter": "^1.68.0", "@vscode/debugprotocol": "^1.68.0", "@vscode/vsce": "^3.9.1", - "esbuild": "^0.28.0", + "esbuild": "0.28.0", "eslint": "^10.2.1", "get-port": "^7.2.0", "glob": "^13.0.6", diff --git a/src/extension.ts b/src/extension.ts index 42661c3..b5956e0 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -26,6 +26,7 @@ import { resolveRemoteServerMode, uploadClientFiles, } from './remoteServer'; +import {UriLaunchServer} from './externalLaunch'; export async function activate(context: vscode.ExtensionContext) { const descriptorFactory = new ProbeRSDebugAdapterServerDescriptorFactory(); @@ -39,6 +40,7 @@ export async function activate(context: vscode.ExtensionContext) { vscode.debug.onDidReceiveDebugSessionCustomEvent( descriptorFactory.receivedCustomEvent.bind(descriptorFactory), ), + vscode.window.registerUriHandler(new UriLaunchServer()), ); (async () => { diff --git a/src/externalLaunch.ts b/src/externalLaunch.ts new file mode 100644 index 0000000..fd7fbff --- /dev/null +++ b/src/externalLaunch.ts @@ -0,0 +1,44 @@ +import * as querystring from 'querystring'; +import {debug, Uri, UriHandler, window, workspace, DebugConfiguration} from 'vscode'; + +interface Dict { + [key: string]: T; +} + +export class UriLaunchServer implements UriHandler { + async handleUri(uri: Uri) { + try { + if (uri.path === '/launch') { + let params = querystring.parse(uri.query, ',') as Dict; + if (params.folder && params.name) { + let wsFolder = workspace.getWorkspaceFolder(Uri.file(params.folder)); + await debug.startDebugging(wsFolder, params.name); + } else if (params.name) { + if (workspace.workspaceFolders) { + // Try all workspace folders + for (let wsFolder of workspace.workspaceFolders) { + if (await debug.startDebugging(wsFolder, params.name)) { + break; + } + } + } + } else { + throw new Error(`Unsupported combination of launch Uri parameters.`); + } + } else if (uri.path === '/launch/config') { + let debugConfig: DebugConfiguration = { + type: 'probe-rs-debug', + request: 'launch', + name: '', + }; + Object.assign(debugConfig, JSON.parse(uri.query)); + debugConfig.name = debugConfig.name || debugConfig.program; + await debug.startDebugging(undefined, debugConfig); + } else { + throw new Error(`Unsupported Uri path: ${uri.path}`); + } + } catch (err: any) { + await window.showErrorMessage(err.toString()); + } + } +}