use join_all to build partial symbols and completions asynchronously

This commit is contained in:
Isaac Clayton 2022-07-06 11:13:28 +02:00
parent 602fe14aa4
commit 0872e9b1a7

View file

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