3 # Functions for managing the per-buffer LSP server information
7 # A buffer can have one or more attached language servers. The
8 # "bufnrToServers" Dict contains the list of language servers attached to a
9 # buffer. The buffer number is the key for the "bufnrToServers" Dict. The
10 # value is the List of attached language servers.
11 var bufnrToServers: dict<list<dict<any>>> = {}
13 # Add "lspserver" to "bufnrToServers" map for buffer "bnr".
14 export def BufLspServerSet(bnr: number, lspserver: dict<any>)
15 if !bufnrToServers->has_key(bnr)
16 bufnrToServers[bnr] = []
19 bufnrToServers[bnr]->add(lspserver)
22 # Remove "lspserver" from "bufnrToServers" map for buffer "bnr".
23 export def BufLspServerRemove(bnr: number, lspserver: dict<any>)
24 if !bufnrToServers->has_key(bnr)
28 var servers: list<dict<any>> = bufnrToServers[bnr]
29 servers = servers->filter((key, srv) => srv.id != lspserver.id)
32 bufnrToServers->remove(bnr)
34 bufnrToServers[bnr] = servers
38 var SupportedCheckFns = {
39 callHierarchy: (lspserver) => lspserver.isCallHierarchyProvider,
40 codeAction: (lspserver) => lspserver.isCodeActionProvider,
41 codeLens: (lspserver) => lspserver.isCodeLensProvider,
42 completion: (lspserver) => lspserver.isCompletionProvider,
43 declaration: (lspserver) => lspserver.isDeclarationProvider,
44 definition: (lspserver) => lspserver.isDefinitionProvider,
45 documentFormatting: (lspserver) => lspserver.isDocumentFormattingProvider,
46 documentHighlight: (lspserver) => lspserver.isDocumentHighlightProvider,
47 documentSymbol: (lspserver) => lspserver.isDocumentSymbolProvider,
48 foldingRange: (lspserver) => lspserver.isFoldingRangeProvider,
49 hover: (lspserver) => lspserver.isHoverProvider,
50 implementation: (lspserver) => lspserver.isImplementationProvider,
51 inlayHint: (lspserver) => lspserver.isInlayHintProvider,
52 references: (lspserver) => lspserver.isReferencesProvider,
53 rename: (lspserver) => lspserver.isRenameProvider,
54 selectionRange: (lspserver) => lspserver.isSelectionRangeProvider,
55 signatureHelp: (lspserver) => lspserver.isSignatureHelpProvider,
56 typeDefinition: (lspserver) => lspserver.isTypeDefinitionProvider,
57 typeHierarchy: (lspserver) => lspserver.isTypeHierarchyProvider,
58 workspaceSymbol: (lspserver) => lspserver.isWorkspaceSymbolProvider
61 # Returns the LSP server for the buffer "bnr". If "feature" is specified,
62 # then returns the LSP server that provides the "feature".
63 # Returns an empty dict if the server is not found.
64 export def BufLspServerGet(bnr: number, feature: string = null_string): dict<any>
65 if !bufnrToServers->has_key(bnr)
69 if bufnrToServers[bnr]->empty()
73 if feature == null_string
74 return bufnrToServers[bnr][0]
77 if !SupportedCheckFns->has_key(feature)
78 # If this happns it is a programming error, and should be fixed in the
80 :throw $'Error: ''{feature}'' is not a valid feature'
83 var SupportedCheckFn = SupportedCheckFns[feature]
85 var possibleLSPs: list<dict<any>> = []
87 for lspserver in bufnrToServers[bnr]
88 if !SupportedCheckFn(lspserver)
92 possibleLSPs->add(lspserver)
95 if possibleLSPs->empty()
99 # LSP server is configured to be a provider for "feature"
100 for lspserver in possibleLSPs
101 if lspserver.features->has_key(feature) && lspserver.features[feature]
106 # Return the first LSP server that supports "feature" and doesn't have it
108 for lspserver in possibleLSPs
109 if !lspserver.features->has_key(feature)
117 # Returns the LSP server for the buffer "bnr" and with ID "id". Returns an empty
118 # dict if the server is not found.
119 export def BufLspServerGetById(bnr: number, id: number): dict<any>
120 if !bufnrToServers->has_key(bnr)
124 for lspserver in bufnrToServers[bnr]
125 if lspserver.id == id
133 # Returns the LSP servers for the buffer "bnr". Returns an empty list if the
134 # servers are not found.
135 export def BufLspServersGet(bnr: number): list<dict<any>>
136 if !bufnrToServers->has_key(bnr)
140 return bufnrToServers[bnr]
143 # Returns the LSP server for the current buffer with the optionally "feature".
144 # Returns an empty dict if the server is not found.
145 export def CurbufGetServer(feature: string = null_string): dict<any>
146 return BufLspServerGet(bufnr(), feature)
149 # Returns the LSP servers for the current buffer. Returns an empty list if the
150 # servers are not found.
151 export def CurbufGetServers(): list<dict<any>>
152 return BufLspServersGet(bufnr())
155 export def BufHasLspServer(bnr: number): bool
156 var lspserver = BufLspServerGet(bnr)
158 return !lspserver->empty()
161 # Returns the LSP server for the current buffer with the optinally "feature" if
162 # it is running and is ready.
163 # Returns an empty dict if the server is not found or is not ready.
164 export def CurbufGetServerChecked(feature: string = null_string): dict<any>
165 var fname: string = @%
170 var lspserver: dict<any> = CurbufGetServer(feature)
171 if lspserver->empty()
172 if feature == null_string
173 util.ErrMsg($'Language server for "{&filetype}" file type is not found')
175 util.ErrMsg($'Language server for "{&filetype}" file type supporting "{feature}" feature is not found')
179 if !lspserver.running
180 util.ErrMsg($'Language server for "{&filetype}" file type is not running')
184 util.ErrMsg($'Language server for "{&filetype}" file type is not ready')
191 # vim: tabstop=8 shiftwidth=2 softtabstop=2