@@ -1,4 +1,5 @@
11use super::{Context, Editor};
2+use crate::ui::Picker;
23use helix_dap::Client;
34use helix_lsp::block_on;
45
@@ -221,7 +222,7 @@ pub fn dap_continue(cx: &mut Context) {
221222 return;
222223 }
223224
224− let request = debugger.continue_thread(debugger.stopped_thread.unwrap());
225+ let request = debugger.continue_thread(debugger.thread_id.unwrap());
225226 if let Err(e) = block_on(request) {
226227 cx.editor.set_error(format!("Failed to continue: {:?}", e));
227228 return;
@@ -254,7 +255,7 @@ pub fn dap_step_in(cx: &mut Context) {
254255 return;
255256 }
256257
257− let request = debugger.step_in(debugger.stopped_thread.unwrap());
258+ let request = debugger.step_in(debugger.thread_id.unwrap());
258259 if let Err(e) = block_on(request) {
259260 cx.editor.set_error(format!("Failed to step: {:?}", e));
260261 }
@@ -269,7 +270,7 @@ pub fn dap_step_out(cx: &mut Context) {
269270 return;
270271 }
271272
272− let request = debugger.step_out(debugger.stopped_thread.unwrap());
273+ let request = debugger.step_out(debugger.thread_id.unwrap());
273274 if let Err(e) = block_on(request) {
274275 cx.editor.set_error(format!("Failed to step: {:?}", e));
275276 }
@@ -284,7 +285,7 @@ pub fn dap_next(cx: &mut Context) {
284285 return;
285286 }
286287
287− let request = debugger.next(debugger.stopped_thread.unwrap());
288+ let request = debugger.next(debugger.thread_id.unwrap());
288289 if let Err(e) = block_on(request) {
289290 cx.editor.set_error(format!("Failed to step: {:?}", e));
290291 }
@@ -347,3 +348,30 @@ pub fn dap_terminate(cx: &mut Context) {
347348 cx.editor.debugger = None;
348349 }
349350}
351+
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,
357+ Err(e) => {
358+ cx.editor
359+ .set_error(format!("Failed to retrieve threads: {:?}", e));
360+ return;
361+ }
362+ };
363+
364+ let picker = Picker::new(
365+ true,
366+ threads,
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?
372+ }
373+ },
374+ );
375+ cx.push_layer(Box::new(picker))
376+ }
377+}