diff options
author | Filip Dutescu | 2023-03-06 09:19:53 +0000 |
---|---|---|
committer | GitHub | 2023-03-06 09:19:53 +0000 |
commit | 376c19e06bedf54c8a897068f25ff7b9a8e75198 (patch) | |
tree | 8870f38c002969779f73efad7f0f78bc54f0d678 | |
parent | 39d5fb0e593b0da1bf6e2659c67a7914edcd75a6 (diff) |
feat(dap): implement Restart request (#5651)
Add a restart debug session command, which would issue a
[Restart Request][1], if the debugger supports it and a session is
running. It uses the same arguments and requests used to start the
initial session, when recreating it.
It builds upon #5532, making use of the changes to the termination
workflow of a session.
[1]: https://microsoft.github.io/debug-adapter-protocol/specification#Requests_Restart
Closes: #5594
Signed-off-by: Filip Dutescu <filip.dutescu@gmail.com>
-rw-r--r-- | helix-dap/src/client.rs | 17 | ||||
-rw-r--r-- | helix-dap/src/types.rs | 13 | ||||
-rw-r--r-- | helix-term/src/commands.rs | 1 | ||||
-rw-r--r-- | helix-term/src/commands/dap.rs | 30 | ||||
-rw-r--r-- | helix-term/src/keymap/default.rs | 1 |
5 files changed, 60 insertions, 2 deletions
diff --git a/helix-dap/src/client.rs b/helix-dap/src/client.rs index f6d8a069..ff727d00 100644 --- a/helix-dap/src/client.rs +++ b/helix-dap/src/client.rs @@ -33,6 +33,7 @@ pub struct Client { server_tx: UnboundedSender<Payload>, request_counter: AtomicU64, connection_type: Option<ConnectionType>, + starting_request_args: Option<Value>, pub caps: Option<DebuggerCapabilities>, // thread_id -> frames pub stack_frames: HashMap<ThreadId, Vec<StackFrame>>, @@ -87,6 +88,7 @@ impl Client { request_counter: AtomicU64::new(0), caps: None, connection_type: None, + starting_request_args: None, stack_frames: HashMap::new(), thread_states: HashMap::new(), thread_id: None, @@ -158,6 +160,10 @@ impl Client { ) } + pub fn starting_request_args(&self) -> &Option<Value> { + &self.starting_request_args + } + pub async fn tcp_process( cmd: &str, args: Vec<&str>, @@ -356,14 +362,25 @@ impl Client { pub fn launch(&mut self, args: serde_json::Value) -> impl Future<Output = Result<Value>> { self.connection_type = Some(ConnectionType::Launch); + self.starting_request_args = Some(args.clone()); self.call::<requests::Launch>(args) } pub fn attach(&mut self, args: serde_json::Value) -> impl Future<Output = Result<Value>> { self.connection_type = Some(ConnectionType::Attach); + self.starting_request_args = Some(args.clone()); self.call::<requests::Attach>(args) } + pub fn restart(&self) -> impl Future<Output = Result<Value>> { + let args = if let Some(args) = &self.starting_request_args { + args.clone() + } else { + Value::Null + }; + self.call::<requests::Restart>(args) + } + pub async fn set_breakpoints( &self, file: PathBuf, diff --git a/helix-dap/src/types.rs b/helix-dap/src/types.rs index c598790b..bbaf53a6 100644 --- a/helix-dap/src/types.rs +++ b/helix-dap/src/types.rs @@ -378,7 +378,7 @@ pub mod requests { impl Request for Launch { type Arguments = Value; - type Result = Value; + type Result = (); const COMMAND: &'static str = "launch"; } @@ -387,7 +387,7 @@ pub mod requests { impl Request for Attach { type Arguments = Value; - type Result = Value; + type Result = (); const COMMAND: &'static str = "attach"; } @@ -403,6 +403,15 @@ pub mod requests { } #[derive(Debug)] + pub enum Restart {} + + impl Request for Restart { + type Arguments = Value; + type Result = (); + const COMMAND: &'static str = "restart"; + } + + #[derive(Debug)] pub enum Disconnect {} impl Request for Disconnect { diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index cd7626eb..c76e9f2b 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -430,6 +430,7 @@ impl MappableCommand { goto_next_paragraph, "Goto next paragraph", goto_prev_paragraph, "Goto previous paragraph", dap_launch, "Launch debug target", + dap_restart, "Restart debugging session", dap_toggle_breakpoint, "Toggle breakpoint", dap_continue, "Continue program execution", dap_pause, "Pause program execution", diff --git a/helix-term/src/commands/dap.rs b/helix-term/src/commands/dap.rs index 023ed377..dac1e9d5 100644 --- a/helix-term/src/commands/dap.rs +++ b/helix-term/src/commands/dap.rs @@ -289,6 +289,36 @@ pub fn dap_launch(cx: &mut Context) { )))); } +pub fn dap_restart(cx: &mut Context) { + let debugger = match &cx.editor.debugger { + Some(debugger) => debugger, + None => { + cx.editor.set_error("Debugger is not running"); + return; + } + }; + if !debugger + .capabilities() + .supports_restart_request + .unwrap_or(false) + { + cx.editor + .set_error("Debugger does not support session restarts"); + return; + } + if debugger.starting_request_args().is_none() { + cx.editor + .set_error("No arguments found with which to restart the sessions"); + return; + } + + dap_callback( + cx.jobs, + debugger.restart(), + |editor, _compositor, _resp: ()| editor.set_status("Debugging session restarted"), + ); +} + fn debug_parameter_prompt( completions: Vec<DebugConfigCompletion>, config_name: String, diff --git a/helix-term/src/keymap/default.rs b/helix-term/src/keymap/default.rs index 7425c815..9bd00280 100644 --- a/helix-term/src/keymap/default.rs +++ b/helix-term/src/keymap/default.rs @@ -223,6 +223,7 @@ pub fn default() -> HashMap<Mode, Keymap> { "'" => last_picker, "g" => { "Debug (experimental)" sticky=true "l" => dap_launch, + "r" => dap_restart, "b" => dap_toggle_breakpoint, "c" => dap_continue, "h" => dap_pause, |