aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilip Dutescu2023-03-06 09:19:53 +0000
committerGitHub2023-03-06 09:19:53 +0000
commit376c19e06bedf54c8a897068f25ff7b9a8e75198 (patch)
tree8870f38c002969779f73efad7f0f78bc54f0d678
parent39d5fb0e593b0da1bf6e2659c67a7914edcd75a6 (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.rs17
-rw-r--r--helix-dap/src/types.rs13
-rw-r--r--helix-term/src/commands.rs1
-rw-r--r--helix-term/src/commands/dap.rs30
-rw-r--r--helix-term/src/keymap/default.rs1
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,