diff --git a/crates/editor/src/items.rs b/crates/editor/src/items.rs index 6b170e12e96bac341c2a1e729d56e13c17361ea0..24dbebb6c7b9e227c69e8c37806c6485a1229050 100644 --- a/crates/editor/src/items.rs +++ b/crates/editor/src/items.rs @@ -7,7 +7,7 @@ use gpui::{ use language::{Bias, Buffer, Diagnostic}; use postage::watch; use project::worktree::File; -use project::{Project, ProjectEntry, ProjectPath, Worktree}; +use project::{Project, ProjectEntry, ProjectPath}; use std::rc::Rc; use std::{fmt::Write, path::PathBuf}; use text::{Point, Selection}; @@ -28,13 +28,13 @@ struct WeakBufferItemHandle(WeakModelHandle); impl PathOpener for BufferOpener { fn open( &self, - worktree: &mut Worktree, + project: &mut Project, project_path: ProjectPath, - cx: &mut ModelContext, + cx: &mut ModelContext, ) -> Option>>> { - let buffer = worktree.open_buffer(project_path.path, cx); + let buffer = project.open_buffer(project_path, cx); let task = cx.spawn(|_, _| async move { - let buffer = buffer.await?.0; + let buffer = buffer.await?; Ok(Box::new(BufferItemHandle(buffer)) as Box) }); Some(task) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 93c91cdb22359d1cf6630f09a1018d2cd019270c..f3b29467f25c19720a43ce145d5aca74da4edf2f 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -1088,26 +1088,51 @@ impl Project { rpc: Arc, cx: &mut ModelContext, ) -> anyhow::Result<()> { + let receipt = envelope.receipt(); + let peer_id = envelope.original_sender_id()?; let worktree_id = WorktreeId::from_proto(envelope.payload.worktree_id); - if let Some(worktree) = self.worktree_for_id(worktree_id, cx) { - return worktree.update(cx, |worktree, cx| { - worktree.handle_open_buffer(envelope, rpc, cx) - }); - } else { - Err(anyhow!("no such worktree")) - } + let worktree = self + .worktree_for_id(worktree_id, cx) + .ok_or_else(|| anyhow!("no such worktree"))?; + + let task = self.open_buffer( + ProjectPath { + worktree_id, + path: PathBuf::from(envelope.payload.path).into(), + }, + cx, + ); + cx.spawn(|_, mut cx| { + async move { + let buffer = task.await?; + let response = worktree.update(&mut cx, |worktree, cx| { + worktree + .as_local_mut() + .unwrap() + .open_remote_buffer(peer_id, buffer, cx) + }); + rpc.respond(receipt, response).await?; + Ok(()) + } + .log_err() + }) + .detach(); + Ok(()) } pub fn handle_close_buffer( &mut self, envelope: TypedEnvelope, - rpc: Arc, + _: Arc, cx: &mut ModelContext, ) -> anyhow::Result<()> { let worktree_id = WorktreeId::from_proto(envelope.payload.worktree_id); if let Some(worktree) = self.worktree_for_id(worktree_id, cx) { worktree.update(cx, |worktree, cx| { - worktree.handle_close_buffer(envelope, rpc, cx) + worktree + .as_local_mut() + .unwrap() + .close_remote_buffer(envelope, cx) })?; } Ok(()) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index ab26524473f8d1a5c70763b9ebbadf817bab1418..15b82bc884a0b3575afe60778c11ca7e5e9fa939 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -286,43 +286,6 @@ impl Worktree { } } - pub fn handle_open_buffer( - &mut self, - envelope: TypedEnvelope, - rpc: Arc, - cx: &mut ModelContext, - ) -> anyhow::Result<()> { - let receipt = envelope.receipt(); - - let response = self - .as_local_mut() - .unwrap() - .open_remote_buffer(envelope, cx); - - cx.background() - .spawn( - async move { - rpc.respond(receipt, response.await?).await?; - Ok(()) - } - .log_err(), - ) - .detach(); - - Ok(()) - } - - pub fn handle_close_buffer( - &mut self, - envelope: TypedEnvelope, - _: Arc, - cx: &mut ModelContext, - ) -> anyhow::Result<()> { - self.as_local_mut() - .unwrap() - .close_remote_buffer(envelope, cx) - } - pub fn diagnostic_summaries<'a>( &'a self, ) -> impl Iterator, DiagnosticSummary)> + 'a { @@ -1006,28 +969,17 @@ impl LocalWorktree { pub fn open_remote_buffer( &mut self, - envelope: TypedEnvelope, + peer_id: PeerId, + buffer: ModelHandle, cx: &mut ModelContext, - ) -> Task> { - cx.spawn(|this, mut cx| async move { - let peer_id = envelope.original_sender_id(); - let path = Path::new(&envelope.payload.path); - let (buffer, _) = this - .update(&mut cx, |this, cx| this.open_buffer(path, cx)) - .await?; - this.update(&mut cx, |this, cx| { - this.as_local_mut() - .unwrap() - .shared_buffers - .entry(peer_id?) - .or_default() - .insert(buffer.id() as u64, buffer.clone()); - - Ok(proto::OpenBufferResponse { - buffer: Some(buffer.update(cx.as_mut(), |buffer, _| buffer.to_proto())), - }) - }) - }) + ) -> proto::OpenBufferResponse { + self.shared_buffers + .entry(peer_id) + .or_default() + .insert(buffer.id() as u64, buffer.clone()); + proto::OpenBufferResponse { + buffer: Some(buffer.update(cx.as_mut(), |buffer, _| buffer.to_proto())), + } } pub fn close_remote_buffer( diff --git a/crates/workspace/src/workspace.rs b/crates/workspace/src/workspace.rs index da7c40d5f6402c1aec897dbceea19c0a403cec0f..64eeb3ee72a71b0a1f715cb3263ebc8daea1de73 100644 --- a/crates/workspace/src/workspace.rs +++ b/crates/workspace/src/workspace.rs @@ -125,9 +125,9 @@ pub struct JoinProjectParams { pub trait PathOpener { fn open( &self, - worktree: &mut Worktree, + project: &mut Project, path: ProjectPath, - cx: &mut ModelContext, + cx: &mut ModelContext, ) -> Option>>>; } @@ -766,18 +766,11 @@ impl Workspace { return Task::ready(Ok(existing_item)); } - let worktree = match self.project.read(cx).worktree_for_id(path.worktree_id, cx) { - Some(worktree) => worktree, - None => { - return Task::ready(Err(anyhow!("worktree {} does not exist", path.worktree_id))); - } - }; - let project_path = path.clone(); let path_openers = self.path_openers.clone(); - worktree.update(cx, |worktree, cx| { + self.project.update(cx, |project, cx| { for opener in path_openers.iter() { - if let Some(task) = opener.open(worktree, project_path.clone(), cx) { + if let Some(task) = opener.open(project, project_path.clone(), cx) { return task; } }