]> Sergey Matveev's repositories - vim-lsp.git/blob - autoload/lsp/signature.vim
Pass buffer number as the argument to the autocmd handlers
[vim-lsp.git] / autoload / lsp / signature.vim
1 vim9script
2
3 # Functions related to handling LSP symbol signature help.
4
5 import './options.vim' as opt
6 import './util.vim'
7 import './buffer.vim' as buf
8
9 # close the signature popup window
10 def CloseSignaturePopup(lspserver: dict<any>)
11   lspserver.signaturePopup->popup_close()
12   lspserver.signaturePopup = -1
13 enddef
14
15 def CloseCurBufSignaturePopup()
16   var lspserver: dict<any> = buf.CurbufGetServer()
17   if lspserver->empty()
18     return
19   endif
20
21   CloseSignaturePopup(lspserver)
22 enddef
23
24 export def InitOnce()
25   hlset([{name: 'LspSigActiveParameter', default: true, linksto: 'LineNr'}])
26 enddef
27
28 # Initialize the signature triggers for the current buffer
29 export def BufferInit(lspserver: dict<any>)
30   if !lspserver.isSignatureHelpProvider
31         || !lspserver.caps.signatureHelpProvider->has_key('triggerCharacters')
32     # no support for signature help
33     return
34   endif
35
36   if !opt.lspOptions.showSignature
37     # Show signature are disabled
38     return
39   endif
40
41   # map characters that trigger signature help
42   for ch in lspserver.caps.signatureHelpProvider.triggerCharacters
43     exe $"inoremap <buffer> <silent> {ch} {ch}<C-R>=LspShowSignature()<CR>"
44   endfor
45
46   # close the signature popup when leaving insert mode
47   autocmd_add([{bufnr: bufnr(),
48                 event: 'InsertLeave',
49                 cmd: 'CloseCurBufSignaturePopup()'}])
50 enddef
51
52 # process the 'textDocument/signatureHelp' reply from the LSP server and
53 # display the symbol signature help.
54 # Result: SignatureHelp | null
55 export def SignatureHelp(lspserver: dict<any>, sighelp: any): void
56   if sighelp->empty()
57     CloseSignaturePopup(lspserver)
58     return
59   endif
60
61   if sighelp.signatures->len() <= 0
62     util.WarnMsg('No signature help available')
63     CloseSignaturePopup(lspserver)
64     return
65   endif
66
67   var sigidx: number = 0
68   if sighelp->has_key('activeSignature')
69     sigidx = sighelp.activeSignature
70   endif
71
72   var sig: dict<any> = sighelp.signatures[sigidx]
73   var text: string = sig.label
74   var hllen: number = 0
75   var startcol: number = 0
76   if sig->has_key('parameters') && sighelp->has_key('activeParameter')
77     var params_len = sig.parameters->len()
78     if params_len > 0 && sighelp.activeParameter < params_len
79       var label: string = sig.parameters[sighelp.activeParameter].label
80       hllen = label->len()
81       startcol = text->stridx(label)
82     endif
83   endif
84   if opt.lspOptions.echoSignature
85     :echon "\r\r"
86     :echon ''
87     :echon text->strpart(0, startcol)
88     :echoh LspSigActiveParameter
89     :echon text->strpart(startcol, hllen)
90     :echoh None
91     :echon text->strpart(startcol + hllen)
92   else
93     # Close the previous signature popup and open a new one
94     lspserver.signaturePopup->popup_close()
95
96     var popupID = text->popup_atcursor({moved: [col('.') - 1, 9999999]})
97     var bnr: number = popupID->winbufnr()
98     prop_type_add('signature', {bufnr: bnr, highlight: 'LspSigActiveParameter'})
99     if hllen > 0
100       prop_add(1, startcol + 1, {bufnr: bnr, length: hllen, type: 'signature'})
101     endif
102     lspserver.signaturePopup = popupID
103   endif
104 enddef
105
106 # vim: tabstop=8 shiftwidth=2 softtabstop=2