From 311e136e301b59843f87b4ffe41c34a78439aa10 Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Tue, 10 Jun 2025 17:13:58 -0400 Subject: [PATCH] debugger: Reuse parent's debug terminal for child sessions (#32493) Closes #ISSUE Release Notes: - Debugger Beta: fixed an issue where the terminal pane of the debug panel would be empty when debugging JavaScript. Co-authored-by: Conrad Irwin Co-authored-by: Anthony Eid --- crates/debugger_ui/src/debugger_panel.rs | 7 ++++++- crates/debugger_ui/src/session.rs | 7 +++---- crates/debugger_ui/src/session/running.rs | 4 +++- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/crates/debugger_ui/src/debugger_panel.rs b/crates/debugger_ui/src/debugger_panel.rs index ae080948fc..c4d35455cf 100644 --- a/crates/debugger_ui/src/debugger_panel.rs +++ b/crates/debugger_ui/src/debugger_panel.rs @@ -1082,6 +1082,11 @@ async fn register_session_inner( .ok(); let serialized_layout = persistence::get_serialized_layout(adapter_name).await; let debug_session = this.update_in(cx, |this, window, cx| { + let parent_session = this + .sessions + .iter() + .find(|p| Some(p.read(cx).session_id(cx)) == session.read(cx).parent_id(cx)) + .cloned(); this.sessions.retain(|session| { !session .read(cx) @@ -1095,8 +1100,8 @@ async fn register_session_inner( let debug_session = DebugSession::running( this.project.clone(), this.workspace.clone(), + parent_session.map(|p| p.read(cx).running_state().read(cx).debug_terminal.clone()), session, - cx.weak_entity(), serialized_layout, this.position(window, cx).axis(), window, diff --git a/crates/debugger_ui/src/session.rs b/crates/debugger_ui/src/session.rs index 4333046f55..dd0f14de9c 100644 --- a/crates/debugger_ui/src/session.rs +++ b/crates/debugger_ui/src/session.rs @@ -1,6 +1,6 @@ pub mod running; -use crate::{StackTraceView, debugger_panel::DebugPanel, persistence::SerializedLayout}; +use crate::{StackTraceView, persistence::SerializedLayout, session::running::DebugTerminal}; use dap::client::SessionId; use gpui::{ App, Axis, Entity, EventEmitter, FocusHandle, Focusable, Subscription, Task, WeakEntity, @@ -22,7 +22,6 @@ pub struct DebugSession { running_state: Entity, label: OnceLock, stack_trace_view: OnceCell>, - _debug_panel: WeakEntity, _worktree_store: WeakEntity, workspace: WeakEntity, _subscriptions: [Subscription; 1], @@ -38,8 +37,8 @@ impl DebugSession { pub(crate) fn running( project: Entity, workspace: WeakEntity, + parent_terminal: Option>, session: Entity, - _debug_panel: WeakEntity, serialized_layout: Option, dock_axis: Axis, window: &mut Window, @@ -50,6 +49,7 @@ impl DebugSession { session.clone(), project.clone(), workspace.clone(), + parent_terminal, serialized_layout, dock_axis, window, @@ -64,7 +64,6 @@ impl DebugSession { remote_id: None, running_state, label: OnceLock::new(), - _debug_panel, stack_trace_view: OnceCell::new(), _worktree_store: project.read(cx).worktree_store().downgrade(), workspace, diff --git a/crates/debugger_ui/src/session/running.rs b/crates/debugger_ui/src/session/running.rs index ea6536e0d9..60e487555a 100644 --- a/crates/debugger_ui/src/session/running.rs +++ b/crates/debugger_ui/src/session/running.rs @@ -605,6 +605,7 @@ impl RunningState { session: Entity, project: Entity, workspace: WeakEntity, + parent_terminal: Option>, serialized_pane_layout: Option, dock_axis: Axis, window: &mut Window, @@ -617,7 +618,8 @@ impl RunningState { StackFrameList::new(workspace.clone(), session.clone(), weak_state, window, cx) }); - let debug_terminal = cx.new(|cx| DebugTerminal::empty(window, cx)); + let debug_terminal = + parent_terminal.unwrap_or_else(|| cx.new(|cx| DebugTerminal::empty(window, cx))); let variable_list = cx.new(|cx| VariableList::new(session.clone(), stack_frame_list.clone(), window, cx));