From 8660101b83368ec27ffa1ccc2b4034c3397734c1 Mon Sep 17 00:00:00 2001 From: Anthony Eid <56899983+Anthony-Eid@users.noreply.github.com> Date: Thu, 17 Apr 2025 14:46:50 -0400 Subject: [PATCH] debugger: Configure default pane layout conditionally based on capabilities (#28991) This fixes a debug panic that happened when closing a debug session item through the debug panel context menu. The default layout now only includes module list and loaded sources list if they're supported. Release Notes: - N/A --- crates/debugger_ui/src/session/running.rs | 76 ++++++++++++++++++----- 1 file changed, 61 insertions(+), 15 deletions(-) diff --git a/crates/debugger_ui/src/session/running.rs b/crates/debugger_ui/src/session/running.rs index a099d70048f08c0ee81cc2758247c608d5ae2349..59766dc1ff06bad4028035065885ab4c4f19128c 100644 --- a/crates/debugger_ui/src/session/running.rs +++ b/crates/debugger_ui/src/session/running.rs @@ -447,12 +447,35 @@ impl RunningState { workspace::PaneGroup::with_root(root) } else { pane_close_subscriptions.clear(); + let module_list = if session + .read(cx) + .capabilities() + .supports_modules_request + .unwrap_or(false) + { + Some(&module_list) + } else { + None + }; + + let loaded_source_list = if session + .read(cx) + .capabilities() + .supports_loaded_sources_request + .unwrap_or(false) + { + Some(&loaded_source_list) + } else { + None + }; + let root = Self::default_pane_layout( project, &workspace, &stack_frame_list, &variable_list, - &module_list, + module_list, + loaded_source_list, &console, &breakpoint_list, &mut pane_close_subscriptions, @@ -923,7 +946,8 @@ impl RunningState { workspace: &WeakEntity, stack_frame_list: &Entity, variable_list: &Entity, - module_list: &Entity, + module_list: Option<&Entity>, + loaded_source_list: Option<&Entity>, console: &Entity, breakpoints: &Entity, subscriptions: &mut HashMap, @@ -963,6 +987,7 @@ impl RunningState { this.activate_item(0, false, false, window, cx); }); let center_pane = new_debugger_pane(workspace.clone(), project.clone(), window, cx); + center_pane.update(cx, |this, cx| { this.add_item( Box::new(SubView::new( @@ -978,22 +1003,43 @@ impl RunningState { window, cx, ); - this.add_item( - Box::new(SubView::new( - this.focus_handle(cx), - module_list.clone().into(), - DebuggerPaneItem::Modules, + if let Some(module_list) = module_list { + this.add_item( + Box::new(SubView::new( + module_list.focus_handle(cx), + module_list.clone().into(), + DebuggerPaneItem::Modules, + None, + cx, + )), + false, + false, None, + window, cx, - )), - false, - false, - None, - window, - cx, - ); - this.activate_item(0, false, false, window, cx); + ); + this.activate_item(0, false, false, window, cx); + } + + if let Some(loaded_source_list) = loaded_source_list { + this.add_item( + Box::new(SubView::new( + loaded_source_list.focus_handle(cx), + loaded_source_list.clone().into(), + DebuggerPaneItem::LoadedSources, + None, + cx, + )), + false, + false, + None, + window, + cx, + ); + this.activate_item(1, false, false, window, cx); + } }); + let rightmost_pane = new_debugger_pane(workspace.clone(), project.clone(), window, cx); rightmost_pane.update(cx, |this, cx| { let weak_console = console.downgrade();