@@ -275,14 +275,23 @@ fn completion_item(
275275) {
276276 let insert_replace_support = config. insert_replace_support ( ) . then_some ( tdpp. position ) ;
277277 let ref_match = item. ref_match ( ) ;
278- let lookup = item. lookup ( ) . to_owned ( ) ;
279278
280279 let mut additional_text_edits = Vec :: new ( ) ;
281280 let mut something_to_resolve = false ;
282281
282+ let filter_text = if fields_to_resolve. resolve_filter_text {
283+ something_to_resolve = !item. lookup ( ) . is_empty ( ) ;
284+ None
285+ } else {
286+ Some ( item. lookup ( ) . to_owned ( ) )
287+ } ;
288+
283289 // LSP does not allow arbitrary edits in completion, so we have to do a
284290 // non-trivial mapping here.
285- let text_edit = {
291+ let text_edit = if fields_to_resolve. resolve_text_edit {
292+ something_to_resolve = true ;
293+ None
294+ } else {
286295 let mut text_edit = None ;
287296 let source_range = item. source_range ;
288297 for indel in item. text_edit {
@@ -305,25 +314,49 @@ fn completion_item(
305314 additional_text_edits. push ( text_edit) ;
306315 }
307316 }
308- text_edit. unwrap ( )
317+ Some ( text_edit. unwrap ( ) )
309318 } ;
310319
311320 let insert_text_format = item. is_snippet . then_some ( lsp_types:: InsertTextFormat :: SNIPPET ) ;
312- let tags = item. deprecated . then ( || vec ! [ lsp_types:: CompletionItemTag :: DEPRECATED ] ) ;
321+ let tags = if fields_to_resolve. resolve_tags {
322+ something_to_resolve = item. deprecated ;
323+ None
324+ } else {
325+ item. deprecated . then ( || vec ! [ lsp_types:: CompletionItemTag :: DEPRECATED ] )
326+ } ;
313327 let command = if item. trigger_call_info && config. client_commands ( ) . trigger_parameter_hints {
314- Some ( command:: trigger_parameter_hints ( ) )
328+ if fields_to_resolve. resolve_command {
329+ something_to_resolve = true ;
330+ Some ( command:: trigger_parameter_hints ( ) )
331+ } else {
332+ None
333+ }
315334 } else {
316335 None
317336 } ;
318337
338+ let detail = if fields_to_resolve. resolve_detail {
339+ something_to_resolve = item. detail . is_some ( ) ;
340+ None
341+ } else {
342+ item. detail
343+ } ;
344+
345+ let documentation = if fields_to_resolve. resolve_documentation {
346+ something_to_resolve = item. documentation . is_some ( ) ;
347+ None
348+ } else {
349+ item. documentation . map ( documentation)
350+ } ;
351+
319352 let mut lsp_item = lsp_types:: CompletionItem {
320353 label : item. label . to_string ( ) ,
321- detail : item . detail ,
322- filter_text : Some ( lookup ) ,
354+ detail,
355+ filter_text,
323356 kind : Some ( completion_item_kind ( item. kind ) ) ,
324- text_edit : Some ( text_edit ) ,
357+ text_edit,
325358 additional_text_edits : Some ( additional_text_edits) ,
326- documentation : item . documentation . map ( documentation ) ,
359+ documentation,
327360 deprecated : Some ( item. deprecated ) ,
328361 tags,
329362 command,
@@ -332,34 +365,40 @@ fn completion_item(
332365 } ;
333366
334367 if config. completion_label_details_support ( ) {
335- lsp_item. label_details = Some ( lsp_types:: CompletionItemLabelDetails {
336- detail : item. label_detail . as_ref ( ) . map ( ToString :: to_string) ,
337- description : lsp_item. detail . clone ( ) ,
338- } ) ;
368+ if fields_to_resolve. resolve_label_details {
369+ something_to_resolve = true ;
370+ } else {
371+ lsp_item. label_details = Some ( lsp_types:: CompletionItemLabelDetails {
372+ detail : item. label_detail . as_ref ( ) . map ( ToString :: to_string) ,
373+ description : lsp_item. detail . clone ( ) ,
374+ } ) ;
375+ }
339376 } else if let Some ( label_detail) = item. label_detail {
340377 lsp_item. label . push_str ( label_detail. as_str ( ) ) ;
341378 }
342379
343380 set_score ( & mut lsp_item, max_relevance, item. relevance ) ;
344381
345- if config. completion ( None ) . enable_imports_on_the_fly && !item. import_to_add . is_empty ( ) {
346- let imports = item
347- . import_to_add
348- . into_iter ( )
349- . map ( |( import_path, import_name) | lsp_ext:: CompletionImport {
350- full_import_path : import_path,
351- imported_name : import_name,
352- } )
353- . collect :: < Vec < _ > > ( ) ;
354- if !imports. is_empty ( ) {
355- let data = lsp_ext:: CompletionResolveData {
356- position : tdpp. clone ( ) ,
357- imports,
358- version,
359- completion_trigger_character,
360- } ;
361- lsp_item. data = Some ( to_value ( data) . unwrap ( ) ) ;
362- }
382+ let imports =
383+ if config. completion ( None ) . enable_imports_on_the_fly && !item. import_to_add . is_empty ( ) {
384+ item. import_to_add
385+ . into_iter ( )
386+ . map ( |( import_path, import_name) | lsp_ext:: CompletionImport {
387+ full_import_path : import_path,
388+ imported_name : import_name,
389+ } )
390+ . collect ( )
391+ } else {
392+ Vec :: new ( )
393+ } ;
394+ if something_to_resolve || !imports. is_empty ( ) {
395+ let data = lsp_ext:: CompletionResolveData {
396+ position : tdpp. clone ( ) ,
397+ imports,
398+ version,
399+ completion_trigger_character,
400+ } ;
401+ lsp_item. data = Some ( to_value ( data) . unwrap ( ) ) ;
363402 }
364403
365404 if let Some ( ( label, indel, relevance) ) = ref_match {
0 commit comments