diff --git a/crates/agent/src/tools/grep_tool.rs b/crates/agent/src/tools/grep_tool.rs index 0caba91564fd1fc9e670909490d4e776b8ad6f11..470b9bbe31fe7daeb2e75bddf8f0a4d3b092d31a 100644 --- a/crates/agent/src/tools/grep_tool.rs +++ b/crates/agent/src/tools/grep_tool.rs @@ -176,14 +176,15 @@ impl AgentTool for GrepTool { let project = self.project.downgrade(); cx.spawn(async move |cx| { - futures::pin_mut!(results); + let rx = results.rx; + futures::pin_mut!(rx); let mut output = String::new(); let mut skips_remaining = input.offset; let mut matches_found = 0; let mut has_more_matches = false; - 'outer: while let Some(SearchResult::Buffer { buffer, ranges }) = results.next().await { + 'outer: while let Some(SearchResult::Buffer { buffer, ranges }) = rx.next().await { if ranges.is_empty() { continue; } diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index 25a19788fdb464f5f289ef3bc3513f21743e3a9a..28cd83af196ae2681da6a7b2cc04d4efffe1907f 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -48,7 +48,7 @@ pub use git_store::{ git_traversal::{ChildEntriesGitIter, GitEntry, GitEntryRef, GitTraversal}, }; pub use manifest_tree::ManifestTree; -pub use project_search::Search; +pub use project_search::{Search, SearchResults}; use anyhow::{Context as _, Result, anyhow}; use buffer_store::{BufferStore, BufferStoreEvent}; @@ -108,7 +108,6 @@ use rpc::{ use search::{SearchInputKind, SearchQuery, SearchResult}; use search_history::SearchHistory; use settings::{InvalidSettingsError, RegisterSetting, Settings, SettingsLocation, SettingsStore}; -use smol::channel::Receiver; use snippet::Snippet; pub use snippet_provider; use snippet_provider::SnippetProvider; @@ -4146,7 +4145,11 @@ impl Project { searcher.into_handle(query, cx) } - pub fn search(&mut self, query: SearchQuery, cx: &mut Context) -> Receiver { + pub fn search( + &mut self, + query: SearchQuery, + cx: &mut Context, + ) -> SearchResults { self.search_impl(query, cx).results(cx) } @@ -5038,7 +5041,7 @@ impl Project { buffer_ids: Vec::new(), }; - while let Ok(buffer) = results.recv().await { + while let Ok(buffer) = results.rx.recv().await { this.update(&mut cx, |this, cx| { let buffer_id = this.create_buffer_for_peer(&buffer, peer_id, cx); response.buffer_ids.push(buffer_id.to_proto()); diff --git a/crates/project/src/project_search.rs b/crates/project/src/project_search.rs index 90687f247338750b2c1197037576098281083e36..249df8ebd1648ca024be9d55c64bf2440b45e76d 100644 --- a/crates/project/src/project_search.rs +++ b/crates/project/src/project_search.rs @@ -67,14 +67,22 @@ pub struct SearchResultsHandle { trigger_search: Box Task<()> + Send + Sync>, } +pub struct SearchResults { + pub _task_handle: Task<()>, + pub rx: Receiver, +} impl SearchResultsHandle { - pub fn results(self, cx: &mut App) -> Receiver { - (self.trigger_search)(cx).detach(); - self.results + pub fn results(self, cx: &mut App) -> SearchResults { + SearchResults { + _task_handle: (self.trigger_search)(cx), + rx: self.results, + } } - pub fn matching_buffers(self, cx: &mut App) -> Receiver> { - (self.trigger_search)(cx).detach(); - self.matching_buffers + pub fn matching_buffers(self, cx: &mut App) -> SearchResults> { + SearchResults { + _task_handle: (self.trigger_search)(cx), + rx: self.matching_buffers, + } } } diff --git a/crates/remote_server/src/headless_project.rs b/crates/remote_server/src/headless_project.rs index c83cc6aa34402a082fe104d64a8cb47f460704b8..30567c465ef16f4b62ee596507b03fa9f5763472 100644 --- a/crates/remote_server/src/headless_project.rs +++ b/crates/remote_server/src/headless_project.rs @@ -789,7 +789,7 @@ impl HeadlessProject { let buffer_store = this.read_with(&cx, |this, _| this.buffer_store.clone())?; - while let Ok(buffer) = results.recv().await { + while let Ok(buffer) = results.rx.recv().await { let buffer_id = buffer.read_with(&cx, |this, _| this.remote_id())?; response.buffer_ids.push(buffer_id.to_proto()); buffer_store diff --git a/crates/search/src/project_search.rs b/crates/search/src/project_search.rs index e0bbf58ce6f1d0c752914bbbfa6fcdf70ea30175..3c3fb18f27b4597367b1f08304bc4d64dc5507ca 100644 --- a/crates/search/src/project_search.rs +++ b/crates/search/src/project_search.rs @@ -25,7 +25,7 @@ use itertools::Itertools; use language::{Buffer, Language}; use menu::Confirm; use project::{ - Project, ProjectPath, + Project, ProjectPath, SearchResults, search::{SearchInputKind, SearchQuery}, search_history::SearchHistoryCursor, }; @@ -326,7 +326,9 @@ impl ProjectSearch { self.active_query = Some(query); self.match_ranges.clear(); self.pending_search = Some(cx.spawn(async move |project_search, cx| { - let mut matches = pin!(search.ready_chunks(1024)); + let SearchResults { rx, _task_handle } = search; + + let mut matches = pin!(rx.ready_chunks(1024)); project_search .update(cx, |project_search, cx| { project_search.match_ranges.clear();