on master help sign in
Resolve completion item (#1315)
5d7b5dbGabriel Berto
helix-lsp/src/client.rs+8
@@ -556,6 +556,14 @@ impl Client {
556 self.call::<lsp::request::Completion>(params)
556 self.call::<lsp::request::Completion>(params)
557 }
557 }
558
558
559+ pub async fn resolve_completion_item(
560+ &self,
561+ completion_item: lsp::CompletionItem,
562+ ) -> Result<lsp::CompletionItem> {
563+ self.request::<lsp::request::ResolveCompletionItem>(completion_item)
564+ .await
565+ }
566+
559 pub fn text_document_signature_help(
567 pub fn text_document_signature_help(
560 &self,
568 &self,
561 text_document: lsp::TextDocumentIdentifier,
569 text_document: lsp::TextDocumentIdentifier,
helix-term/src/ui/completion.rs+38−2
@@ -154,8 +154,19 @@ impl Completion {
154 );
154 );
155 doc.apply(&transaction, view.id);
155 doc.apply(&transaction, view.id);
156
156
157− if let Some(additional_edits) = &item.additional_text_edits {
157+ // apply additional edits, mostly used to auto import unqualified types
158− // gopls uses this to add extra imports
158+ let resolved_additional_text_edits = if item.additional_text_edits.is_some() {
159+ None
160+ } else {
161+ Completion::resolve_completion_item(doc, item.clone())
162+ .and_then(|item| item.additional_text_edits)
163+ };
164+
165+ if let Some(additional_edits) = item
166+ .additional_text_edits
167+ .as_ref()
168+ .or_else(|| resolved_additional_text_edits.as_ref())
169+ {
159 if !additional_edits.is_empty() {
170 if !additional_edits.is_empty() {
160 let transaction = util::generate_transaction_from_edits(
171 let transaction = util::generate_transaction_from_edits(
161 doc.text(),
172 doc.text(),
@@ -181,6 +192,31 @@ impl Completion {
181 completion
192 completion
182 }
193 }
183
194
195+ fn resolve_completion_item(
196+ doc: &Document,
197+ completion_item: lsp::CompletionItem,
198+ ) -> Option<CompletionItem> {
199+ let language_server = doc.language_server()?;
200+ let completion_resolve_provider = language_server
201+ .capabilities()
202+ .completion_provider
203+ .as_ref()?
204+ .resolve_provider;
205+ if completion_resolve_provider != Some(true) {
206+ return None;
207+ }
208+
209+ let future = language_server.resolve_completion_item(completion_item);
210+ let response = helix_lsp::block_on(future);
211+ match response {
212+ Ok(completion_item) => Some(completion_item),
213+ Err(err) => {
214+ log::error!("execute LSP command: {}", err);
215+ None
216+ }
217+ }
218+ }
219+
184 pub fn recompute_filter(&mut self, editor: &Editor) {
220 pub fn recompute_filter(&mut self, editor: &Editor) {
185 // recompute menu based on matches
221 // recompute menu based on matches
186 let menu = self.popup.contents_mut();
222 let menu = self.popup.contents_mut();