debugger: Configure default pane layout conditionally based on capabilities (#28991)

Anthony Eid created

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

Change summary

crates/debugger_ui/src/session/running.rs | 76 ++++++++++++++++++++----
1 file changed, 61 insertions(+), 15 deletions(-)

Detailed changes

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<Workspace>,
         stack_frame_list: &Entity<StackFrameList>,
         variable_list: &Entity<VariableList>,
-        module_list: &Entity<ModuleList>,
+        module_list: Option<&Entity<ModuleList>>,
+        loaded_source_list: Option<&Entity<LoadedSourceList>>,
         console: &Entity<Console>,
         breakpoints: &Entity<BreakpointList>,
         subscriptions: &mut HashMap<EntityId, Subscription>,
@@ -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();