3 # Functions for managing the per-buffer LSP server information
7 # Buffer number to LSP server map
8 var bufnrToServers: dict<list<dict<any>>> = {}
10 export def BufLspServerSet(bnr: number, lspserver: dict<any>)
11 if !bufnrToServers->has_key(bnr)
12 bufnrToServers[bnr] = []
15 bufnrToServers[bnr]->add(lspserver)
18 export def BufLspServerRemove(bnr: number, lspserver: dict<any>)
19 if !bufnrToServers->has_key(bnr)
23 var servers: list<dict<any>> = bufnrToServers[bnr]
24 servers = servers->filter((key, srv) => srv.id != lspserver.id)
27 bufnrToServers->remove(bnr)
29 bufnrToServers[bnr] = servers
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,
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)
58 if bufnrToServers[bnr]->empty()
62 if feature == null_string
63 return bufnrToServers[bnr][0]
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'
71 var SupportedCheckFn = SupportedCheckFns[feature]
73 var possibleLSPs: list<dict<any>> = []
75 for lspserver in bufnrToServers[bnr]
76 if !SupportedCheckFn(lspserver)
80 possibleLSPs->add(lspserver)
83 if possibleLSPs->empty()
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]
94 # Return the first LSP server that supports "feature" and doesn't have it
96 for lspserver in possibleLSPs
97 if !lspserver.features->has_key(feature)
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)
112 for lspserver in bufnrToServers[bnr]
113 if lspserver.id == id
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)
128 return bufnrToServers[bnr]
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)
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())
143 export def BufHasLspServer(bnr: number): bool
144 var lspserver = BufLspServerGet(bnr)
146 return !lspserver->empty()
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 = @%
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')
163 util.ErrMsg($'Language server for "{&filetype}" file type supporting "{feature}" feature is not found')
167 if !lspserver.running
168 util.ErrMsg($'Language server for "{&filetype}" file type is not running')
172 util.ErrMsg($'Language server for "{&filetype}" file type is not ready')
179 # vim: tabstop=8 shiftwidth=2 softtabstop=2