@@ -275,14 +275,23 @@ fn completion_item(
275
275
) {
276
276
let insert_replace_support = config. insert_replace_support ( ) . then_some ( tdpp. position ) ;
277
277
let ref_match = item. ref_match ( ) ;
278
- let lookup = item. lookup ( ) . to_owned ( ) ;
279
278
280
279
let mut additional_text_edits = Vec :: new ( ) ;
281
280
let mut something_to_resolve = false ;
282
281
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
+
283
289
// LSP does not allow arbitrary edits in completion, so we have to do a
284
290
// 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 {
286
295
let mut text_edit = None ;
287
296
let source_range = item. source_range ;
288
297
for indel in item. text_edit {
@@ -305,25 +314,49 @@ fn completion_item(
305
314
additional_text_edits. push ( text_edit) ;
306
315
}
307
316
}
308
- text_edit. unwrap ( )
317
+ Some ( text_edit. unwrap ( ) )
309
318
} ;
310
319
311
320
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
+ } ;
313
327
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
+ }
315
334
} else {
316
335
None
317
336
} ;
318
337
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
+
319
352
let mut lsp_item = lsp_types:: CompletionItem {
320
353
label : item. label . to_string ( ) ,
321
- detail : item . detail ,
322
- filter_text : Some ( lookup ) ,
354
+ detail,
355
+ filter_text,
323
356
kind : Some ( completion_item_kind ( item. kind ) ) ,
324
- text_edit : Some ( text_edit ) ,
357
+ text_edit,
325
358
additional_text_edits : Some ( additional_text_edits) ,
326
- documentation : item . documentation . map ( documentation ) ,
359
+ documentation,
327
360
deprecated : Some ( item. deprecated ) ,
328
361
tags,
329
362
command,
@@ -332,34 +365,40 @@ fn completion_item(
332
365
} ;
333
366
334
367
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
+ }
339
376
} else if let Some ( label_detail) = item. label_detail {
340
377
lsp_item. label . push_str ( label_detail. as_str ( ) ) ;
341
378
}
342
379
343
380
set_score ( & mut lsp_item, max_relevance, item. relevance ) ;
344
381
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 ( ) ) ;
363
402
}
364
403
365
404
if let Some ( ( label, indel, relevance) ) = ref_match {
0 commit comments