Skip to content

Commit

Permalink
Resolve completion item (#1315)
Browse files Browse the repository at this point in the history
Co-authored-by: Gabriel Berto <gabriel.berto@pottencial.com.br>
  • Loading branch information
Gabrielbdd and Gabriel Berto committed Dec 25, 2021
1 parent 0e7d757 commit 5d7b5db
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 2 deletions.
8 changes: 8 additions & 0 deletions helix-lsp/src/client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,14 @@ impl Client {
self.call::<lsp::request::Completion>(params)
}

pub async fn resolve_completion_item(
&self,
completion_item: lsp::CompletionItem,
) -> Result<lsp::CompletionItem> {
self.request::<lsp::request::ResolveCompletionItem>(completion_item)
.await
}

pub fn text_document_signature_help(
&self,
text_document: lsp::TextDocumentIdentifier,
Expand Down
40 changes: 38 additions & 2 deletions helix-term/src/ui/completion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,19 @@ impl Completion {
);
doc.apply(&transaction, view.id);

if let Some(additional_edits) = &item.additional_text_edits {
// gopls uses this to add extra imports
// apply additional edits, mostly used to auto import unqualified types
let resolved_additional_text_edits = if item.additional_text_edits.is_some() {
None
} else {
Completion::resolve_completion_item(doc, item.clone())
.and_then(|item| item.additional_text_edits)
};

if let Some(additional_edits) = item
.additional_text_edits
.as_ref()
.or_else(|| resolved_additional_text_edits.as_ref())
{
if !additional_edits.is_empty() {
let transaction = util::generate_transaction_from_edits(
doc.text(),
Expand All @@ -181,6 +192,31 @@ impl Completion {
completion
}

fn resolve_completion_item(
doc: &Document,
completion_item: lsp::CompletionItem,
) -> Option<CompletionItem> {
let language_server = doc.language_server()?;
let completion_resolve_provider = language_server
.capabilities()
.completion_provider
.as_ref()?
.resolve_provider;
if completion_resolve_provider != Some(true) {
return None;
}

let future = language_server.resolve_completion_item(completion_item);
let response = helix_lsp::block_on(future);
match response {
Ok(completion_item) => Some(completion_item),
Err(err) => {
log::error!("execute LSP command: {}", err);
None
}
}
}

pub fn recompute_filter(&mut self, editor: &Editor) {
// recompute menu based on matches
let menu = self.popup.contents_mut();
Expand Down

0 comments on commit 5d7b5db

Please sign in to comment.