2023-09-05 16:02:27 -07:00
|
|
|
import {
|
|
|
|
Registration,
|
|
|
|
ServerCapabilities,
|
|
|
|
Unregistration,
|
|
|
|
} from 'vscode-languageserver-protocol'
|
|
|
|
|
|
|
|
interface IFlexibleServerCapabilities extends ServerCapabilities {
|
|
|
|
[key: string]: any
|
|
|
|
}
|
|
|
|
|
|
|
|
interface IMethodServerCapabilityProviderDictionary {
|
|
|
|
[key: string]: string
|
|
|
|
}
|
|
|
|
|
|
|
|
const ServerCapabilitiesProviders: IMethodServerCapabilityProviderDictionary = {
|
|
|
|
'textDocument/hover': 'hoverProvider',
|
|
|
|
'textDocument/completion': 'completionProvider',
|
|
|
|
'textDocument/signatureHelp': 'signatureHelpProvider',
|
|
|
|
'textDocument/definition': 'definitionProvider',
|
|
|
|
'textDocument/typeDefinition': 'typeDefinitionProvider',
|
|
|
|
'textDocument/implementation': 'implementationProvider',
|
|
|
|
'textDocument/references': 'referencesProvider',
|
|
|
|
'textDocument/documentHighlight': 'documentHighlightProvider',
|
|
|
|
'textDocument/documentSymbol': 'documentSymbolProvider',
|
|
|
|
'textDocument/workspaceSymbol': 'workspaceSymbolProvider',
|
|
|
|
'textDocument/codeAction': 'codeActionProvider',
|
|
|
|
'textDocument/codeLens': 'codeLensProvider',
|
|
|
|
'textDocument/documentFormatting': 'documentFormattingProvider',
|
|
|
|
'textDocument/documentRangeFormatting': 'documentRangeFormattingProvider',
|
|
|
|
'textDocument/documentOnTypeFormatting': 'documentOnTypeFormattingProvider',
|
|
|
|
'textDocument/rename': 'renameProvider',
|
|
|
|
'textDocument/documentLink': 'documentLinkProvider',
|
|
|
|
'textDocument/color': 'colorProvider',
|
|
|
|
'textDocument/foldingRange': 'foldingRangeProvider',
|
|
|
|
'textDocument/declaration': 'declarationProvider',
|
|
|
|
'textDocument/executeCommand': 'executeCommandProvider',
|
2024-02-19 12:33:16 -08:00
|
|
|
'textDocument/semanticTokens/full': 'semanticTokensProvider',
|
|
|
|
'textDocument/publishDiagnostics': 'diagnosticsProvider',
|
2023-09-05 16:02:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
function registerServerCapability(
|
|
|
|
serverCapabilities: ServerCapabilities,
|
|
|
|
registration: Registration
|
2024-06-24 11:45:40 -04:00
|
|
|
): ServerCapabilities | Error {
|
2024-07-25 20:11:46 -04:00
|
|
|
const serverCapabilitiesCopy = structuredClone(
|
|
|
|
serverCapabilities
|
2023-09-05 16:02:27 -07:00
|
|
|
) as IFlexibleServerCapabilities
|
|
|
|
const { method, registerOptions } = registration
|
|
|
|
const providerName = ServerCapabilitiesProviders[method]
|
|
|
|
|
|
|
|
if (providerName) {
|
|
|
|
if (!registerOptions) {
|
|
|
|
serverCapabilitiesCopy[providerName] = true
|
|
|
|
} else {
|
|
|
|
serverCapabilitiesCopy[providerName] = Object.assign(
|
|
|
|
{},
|
2024-07-25 20:11:46 -04:00
|
|
|
structuredClone(registerOptions)
|
2023-09-05 16:02:27 -07:00
|
|
|
)
|
|
|
|
}
|
|
|
|
} else {
|
2024-06-24 11:45:40 -04:00
|
|
|
return new Error('Could not register server capability.')
|
2023-09-05 16:02:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
return serverCapabilitiesCopy
|
|
|
|
}
|
|
|
|
|
|
|
|
function unregisterServerCapability(
|
|
|
|
serverCapabilities: ServerCapabilities,
|
|
|
|
unregistration: Unregistration
|
|
|
|
): ServerCapabilities {
|
2024-07-25 20:11:46 -04:00
|
|
|
const serverCapabilitiesCopy = structuredClone(
|
|
|
|
serverCapabilities
|
2023-09-05 16:02:27 -07:00
|
|
|
) as IFlexibleServerCapabilities
|
|
|
|
const { method } = unregistration
|
|
|
|
const providerName = ServerCapabilitiesProviders[method]
|
|
|
|
|
|
|
|
delete serverCapabilitiesCopy[providerName]
|
|
|
|
|
|
|
|
return serverCapabilitiesCopy
|
|
|
|
}
|
|
|
|
|
|
|
|
export { registerServerCapability, unregisterServerCapability }
|