From fde06e7eccbeda3fe918463b90653ee11fcbf7f0 Mon Sep 17 00:00:00 2001 From: Anthony Eid Date: Thu, 13 Feb 2025 17:23:53 -0500 Subject: [PATCH 1/2] Move basic dap message handler to it's DebugSession --- crates/dap/src/client.rs | 6 +++--- crates/project/src/debugger/dap_session.rs | 7 +++++++ crates/project/src/debugger/dap_store.rs | 23 +++++++++------------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/crates/dap/src/client.rs b/crates/dap/src/client.rs index 9499a83c201928..cb1b6bee4b648c 100644 --- a/crates/dap/src/client.rs +++ b/crates/dap/src/client.rs @@ -128,7 +128,7 @@ impl DebugAdapterClient { client_id: DebugAdapterClientId, server_rx: Receiver, client_tx: Sender, - mut event_handler: F, + mut message_handler: F, cx: &mut AsyncApp, ) -> Result<()> where @@ -144,9 +144,9 @@ impl DebugAdapterClient { Message::Event(ev) => { log::debug!("Client {} received event `{}`", client_id.0, &ev); - cx.update(|cx| event_handler(Message::Event(ev), cx)) + cx.update(|cx| message_handler(Message::Event(ev), cx)) } - Message::Request(req) => cx.update(|cx| event_handler(Message::Request(req), cx)), + Message::Request(req) => cx.update(|cx| message_handler(Message::Request(req), cx)), Message::Response(response) => { log::debug!("Received response after request timeout: {:#?}", response); diff --git a/crates/project/src/debugger/dap_session.rs b/crates/project/src/debugger/dap_session.rs index ce9bb72ffd3d67..5bc762ead85780 100644 --- a/crates/project/src/debugger/dap_session.rs +++ b/crates/project/src/debugger/dap_session.rs @@ -971,6 +971,13 @@ impl DebugSession { } } + pub(crate) fn handle_dap_message( + &self, + client_id: DebugAdapterClientId, + message: dap::messages::Message, + ) { + } + pub fn ignore_breakpoints(&self) -> bool { self.ignore_breakpoints } diff --git a/crates/project/src/debugger/dap_store.rs b/crates/project/src/debugger/dap_store.rs index 017764355bcecd..a503d82099b2c3 100644 --- a/crates/project/src/debugger/dap_store.rs +++ b/crates/project/src/debugger/dap_store.rs @@ -614,7 +614,7 @@ impl DapStore { fn start_client_internal( &mut self, - session_id: DebugSessionId, + session: Entity, delegate: DapAdapterDelegate, config: DebugAdapterConfig, cx: &mut Context, @@ -624,6 +624,7 @@ impl DapStore { }; let client_id = local_store.next_client_id(); + let session = session.downgrade(); cx.spawn(|this, mut cx| async move { let adapter = build_adapter(&config.kind).await?; @@ -672,15 +673,10 @@ impl DapStore { client .start( { - let dap_store = this.clone(); move |message, cx| { - dap_store - .update(cx, |_, cx| { - cx.emit(DapStoreEvent::DebugClientEvent { - session_id, - client_id, - message, - }) + session + .update(cx, |session, cx| { + session.handle_dap_message(client_id, message); }) .log_err(); } @@ -716,13 +712,11 @@ impl DapStore { }), ); - let session_id = local_store.next_session_id(); - let start_client_task = - self.start_client_internal(session_id, delegate, config.clone(), cx); + let session = + cx.new(|_| DebugSession::new_local(local_store.next_session_id(), config.clone())); + let start_client_task = self.start_client_internal(session.clone(), delegate, config, cx); cx.spawn(|this, mut cx| async move { - let session = cx.new(|_| DebugSession::new_local(session_id, config))?; - let client = match start_client_task.await { Ok(client) => client, Err(error) => { @@ -741,6 +735,7 @@ impl DapStore { }); let client_id = client.id(); + let session_id = session.read(cx).id(); store.client_by_session.insert(client_id, session_id); store.sessions.insert(session_id, session.clone()); From 31f8b763323850eb149f81a0d765ca21487dfa83 Mon Sep 17 00:00:00 2001 From: Anthony Eid Date: Fri, 14 Feb 2025 01:13:39 -0500 Subject: [PATCH 2/2] WIP make function signatures for dap session message handler --- crates/project/src/debugger/dap_session.rs | 36 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/crates/project/src/debugger/dap_session.rs b/crates/project/src/debugger/dap_session.rs index 5bc762ead85780..a6596361e59440 100644 --- a/crates/project/src/debugger/dap_session.rs +++ b/crates/project/src/debugger/dap_session.rs @@ -9,6 +9,8 @@ use collections::{BTreeMap, HashMap, IndexMap}; use dap::client::{DebugAdapterClient, DebugAdapterClientId}; use dap::requests::Request; use dap::{ + messages::{self, Events, Message}, + requests::{RunInTerminal, StartDebugging}, Capabilities, ContinueArguments, EvaluateArgumentsContext, Module, Source, SteppingGranularity, }; use futures::{future::Shared, FutureExt}; @@ -16,7 +18,6 @@ use gpui::{App, AppContext, Context, Entity, Task}; use rpc::AnyProtoClient; use serde_json::Value; use std::borrow::Borrow; -use std::collections::btree_map::Entry as BTreeMapEntry; use std::u64; use std::{ any::Any, @@ -971,13 +972,40 @@ impl DebugSession { } } - pub(crate) fn handle_dap_message( - &self, + fn handle_dap_event(&mut self, client_id: DebugAdapterClientId, event: Box) {} + + fn handle_start_debugging_request( + &mut self, + client_id: DebugAdapterClientId, + request: messages::Request, + ) { + } + + fn handle_run_in_terminal_request( + &mut self, client_id: DebugAdapterClientId, - message: dap::messages::Message, + request: messages::Request, ) { } + pub(crate) fn handle_dap_message(&mut self, client_id: DebugAdapterClientId, message: Message) { + match message { + Message::Event(event) => { + self.handle_dap_event(client_id, event); + } + Message::Request(request) => { + if StartDebugging::COMMAND == request.command { + self.handle_start_debugging_request(client_id, request); + } else if RunInTerminal::COMMAND == request.command { + self.handle_run_in_terminal_request(client_id, request); + } else { + debug_assert!(false, "Encountered unexpected command type"); + } + } + _ => unreachable!(), + } + } + pub fn ignore_breakpoints(&self) -> bool { self.ignore_breakpoints }