From c63ad60c31cb51481b227c1d610d3eb7b2f95529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bla=C5=BE=20Hrastnik?= Date: Fri, 3 Sep 2021 17:25:11 +0900 Subject: [PATCH] dap: Allow switching between stack frames --- helix-term/src/commands.rs | 1 + helix-term/src/commands/dap.rs | 51 +++++++++++++++++++++++++++++++++- helix-term/src/keymap.rs | 2 +- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs index 7b2078374..bdcad9635 100644 --- a/helix-term/src/commands.rs +++ b/helix-term/src/commands.rs @@ -318,6 +318,7 @@ pub fn doc(&self) -> &'static str { dap_variables, "List variables", dap_terminate, "End debug session", dap_switch_thread, "Switch current thread", + dap_switch_stack_frame, "Switch stack frame", shell_pipe, "Pipe selections through shell command", shell_pipe_to, "Pipe selections into shell command, ignoring command output", shell_insert_output, "Insert output of shell command before each selection", diff --git a/helix-term/src/commands/dap.rs b/helix-term/src/commands/dap.rs index 5c415ca47..6b9b06b2f 100644 --- a/helix-term/src/commands/dap.rs +++ b/helix-term/src/commands/dap.rs @@ -1,5 +1,5 @@ use super::{align_view, Align, Context, Editor}; -use crate::ui::Picker; +use crate::ui::{FilePicker, Picker}; use helix_core::Selection; use helix_dap::{self as dap, Client}; use helix_lsp::block_on; @@ -461,3 +461,52 @@ pub fn dap_switch_thread(cx: &mut Context) { block_on(select_thread_id(editor, thread.id, true)); }) } +pub fn dap_switch_stack_frame(cx: &mut Context) { + let debugger = match &mut cx.editor.debugger { + Some(debugger) => debugger, + None => return, + }; + + let thread_id = match debugger.thread_id { + Some(thread_id) => thread_id, + None => { + cx.editor + .set_error(format!("No thread is currently active")); + return; + } + }; + + let frames = debugger.stack_frames[&thread_id].clone(); + + let picker = FilePicker::new( + frames, + |frame| frame.name.clone().into(), // TODO: include thread_states in the label + move |editor, frame, _action| { + let debugger = match &mut editor.debugger { + Some(debugger) => debugger, + None => return, + }; + // TODO: this should be simpler to find + let pos = debugger.stack_frames[&thread_id] + .iter() + .position(|f| f.id == frame.id); + debugger.active_frame = pos; + }, + move |_editor, frame| { + frame + .source + .as_ref() + .and_then(|source| source.path.clone()) + .map(|path| { + ( + path, + Some(( + frame.line.saturating_sub(1), + frame.end_line.unwrap_or(frame.line).saturating_sub(1), + )), + ) + }) + }, + ); + cx.push_layer(Box::new(picker)) +} diff --git a/helix-term/src/keymap.rs b/helix-term/src/keymap.rs index 7710c321f..d07d1ca33 100644 --- a/helix-term/src/keymap.rs +++ b/helix-term/src/keymap.rs @@ -499,7 +499,7 @@ fn default() -> Keymaps { "t" => dap_terminate, "s" => { "Switch" "t" => dap_switch_thread, - // f = stack frame + "f" => dap_switch_stack_frame, // sl, sb }, },