@@ -38,11 +38,43 @@ function! s:handle_signature_help(server, data) abort
38
38
endif
39
39
40
40
if ! empty (a: data [' response' ][' result' ]) && ! empty (a: data [' response' ][' result' ][' signatures' ])
41
- let l: signature = a: data [' response' ][' result' ][' signatures' ][0 ]
42
- let l: contents = [l: signature [' label' ]]
41
+ " Get current signature.
42
+ let l: signatures = get (a: data [' response' ][' result' ], ' signatures' , [])
43
+ let l: signature_index = get (a: data [' response' ][' result' ], ' activeSignature' , 0 )
44
+ let l: signature = get (l: signatures , l: signature_index , {})
45
+ if empty (l: signature )
46
+ return
47
+ endif
48
+
49
+ " Signature label.
50
+ let l: label = l: signature [' label' ]
51
+
52
+ " Mark current parameter.
53
+ if has_key (a: data [' response' ][' result' ], ' activeParameter' )
54
+ let l: parameters = get (l: signature , ' parameters' , [])
55
+ let l: parameter_index = a: data [' response' ][' result' ][' activeParameter' ]
56
+ let l: parameter = get (l: parameters , l: parameter_index , {})
57
+ let l: parameter_label = s: get_parameter_label (l: signature , l: parameter )
58
+ if ! empty (l: parameter_label )
59
+ let l: label = substitute (l: label , ' \V\(' . escape (l: parameter_label , ' \/?' ) . ' \)' , ' `\1`' , ' g' )
60
+ endif
61
+ endif
62
+
63
+ let l: contents = [l: label ]
64
+
65
+ if exists (' l:parameter' )
66
+ let l: parameter_doc = s: get_parameter_doc (l: parameter )
67
+ if ! empty (l: parameter_doc )
68
+ call add (l: contents , ' ' )
69
+ call add (l: contents , l: parameter_doc )
70
+ call add (l: contents , ' ' )
71
+ endif
72
+ endif
73
+
43
74
if has_key (l: signature , ' documentation' )
44
75
call add (l: contents , l: signature [' documentation' ])
45
76
endif
77
+
46
78
call lsp#ui#vim#output#preview (a: server , l: contents , {' statusline' : ' LSP SignatureHelp' })
47
79
return
48
80
else
@@ -51,6 +83,33 @@ function! s:handle_signature_help(server, data) abort
51
83
endif
52
84
endfunction
53
85
86
+ function ! s: get_parameter_label (signature, parameter) abort
87
+ if has_key (a: parameter , ' label' )
88
+ if type (a: parameter [' label' ]) == v: t_list
89
+ let l: string_range = a: parameter [' label' ]
90
+ return strcharpart (
91
+ \ a: signature [' label' ],
92
+ \ l: string_range [0 ],
93
+ \ l: string_range [1 ] - l: string_range [0 ])
94
+ endif
95
+ return a: parameter [' label' ]
96
+ endif
97
+ return ' '
98
+ endfunction
99
+
100
+ function ! s: get_parameter_doc (parameter) abort
101
+ if ! has_key (a: parameter , ' documentation' )
102
+ return ' '
103
+ endif
104
+
105
+ if type (a: parameter [' documentation' ]) == v: t_dict
106
+ let l: doc = copy (a: parameter [' documentation' ])
107
+ let l: doc [' value' ] = printf (' ***%s*** - %s' , a: parameter [' label' ], l: doc [' value' ])
108
+ return l: doc
109
+ endif
110
+ return printf (' ***%s*** - %s' , a: parameter [' label' ], l: doc )
111
+ endfunction
112
+
54
113
function ! s: insert_char_pre () abort
55
114
let l: buf = bufnr (' %' )
56
115
for l: server_name in lsp#get_whitelisted_servers (l: buf )
0 commit comments