use join_all to build partial symbols and completions asynchronously

Isaac Clayton created

Change summary

crates/project/src/project.rs | 79 +++++++++++++++++++-----------------
1 file changed, 41 insertions(+), 38 deletions(-)

Detailed changes

crates/project/src/project.rs 🔗

@@ -3311,7 +3311,6 @@ impl Project {
                     return Ok(Default::default());
                 };
 
-                // TODO(isaac): also use join_all
                 struct PartialSymbol {
                     source_worktree_id: WorktreeId,
                     worktree_id: WorktreeId,
@@ -3366,28 +3365,30 @@ impl Project {
 
                 let mut symbols = Vec::new();
                 for ps in partial_symbols.into_iter() {
-                    let label = match ps.language {
-                        Some(language) => language.label_for_symbol(&ps.name, ps.kind).await,
-                        None => None,
-                    }
-                    .unwrap_or_else(|| CodeLabel::plain(ps.name.clone(), None));
-
-                    let language_server_name = ps.adapter.name().await;
-
-                    symbols.push(Symbol {
-                        source_worktree_id: ps.source_worktree_id,
-                        worktree_id: ps.worktree_id,
-                        language_server_name,
-                        name: ps.name,
-                        kind: ps.kind,
-                        label,
-                        path: ps.path,
-                        range: ps.range,
-                        signature: ps.signature,
+                    symbols.push(async move {
+                        let label = match ps.language {
+                            Some(language) => language.label_for_symbol(&ps.name, ps.kind).await,
+                            None => None,
+                        }
+                        .unwrap_or_else(|| CodeLabel::plain(ps.name.clone(), None));
+
+                        let language_server_name = ps.adapter.name().await;
+
+                        Symbol {
+                            source_worktree_id: ps.source_worktree_id,
+                            worktree_id: ps.worktree_id,
+                            language_server_name,
+                            name: ps.name,
+                            kind: ps.kind,
+                            label,
+                            path: ps.path,
+                            range: ps.range,
+                            signature: ps.signature,
+                        }
                     });
                 }
 
-                Ok(symbols)
+                Ok(futures::future::join_all(symbols).await)
             })
         } else if let Some(project_id) = self.remote_id() {
             let request = self.client.request(proto::GetProjectSymbols {
@@ -3678,28 +3679,30 @@ impl Project {
                 let mut result = Vec::new();
 
                 for pc in partial_completions.into_iter() {
-                    let label = match pc.language.as_ref() {
-                        Some(l) => l.label_for_completion(&pc.lsp_completion).await,
-                        None => None,
-                    }
-                    .unwrap_or_else(|| {
-                        CodeLabel::plain(
-                            pc.lsp_completion.label.clone(),
-                            pc.lsp_completion.filter_text.as_deref(),
-                        )
-                    });
+                    result.push(async move {
+                        let label = match pc.language.as_ref() {
+                            Some(l) => l.label_for_completion(&pc.lsp_completion).await,
+                            None => None,
+                        }
+                        .unwrap_or_else(|| {
+                            CodeLabel::plain(
+                                pc.lsp_completion.label.clone(),
+                                pc.lsp_completion.filter_text.as_deref(),
+                            )
+                        });
 
-                    let completion = Completion {
-                        old_range: pc.old_range,
-                        new_text: pc.new_text,
-                        label,
-                        lsp_completion: pc.lsp_completion,
-                    };
+                        let completion = Completion {
+                            old_range: pc.old_range,
+                            new_text: pc.new_text,
+                            label,
+                            lsp_completion: pc.lsp_completion,
+                        };
 
-                    result.push(completion);
+                        completion
+                    });
                 }
 
-                Ok(result)
+                Ok(futures::future::join_all(result).await)
             })
         } else if let Some(project_id) = self.remote_id() {
             let rpc = self.client.clone();