Detailed changes
@@ -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;
}
@@ -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<Self>) -> Receiver<SearchResult> {
+ pub fn search(
+ &mut self,
+ query: SearchQuery,
+ cx: &mut Context<Self>,
+ ) -> SearchResults<SearchResult> {
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());
@@ -67,14 +67,22 @@ pub struct SearchResultsHandle {
trigger_search: Box<dyn FnOnce(&mut App) -> Task<()> + Send + Sync>,
}
+pub struct SearchResults<T> {
+ pub _task_handle: Task<()>,
+ pub rx: Receiver<T>,
+}
impl SearchResultsHandle {
- pub fn results(self, cx: &mut App) -> Receiver<SearchResult> {
- (self.trigger_search)(cx).detach();
- self.results
+ pub fn results(self, cx: &mut App) -> SearchResults<SearchResult> {
+ SearchResults {
+ _task_handle: (self.trigger_search)(cx),
+ rx: self.results,
+ }
}
- pub fn matching_buffers(self, cx: &mut App) -> Receiver<Entity<Buffer>> {
- (self.trigger_search)(cx).detach();
- self.matching_buffers
+ pub fn matching_buffers(self, cx: &mut App) -> SearchResults<Entity<Buffer>> {
+ SearchResults {
+ _task_handle: (self.trigger_search)(cx),
+ rx: self.matching_buffers,
+ }
}
}
@@ -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
@@ -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();