@@ -1,4 +1,5 @@
1use super::{Context, Editor};
1use super::{Context, Editor};
2use helix_dap::Client;
3use helix_dap::Client;
3use helix_lsp::block_on;
4use helix_lsp::block_on;
@@ -221,7 +222,7 @@ pub fn dap_continue(cx: &mut Context) {
224− let request = debugger.continue_thread(debugger.stopped_thread.unwrap());
225+ let request = debugger.continue_thread(debugger.thread_id.unwrap());
225 if let Err(e) = block_on(request) {
226 if let Err(e) = block_on(request) {
226 cx.editor.set_error(format!("Failed to continue: {:?}", e));
227 cx.editor.set_error(format!("Failed to continue: {:?}", e));
@@ -254,7 +255,7 @@ pub fn dap_step_in(cx: &mut Context) {
257− let request = debugger.step_in(debugger.stopped_thread.unwrap());
258+ let request = debugger.step_in(debugger.thread_id.unwrap());
258 if let Err(e) = block_on(request) {
259 if let Err(e) = block_on(request) {
259 cx.editor.set_error(format!("Failed to step: {:?}", e));
260 cx.editor.set_error(format!("Failed to step: {:?}", e));
@@ -269,7 +270,7 @@ pub fn dap_step_out(cx: &mut Context) {
272− let request = debugger.step_out(debugger.stopped_thread.unwrap());
273+ let request = debugger.step_out(debugger.thread_id.unwrap());
273 if let Err(e) = block_on(request) {
274 if let Err(e) = block_on(request) {
274 cx.editor.set_error(format!("Failed to step: {:?}", e));
275 cx.editor.set_error(format!("Failed to step: {:?}", e));
@@ -284,7 +285,7 @@ pub fn dap_next(cx: &mut Context) {
287− let request = debugger.next(debugger.stopped_thread.unwrap());
288+ let request = debugger.next(debugger.thread_id.unwrap());
288 if let Err(e) = block_on(request) {
289 if let Err(e) = block_on(request) {
289 cx.editor.set_error(format!("Failed to step: {:?}", e));
290 cx.editor.set_error(format!("Failed to step: {:?}", e));
@@ -347,3 +348,30 @@ pub fn dap_terminate(cx: &mut Context) {
347 cx.editor.debugger = None;
348 cx.editor.debugger = None;
352+pub fn dap_switch_thread(cx: &mut Context) {
353+ if let Some(debugger) = &mut cx.editor.debugger {
354+ let request = debugger.threads();
355+ let threads = match block_on(request) {
356+ Ok(threads) => threads,
359+ .set_error(format!("Failed to retrieve threads: {:?}", e));
364+ let picker = Picker::new(
367+ |thread| thread.name.clone().into(),
368+ |editor, thread, _action| {
369+ if let Some(debugger) = &mut editor.debugger {
370+ debugger.thread_id = Some(thread.id);
371+ // TODO: probably need to refetch stack frames?
375+ cx.push_layer(Box::new(picker))