]> Sergey Matveev's repositories - vim-lsp.git/blob - autoload/lsp/buffer.vim
Update diags location list when the diags for the buffer changes. Update comments
[vim-lsp.git] / autoload / lsp / buffer.vim
1 vim9script
2
3 # Functions for managing the per-buffer LSP server information
4
5 import './util.vim'
6
7 # Buffer number to LSP server map
8 var bufnrToServers: dict<list<dict<any>>> = {}
9
10 export def BufLspServerSet(bnr: number, lspserver: dict<any>)
11   if !bufnrToServers->has_key(bnr)
12     bufnrToServers[bnr] = []
13   endif
14
15   bufnrToServers[bnr]->add(lspserver)
16 enddef
17
18 export def BufLspServerRemove(bnr: number, lspserver: dict<any>)
19   if !bufnrToServers->has_key(bnr)
20     return
21   endif
22
23   var servers: list<dict<any>> = bufnrToServers[bnr]
24   servers = servers->filter((key, srv) => srv.id != lspserver.id)
25
26   if servers->empty()
27     bufnrToServers->remove(bnr)
28   else
29     bufnrToServers[bnr] = servers
30   endif
31 enddef
32
33 var SupportedCheckFns = {
34   codeAction: (lspserver) => lspserver.isCodeActionProvider,
35   codeLens: (lspserver) => lspserver.isCodeLensProvider,
36   completion: (lspserver) => lspserver.isCompletionProvider,
37   declaration: (lspserver) => lspserver.isDeclarationProvider,
38   definition: (lspserver) => lspserver.isDefinitionProvider,
39   documentFormatting: (lspserver) => lspserver.isDocumentFormattingProvider,
40   documentHighlight: (lspserver) => lspserver.isDocumentHighlightProvider,
41   foldingRange: (lspserver) => lspserver.isFoldingRangeProvider,
42   hover: (lspserver) => lspserver.isHoverProvider,
43   implementation: (lspserver) => lspserver.isImplementationProvider,
44   references: (lspserver) => lspserver.isReferencesProvider,
45   rename: (lspserver) => lspserver.isRenameProvider,
46   selectionRange: (lspserver) => lspserver.isSelectionRangeProvider,
47   typeDefinition: (lspserver) => lspserver.isTypeDefinitionProvider,
48 }
49
50 # Returns the LSP server for the buffer "bnr".  If "feature" is specified,
51 # then returns the LSP server that provides the "feature".
52 # Returns an empty dict if the server is not found.
53 export def BufLspServerGet(bnr: number, feature: string = null_string): dict<any>
54   if !bufnrToServers->has_key(bnr)
55     return {}
56   endif
57
58   if bufnrToServers[bnr]->empty()
59     return {}
60   endif
61
62   if feature == null_string
63     return bufnrToServers[bnr][0]
64   endif
65
66   if !SupportedCheckFns->has_key(feature)
67     # If this happns it is a programming error, and should be fixed in the source code
68     :throw $'Error: ''{feature}'' is not a valid feature'
69   endif
70
71   var SupportedCheckFn = SupportedCheckFns[feature]
72
73   var possibleLSPs: list<dict<any>> = []
74
75   for lspserver in bufnrToServers[bnr]
76     if !SupportedCheckFn(lspserver)
77       continue
78     endif
79
80     possibleLSPs->add(lspserver)
81   endfor
82
83   if possibleLSPs->empty()
84     return {}
85   endif
86
87   # LSP server is configured to be a provider for "feature"
88   for lspserver in possibleLSPs
89     if lspserver.features->has_key(feature) && lspserver.features[feature]
90       return lspserver
91     endif
92   endfor
93
94   # Return the first LSP server that supports "feature" and doesn't have it
95   # disabled
96   for lspserver in possibleLSPs
97     if !lspserver.features->has_key(feature)
98       return lspserver
99     endif
100   endfor
101
102   return {}
103 enddef
104
105 # Returns the LSP server for the buffer "bnr" and with ID "id". Returns an empty
106 # dict if the server is not found.
107 export def BufLspServerGetById(bnr: number, id: number): dict<any>
108   if !bufnrToServers->has_key(bnr)
109     return {}
110   endif
111
112   for lspserver in bufnrToServers[bnr]
113     if lspserver.id == id
114       return lspserver
115     endif
116   endfor
117
118   return {}
119 enddef
120
121 # Returns the LSP servers for the buffer "bnr". Returns an empty list if the
122 # servers are not found.
123 export def BufLspServersGet(bnr: number): list<dict<any>>
124   if !bufnrToServers->has_key(bnr)
125     return []
126   endif
127
128   return bufnrToServers[bnr]
129 enddef
130
131 # Returns the LSP server for the current buffer with the optionally "feature".
132 # Returns an empty dict if the server is not found.
133 export def CurbufGetServer(feature: string = null_string): dict<any>
134   return BufLspServerGet(bufnr(), feature)
135 enddef
136
137 # Returns the LSP servers for the current buffer. Returns an empty list if the
138 # servers are not found.
139 export def CurbufGetServers(): list<dict<any>>
140   return BufLspServersGet(bufnr())
141 enddef
142
143 export def BufHasLspServer(bnr: number): bool
144   var lspserver = BufLspServerGet(bnr)
145
146   return !lspserver->empty()
147 enddef
148
149 # Returns the LSP server for the current buffer with the optinally "feature" if
150 # it is running and is ready.
151 # Returns an empty dict if the server is not found or is not ready.
152 export def CurbufGetServerChecked(feature: string = null_string): dict<any>
153   var fname: string = @%
154   if fname->empty()
155     return {}
156   endif
157
158   var lspserver: dict<any> = CurbufGetServer(feature)
159   if lspserver->empty()
160     if feature == null_string
161       util.ErrMsg($'Language server for "{&filetype}" file type is not found')
162     else
163       util.ErrMsg($'Language server for "{&filetype}" file type supporting "{feature}" feature is not found')
164     endif
165     return {}
166   endif
167   if !lspserver.running
168     util.ErrMsg($'Language server for "{&filetype}" file type is not running')
169     return {}
170   endif
171   if !lspserver.ready
172     util.ErrMsg($'Language server for "{&filetype}" file type is not ready')
173     return {}
174   endif
175
176   return lspserver
177 enddef
178
179 # vim: tabstop=8 shiftwidth=2 softtabstop=2