@@ -18,6 +18,12 @@ pub fn dap_pos_to_pos(doc: &helix_core::Rope, line: usize, column: usize) -> Opt
21+pub fn resume_application(debugger: &mut Client) {
22+ debugger.is_running = true; // TODO: set state running for debugger.thread_id
23+ debugger.active_frame = None;
24+ debugger.thread_id = None;
21pub async fn select_thread_id(editor: &mut Editor, thread_id: usize, force: bool) {
27pub async fn select_thread_id(editor: &mut Editor, thread_id: usize, force: bool) {
22 let debugger = match &mut editor.debugger {
28 let debugger = match &mut editor.debugger {
23 Some(debugger) => debugger,
29 Some(debugger) => debugger,
@@ -243,203 +249,234 @@ pub fn dap_toggle_breakpoint(cx: &mut Context) {
243 // TODO: need to map breakpoints over edits and update them?
249 // TODO: need to map breakpoints over edits and update them?
244 // we shouldn't really allow editing while debug is running though
250 // we shouldn't really allow editing while debug is running though
246− if let Some(debugger) = &mut cx.editor.debugger {
252+ let debugger = match &mut cx.editor.debugger {
253+ Some(debugger) => debugger,
247− let breakpoints = debugger.breakpoints.entry(path.clone()).or_default();
257+ let breakpoints = debugger.breakpoints.entry(path.clone()).or_default();
248− if let Some(pos) = breakpoints.iter().position(|b| b.line == breakpoint.line) {
258+ if let Some(pos) = breakpoints.iter().position(|b| b.line == breakpoint.line) {
249− breakpoints.remove(pos);
259+ breakpoints.remove(pos);
250− } else {
260+ } else {
251− breakpoints.push(breakpoint);
261+ breakpoints.push(breakpoint);
254− let breakpoints = breakpoints.clone();
264+ let breakpoints = breakpoints.clone();
256− let request = debugger.set_breakpoints(path, breakpoints);
266+ let request = debugger.set_breakpoints(path, breakpoints);
257− if let Err(e) = block_on(request) {
267+ if let Err(e) = block_on(request) {
258− cx.editor
268+ cx.editor
259− .set_error(format!("Failed to set breakpoints: {:?}", e));
269+ .set_error(format!("Failed to set breakpoints: {:?}", e));
264pub fn dap_run(cx: &mut Context) {
273pub fn dap_run(cx: &mut Context) {
265− if let Some(debugger) = &mut cx.editor.debugger {
274+ let debugger = match &mut cx.editor.debugger {
275+ Some(debugger) => debugger,
266− if debugger.is_running {
279+ if debugger.is_running {
267− cx.editor
280+ cx.editor
268− .set_status("Debuggee is already running".to_owned());
281+ .set_status("Debuggee is already running".to_owned());
271− let request = debugger.configuration_done();
272− if let Err(e) = block_on(request) {
273− cx.editor.set_error(format!("Failed to run: {:?}", e));
276− debugger.is_running = true;
284+ let request = debugger.configuration_done();
285+ if let Err(e) = block_on(request) {
286+ cx.editor.set_error(format!("Failed to run: {:?}", e));
289+ debugger.is_running = true;
280pub fn dap_continue(cx: &mut Context) {
292pub fn dap_continue(cx: &mut Context) {
281− if let Some(debugger) = &mut cx.editor.debugger {
293+ let debugger = match &mut cx.editor.debugger {
282− if debugger.is_running {
294+ Some(debugger) => debugger,
284− .set_status("Debuggee is already running".to_owned());
285− return;
295+ None => return,
288− if let Some(thread_id) = debugger.thread_id {
298+ if let Some(thread_id) = debugger.thread_id {
289− let request = debugger.continue_thread(debugger.thread_id.unwrap());
299+ let request = debugger.continue_thread(thread_id);
290− if let Err(e) = block_on(request) {
300+ if let Err(e) = block_on(request) {
291− cx.editor.set_error(format!("Failed to continue: {:?}", e));
301+ cx.editor.set_error(format!("Failed to continue: {:?}", e));
294− debugger.is_running = true;
295− debugger.stack_frames.remove(&thread_id);
298− .set_error("Currently active thread is not stopped. Switch the thread.".into());
304+ resume_application(debugger);
305+ debugger.stack_frames.remove(&thread_id);
308+ .set_error("Currently active thread is not stopped. Switch the thread.".into());
303pub fn dap_pause(cx: &mut Context) {
312pub fn dap_pause(cx: &mut Context) {
304− if let Some(debugger) = &mut cx.editor.debugger {
313+ let debugger = match &mut cx.editor.debugger {
305− if !debugger.is_running {
314+ Some(debugger) => debugger,
306− cx.editor.set_status("Debuggee is not running".to_owned());
307− return;
315+ None => return,
318+ if !debugger.is_running {
319+ cx.editor.set_status("Debuggee is not running".to_owned());
310− // FIXME: correct number here
323+ // FIXME: correct number here
311− let request = debugger.pause(0);
324+ let request = debugger.pause(0);
312− if let Err(e) = block_on(request) {
325+ if let Err(e) = block_on(request) {
313− cx.editor.set_error(format!("Failed to pause: {:?}", e));
326+ cx.editor.set_error(format!("Failed to pause: {:?}", e));
318pub fn dap_step_in(cx: &mut Context) {
330pub fn dap_step_in(cx: &mut Context) {
319− if let Some(debugger) = &mut cx.editor.debugger {
331+ let debugger = match &mut cx.editor.debugger {
320− if debugger.is_running {
332+ Some(debugger) => debugger,
322− .set_status("Debuggee is already running".to_owned());
323− return;
333+ None => return,
336+ if let Some(thread_id) = debugger.thread_id {
326− let request = debugger.step_in(debugger.thread_id.unwrap());
337+ let request = debugger.step_in(thread_id);
327 if let Err(e) = block_on(request) {
338 if let Err(e) = block_on(request) {
328− cx.editor.set_error(format!("Failed to step: {:?}", e));
339+ cx.editor.set_error(format!("Failed to continue: {:?}", e));
342+ resume_application(debugger);
343+ debugger.stack_frames.remove(&thread_id);
346+ .set_error("Currently active thread is not stopped. Switch the thread.".into());
333pub fn dap_step_out(cx: &mut Context) {
350pub fn dap_step_out(cx: &mut Context) {
334− if let Some(debugger) = &mut cx.editor.debugger {
351+ let debugger = match &mut cx.editor.debugger {
335− if debugger.is_running {
352+ Some(debugger) => debugger,
337− .set_status("Debuggee is already running".to_owned());
338− return;
353+ None => return,
356+ if let Some(thread_id) = debugger.thread_id {
341− let request = debugger.step_out(debugger.thread_id.unwrap());
357+ let request = debugger.step_out(thread_id);
342 if let Err(e) = block_on(request) {
358 if let Err(e) = block_on(request) {
343− cx.editor.set_error(format!("Failed to step: {:?}", e));
359+ cx.editor.set_error(format!("Failed to continue: {:?}", e));
362+ resume_application(debugger);
363+ debugger.stack_frames.remove(&thread_id);
366+ .set_error("Currently active thread is not stopped. Switch the thread.".into());
348pub fn dap_next(cx: &mut Context) {
370pub fn dap_next(cx: &mut Context) {
349− if let Some(debugger) = &mut cx.editor.debugger {
371+ let debugger = match &mut cx.editor.debugger {
350− if debugger.is_running {
372+ Some(debugger) => debugger,
352− .set_status("Debuggee is already running".to_owned());
353− return;
373+ None => return,
376+ if let Some(thread_id) = debugger.thread_id {
356− let request = debugger.next(debugger.thread_id.unwrap());
377+ let request = debugger.next(thread_id);
357 if let Err(e) = block_on(request) {
378 if let Err(e) = block_on(request) {
358− cx.editor.set_error(format!("Failed to step: {:?}", e));
379+ cx.editor.set_error(format!("Failed to continue: {:?}", e));
382+ resume_application(debugger);
383+ debugger.stack_frames.remove(&thread_id);
386+ .set_error("Currently active thread is not stopped. Switch the thread.".into());
363pub fn dap_variables(cx: &mut Context) {
390pub fn dap_variables(cx: &mut Context) {
364− if let Some(debugger) = &mut cx.editor.debugger {
391+ let debugger = match &mut cx.editor.debugger {
392+ Some(debugger) => debugger,
365− if debugger.is_running {
396+ if debugger.is_running {
398+ .set_status("Cannot access variables while target is running".to_owned());
401+ let (frame, thread_id) = match (debugger.active_frame, debugger.thread_id) {
402+ (Some(frame), Some(thread_id)) => (frame, thread_id),
366 cx.editor
404 cx.editor
367− .set_status("Cannot access variables while target is running".to_owned());
405+ .set_status("Cannot find current stack frame to access variables".to_owned());
370− let (frame, thread_id) = match (debugger.active_frame, debugger.thread_id) {
371− (Some(frame), Some(thread_id)) => (frame, thread_id),
374− .set_status("Cannot find current stack frame to access variables".to_owned());
379− let frame_id = debugger.stack_frames[&thread_id][frame].id;
410+ let frame_id = debugger.stack_frames[&thread_id][frame].id;
380− let scopes = match block_on(debugger.scopes(frame_id)) {
411+ let scopes = match block_on(debugger.scopes(frame_id)) {
381− Ok(s) => s,
412+ Ok(s) => s,
382− Err(e) => {
413+ Err(e) => {
383− cx.editor
414+ cx.editor
384− .set_error(format!("Failed to get scopes: {:?}", e));
415+ .set_error(format!("Failed to get scopes: {:?}", e));
388− let mut variables = Vec::new();
419+ let mut variables = Vec::new();
390− for scope in scopes.iter() {
421+ for scope in scopes.iter() {
391− let response = block_on(debugger.variables(scope.variables_reference));
422+ let response = block_on(debugger.variables(scope.variables_reference));
393− if let Ok(vars) = response {
424+ if let Ok(vars) = response {
425+ variables.reserve(vars.len());
394− for var in vars {
426+ for var in vars {
395− let prefix = match var.data_type {
427+ let prefix = match var.data_type {
396− Some(data_type) => format!("{} ", data_type),
428+ Some(data_type) => format!("{} ", data_type),
397− None => "".to_owned(),
429+ None => "".to_owned(),
399− variables.push(format!("{}{} = {}\n", prefix, var.name, var.value));
431+ variables.push(format!("{}{} = {}\n", prefix, var.name, var.value));
404− if !variables.is_empty() {
436+ if !variables.is_empty() {
405− cx.editor.variables = Some(variables);
437+ cx.editor.variables = Some(variables);
406− cx.editor.variables_page = 0;
438+ cx.editor.variables_page = 0;
411pub fn dap_terminate(cx: &mut Context) {
442pub fn dap_terminate(cx: &mut Context) {
412− if let Some(debugger) = &mut cx.editor.debugger {
443+ let debugger = match &mut cx.editor.debugger {
444+ Some(debugger) => debugger,
413− let request = debugger.disconnect();
448+ let request = debugger.disconnect();
414− if let Err(e) = block_on(request) {
449+ if let Err(e) = block_on(request) {
415− cx.editor
450+ cx.editor
416− .set_error(format!("Failed to disconnect: {:?}", e));
451+ .set_error(format!("Failed to disconnect: {:?}", e));
419− cx.editor.debugger = None;
454+ cx.editor.debugger = None;
423pub fn dap_switch_thread(cx: &mut Context) {
457pub fn dap_switch_thread(cx: &mut Context) {
424− if let Some(debugger) = &mut cx.editor.debugger {
458+ let debugger = match &mut cx.editor.debugger {
459+ Some(debugger) => debugger,
425− let request = debugger.threads();
463+ let request = debugger.threads();
426− let threads = match block_on(request) {
464+ let threads = match block_on(request) {
427− Ok(threads) => threads,
465+ Ok(threads) => threads,
428− Err(e) => {
466+ Err(e) => {
429− cx.editor
467+ cx.editor
430− .set_error(format!("Failed to retrieve threads: {:?}", e));
468+ .set_error(format!("Failed to retrieve threads: {:?}", e));
435− let picker = Picker::new(
473+ let picker = Picker::new(
437− threads,
475+ threads,
438− |thread| thread.name.clone().into(),
476+ |thread| thread.name.clone().into(),
439− |editor, thread, _action| {
477+ |editor, thread, _action| {
440− block_on(select_thread_id(editor, thread.id, true));
478+ block_on(select_thread_id(editor, thread.id, true));
443− cx.push_layer(Box::new(picker))
481+ cx.push_layer(Box::new(picker))