From a6605270365e7db0ced654c290d62643d6d84672 Mon Sep 17 00:00:00 2001 From: Michael Sloan Date: Thu, 4 Sep 2025 18:26:37 -0600 Subject: [PATCH] Make entry_for_path return a reference instead of cloning (#37591) Release Notes: - N/A --- crates/agent_ui/src/acp/message_editor.rs | 7 +++---- crates/agent_ui/src/acp/thread_view.rs | 14 ++++++-------- crates/agent_ui/src/context_picker.rs | 3 ++- crates/project/src/project.rs | 2 +- crates/project/src/worktree_store.rs | 3 +-- crates/repl/src/notebook/notebook_ui.rs | 7 ++++--- crates/search/src/project_search.rs | 1 + 7 files changed, 18 insertions(+), 19 deletions(-) diff --git a/crates/agent_ui/src/acp/message_editor.rs b/crates/agent_ui/src/acp/message_editor.rs index da121bb7a486d80f15125d2ecc526b3b01e059d3..4f57c6161d8f5fae3aa0b5762ed85e49dfd20b43 100644 --- a/crates/agent_ui/src/acp/message_editor.rs +++ b/crates/agent_ui/src/acp/message_editor.rs @@ -493,14 +493,13 @@ impl MessageEditor { let Some(entry) = self.project.read(cx).entry_for_path(&project_path, cx) else { return Task::ready(Err(anyhow!("project entry not found"))); }; - let Some(worktree) = self.project.read(cx).worktree_for_entry(entry.id, cx) else { + let directory_path = entry.path.clone(); + let worktree_id = project_path.worktree_id; + let Some(worktree) = self.project.read(cx).worktree_for_id(worktree_id, cx) else { return Task::ready(Err(anyhow!("worktree not found"))); }; let project = self.project.clone(); cx.spawn(async move |_, cx| { - let directory_path = entry.path.clone(); - - let worktree_id = worktree.read_with(cx, |worktree, _| worktree.id())?; let file_paths = worktree.read_with(cx, |worktree, _cx| { collect_files_in_path(worktree, &directory_path) })?; diff --git a/crates/agent_ui/src/acp/thread_view.rs b/crates/agent_ui/src/acp/thread_view.rs index b4d56ad05be1a66e9740c2432a9bd08b1adfee0e..441b4aa06fdad65fce079ea36dc3d2e59cf4644f 100644 --- a/crates/agent_ui/src/acp/thread_view.rs +++ b/crates/agent_ui/src/acp/thread_view.rs @@ -4070,15 +4070,15 @@ impl AcpThreadView { MentionUri::PastedImage => {} MentionUri::Directory { abs_path } => { let project = workspace.project(); - let Some(entry) = project.update(cx, |project, cx| { + let Some(entry_id) = project.update(cx, |project, cx| { let path = project.find_project_path(abs_path, cx)?; - project.entry_for_path(&path, cx) + project.entry_for_path(&path, cx).map(|entry| entry.id) }) else { return; }; project.update(cx, |_, cx| { - cx.emit(project::Event::RevealInProjectPanel(entry.id)); + cx.emit(project::Event::RevealInProjectPanel(entry_id)); }); } MentionUri::Symbol { @@ -4091,11 +4091,9 @@ impl AcpThreadView { line_range, } => { let project = workspace.project(); - let Some((path, _)) = project.update(cx, |project, cx| { - let path = project.find_project_path(path, cx)?; - let entry = project.entry_for_path(&path, cx)?; - Some((path, entry)) - }) else { + let Some(path) = + project.update(cx, |project, cx| project.find_project_path(path, cx)) + else { return; }; diff --git a/crates/agent_ui/src/context_picker.rs b/crates/agent_ui/src/context_picker.rs index 405b5ed90ba1606ef97b8b048b959bfc354bc5cd..b225fbf34058604cfb3f306a9cee14f69bb5edaa 100644 --- a/crates/agent_ui/src/context_picker.rs +++ b/crates/agent_ui/src/context_picker.rs @@ -987,7 +987,8 @@ impl MentionLink { .read(cx) .project() .read(cx) - .entry_for_path(&project_path, cx)?; + .entry_for_path(&project_path, cx)? + .clone(); Some(MentionLink::File(project_path, entry)) } Self::SYMBOL => { diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 1e2e52c120f95a7c7540cd6f916d2d401f411af2..66924f159a0a97dce558d742ca3ee80456542305 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -4352,7 +4352,7 @@ impl Project { self.active_entry } - pub fn entry_for_path(&self, path: &ProjectPath, cx: &App) -> Option { + pub fn entry_for_path<'a>(&'a self, path: &ProjectPath, cx: &'a App) -> Option<&'a Entry> { self.worktree_store.read(cx).entry_for_path(path, cx) } diff --git a/crates/project/src/worktree_store.rs b/crates/project/src/worktree_store.rs index 1eeeefc40ad09012e5d280c0821052cd6f8db098..b37e1ef8026b643444b3ca0ba67cdb953a959a36 100644 --- a/crates/project/src/worktree_store.rs +++ b/crates/project/src/worktree_store.rs @@ -203,11 +203,10 @@ impl WorktreeStore { }) } - pub fn entry_for_path(&self, path: &ProjectPath, cx: &App) -> Option { + pub fn entry_for_path<'a>(&'a self, path: &ProjectPath, cx: &'a App) -> Option<&'a Entry> { self.worktree_for_id(path.worktree_id, cx)? .read(cx) .entry_for_path(&path.path) - .cloned() } pub fn create_worktree( diff --git a/crates/repl/src/notebook/notebook_ui.rs b/crates/repl/src/notebook/notebook_ui.rs index 325d262d9eddc164093f088d0e4790d0fa581167..081c474cdad86a5340520ef09345bd456f55b5ba 100644 --- a/crates/repl/src/notebook/notebook_ui.rs +++ b/crates/repl/src/notebook/notebook_ui.rs @@ -594,9 +594,10 @@ impl project::ProjectItem for NotebookItem { }; let id = project - .update(cx, |project, cx| project.entry_for_path(&path, cx))? - .context("Entry not found")? - .id; + .update(cx, |project, cx| { + project.entry_for_path(&path, cx).map(|entry| entry.id) + })? + .context("Entry not found")?; cx.new(|_| NotebookItem { path: abs_path, diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index 4a2dbf31fc96b43db34bd9977fafb09cc5ad60d1..33458a3a88fb717ba047b57564c8804f7ebea928 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -3201,6 +3201,7 @@ pub mod tests { .read(cx) .entry_for_path(&(worktree_id, "a").into(), cx) .expect("no entry for /a/ directory") + .clone() }); assert!(a_dir_entry.is_dir()); window