@@ -21,6 +21,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
21
21
:filter_text ,
22
22
# Lower priority is shown higher in the result list
23
23
:priority ,
24
+ :label_details ,
24
25
:tags ,
25
26
:command ,
26
27
{ :preselect , false } ,
@@ -304,6 +305,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
304
305
% {
305
306
type: :module ,
306
307
name: name ,
308
+ full_name: full_name ,
307
309
summary: summary ,
308
310
subtype: subtype ,
309
311
metadata: metadata ,
@@ -317,14 +319,19 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
317
319
) do
318
320
completion_without_additional_text_edit =
319
321
from_completion_item (
320
- % { type: :module , name: name , summary: summary , subtype: subtype , metadata: metadata } ,
322
+ % {
323
+ type: :module ,
324
+ name: name ,
325
+ full_name: full_name ,
326
+ summary: summary ,
327
+ subtype: subtype ,
328
+ metadata: metadata
329
+ } ,
321
330
% { def_before: nil } ,
322
331
options
323
332
)
324
333
325
- alias_value =
326
- Atom . to_string ( required_alias )
327
- |> String . replace_prefix ( "Elixir." , "" )
334
+ alias_value = inspect ( required_alias )
328
335
329
336
indentation =
330
337
if column_to_insert_alias >= 1 ,
@@ -333,17 +340,33 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
333
340
334
341
alias_edit = indentation <> "alias " <> alias_value <> "\n "
335
342
343
+ label_details =
344
+ Map . update! (
345
+ completion_without_additional_text_edit . label_details ,
346
+ "description" ,
347
+ & ( "alias " <> & 1 )
348
+ )
349
+
336
350
struct ( completion_without_additional_text_edit ,
337
351
additional_text_edit: % TextEdit {
338
352
range: range ( line_to_insert_alias , 0 , line_to_insert_alias , 0 ) ,
339
353
newText: alias_edit
340
354
} ,
341
- documentation: alias_value <> "\n " <> summary
355
+ documentation: alias_value <> "\n " <> summary ,
356
+ label_details: label_details ,
357
+ priority: 24
342
358
)
343
359
end
344
360
345
361
defp from_completion_item (
346
- % { type: :module , name: name , summary: summary , subtype: subtype , metadata: metadata } ,
362
+ % {
363
+ type: :module ,
364
+ name: name ,
365
+ full_name: full_name ,
366
+ summary: summary ,
367
+ subtype: subtype ,
368
+ metadata: metadata
369
+ } ,
347
370
% { def_before: nil } ,
348
371
_options
349
372
) do
@@ -363,27 +386,38 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
363
386
_ -> :module
364
387
end
365
388
366
- label =
367
- if subtype do
368
- " #{ name } ( #{ subtype } )"
369
- else
370
- name
371
- end
389
+ label_details = % {
390
+ "description" => full_name
391
+ }
392
+
393
+ label_details =
394
+ if detail != "module" , do: Map . put ( label_details , "detail" , detail ) , else: label_details
372
395
373
396
insert_text =
374
397
case name do
375
398
":" <> rest -> rest
376
399
other -> other
377
400
end
378
401
402
+ priority =
403
+ case subtype do
404
+ :exception ->
405
+ # show exceptions after functions
406
+ 18
407
+
408
+ _ ->
409
+ 14
410
+ end
411
+
379
412
% __MODULE__ {
380
- label: label ,
413
+ label: name ,
381
414
kind: kind ,
382
415
detail: detail ,
383
416
documentation: summary ,
384
417
insert_text: insert_text ,
385
418
filter_text: name ,
386
- priority: 14 ,
419
+ label_details: label_details ,
420
+ priority: priority ,
387
421
tags: metadata_to_tags ( metadata )
388
422
}
389
423
end
@@ -546,8 +580,15 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
546
580
_context ,
547
581
_options
548
582
) do
549
- % { name: name , arity: arity , origin: _origin , doc: doc , signature: signature , spec: spec } =
550
- suggestion
583
+ % {
584
+ name: name ,
585
+ arity: arity ,
586
+ args_list: args_list ,
587
+ origin: origin ,
588
+ doc: doc ,
589
+ signature: signature ,
590
+ spec: spec
591
+ } = suggestion
551
592
552
593
formatted_spec =
553
594
if spec != "" do
@@ -564,8 +605,12 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
564
605
end
565
606
566
607
% __MODULE__ {
567
- label: signature ,
608
+ label: name ,
568
609
detail: "typespec #{ signature } " ,
610
+ label_details: % {
611
+ "detail" => "(#{ Enum . join ( args_list , ", " ) } )" ,
612
+ "description" => if ( origin , do: "#{ origin } .#{ name } /#{ arity } " , else: "#{ name } /#{ arity } " )
613
+ } ,
569
614
documentation: "#{ doc } #{ formatted_spec } " ,
570
615
insert_text: snippet ,
571
616
priority: 10 ,
@@ -952,7 +997,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
952
997
{ name , name }
953
998
954
999
true ->
955
- label = " #{ name } / #{ arity } "
1000
+ label = name
956
1001
957
1002
insert_text =
958
1003
function_snippet (
@@ -997,6 +1042,10 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
997
1042
label: label ,
998
1043
kind: :function ,
999
1044
detail: detail ,
1045
+ label_details: % {
1046
+ "detail" => "(#{ Enum . join ( args_list , ", " ) } )" ,
1047
+ "description" => "#{ origin } .#{ name } /#{ arity } "
1048
+ } ,
1000
1049
documentation: summary <> footer ,
1001
1050
insert_text: insert_text ,
1002
1051
priority: 17 ,
@@ -1044,6 +1093,7 @@ defmodule ElixirLS.LanguageServer.Providers.Completion do
1044
1093
"kind" => completion_kind ( item . kind ) ,
1045
1094
"detail" => item . detail ,
1046
1095
"documentation" => % { "value" => item . documentation || "" , kind: "markdown" } ,
1096
+ "labelDetails" => item . label_details ,
1047
1097
"filterText" => item . filter_text ,
1048
1098
"sortText" => String . pad_leading ( to_string ( idx ) , 8 , "0" ) ,
1049
1099
"insertText" => item . insert_text ,
0 commit comments