lsp-types-2.0.0.0: src/Language/LSP/Protocol/Capabilities.hs
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedLabels #-}
{-# LANGUAGE OverloadedStrings #-}
module Language.LSP.Protocol.Capabilities
(
fullCaps
, LSPVersion(..)
, capsForVersion
) where
import Data.Row
import qualified Data.Set as Set
import Language.LSP.Protocol.Types
import Prelude hiding (min)
{-
TODO: this is out-of-date/needs an audit
TODO: can we generate this? process the 'since' annotations in the metamodel?
-}
-- | Capabilities for full conformance to the current (v3.15) LSP specification.
fullCaps :: ClientCapabilities
fullCaps = capsForVersion (LSPVersion maxBound maxBound)
-- | A specific version of the LSP specification.
data LSPVersion = LSPVersion Int Int -- ^ Construct a major.minor version
-- | Capabilities for full conformance to the LSP specification up until a version.
-- Some important milestones:
--
-- * 3.12 textDocument/prepareRename request
-- * 3.11 CodeActionOptions provided by the server
-- * 3.10 hierarchical document symbols, folding ranges
-- * 3.9 completion item preselect
-- * 3.8 codeAction literals
-- * 3.7 related information in diagnostics
-- * 3.6 workspace folders, colors, goto type/implementation
-- * 3.4 extended completion item and symbol item kinds
-- * 3.0 dynamic registration
capsForVersion :: LSPVersion -> ClientCapabilities
capsForVersion (LSPVersion maj min) = caps
where
caps = ClientCapabilities {
_workspace=Just w
, _textDocument=Just td
, _window=Just window
, _general=since 3 16 general
, _experimental=Nothing
-- TODO
, _notebookDocument=Nothing
}
w = WorkspaceClientCapabilities {
_applyEdit = Just True
, _workspaceEdit = Just (WorkspaceEditClientCapabilities
(Just True)
(since 3 13 resourceOperations)
Nothing
(since 3 16 True)
(since 3 16 (#groupsOnLabel .== Just True)))
, _didChangeConfiguration = Just (DidChangeConfigurationClientCapabilities dynamicReg)
, _didChangeWatchedFiles = Just (DidChangeWatchedFilesClientCapabilities dynamicReg (Just True))
, _symbol = Just symbolCapabilities
, _executeCommand = Just (ExecuteCommandClientCapabilities dynamicReg)
, _workspaceFolders = since 3 6 True
, _configuration = since 3 6 True
, _semanticTokens = since 3 16 (SemanticTokensWorkspaceClientCapabilities $ Just True)
-- TODO
, _codeLens = Nothing
, _fileOperations = Nothing
, _inlineValue = Nothing
, _inlayHint = Nothing
, _diagnostics = Nothing
}
resourceOperations =
[ ResourceOperationKind_Create
, ResourceOperationKind_Delete
, ResourceOperationKind_Rename
]
symbolCapabilities = WorkspaceSymbolClientCapabilities
dynamicReg
(since 3 4 (#valueSet .== Just sKs))
(since 3 16 (#valueSet .== [SymbolTag_Deprecated]))
(since 3 17 (#properties .== []))
sKs
| maj >= 3 && min >= 4 = oldSKs ++ newSKs
| otherwise = oldSKs
oldSKs = [ SymbolKind_File
, SymbolKind_Module
, SymbolKind_Namespace
, SymbolKind_Package
, SymbolKind_Class
, SymbolKind_Method
, SymbolKind_Property
, SymbolKind_Field
, SymbolKind_Constructor
, SymbolKind_Enum
, SymbolKind_Interface
, SymbolKind_Function
, SymbolKind_Variable
, SymbolKind_Constant
, SymbolKind_String
, SymbolKind_Number
, SymbolKind_Boolean
, SymbolKind_Array
]
newSKs = [ SymbolKind_Object
, SymbolKind_Key
, SymbolKind_Null
, SymbolKind_EnumMember
, SymbolKind_Struct
, SymbolKind_Event
, SymbolKind_Operator
, SymbolKind_TypeParameter
]
-- Only one token format for now, just list it here
tfs = [ TokenFormat_Relative ]
semanticTokensCapabilities = SemanticTokensClientCapabilities {
_dynamicRegistration=Just True
, _requests= #range .== Just (InL True) .+ #full .== Just (InR (#delta .== Just True))
, _tokenTypes=toEnumBaseType <$> Set.toList (knownValues @SemanticTokenTypes)
, _tokenModifiers=toEnumBaseType <$> Set.toList (knownValues @SemanticTokenModifiers)
, _formats=tfs
, _overlappingTokenSupport=Just True
, _multilineTokenSupport=Just True
, _serverCancelSupport=Just True
, _augmentsSyntaxTokens=Just True
}
td = TextDocumentClientCapabilities {
_synchronization=Just sync
, _completion=Just completionCapability
, _hover=Just hoverCapability
, _signatureHelp=Just signatureHelpCapability
, _references=Just (ReferenceClientCapabilities dynamicReg)
, _documentHighlight=Just (DocumentHighlightClientCapabilities dynamicReg)
, _documentSymbol=Just documentSymbolCapability
, _formatting=Just (DocumentFormattingClientCapabilities dynamicReg)
, _rangeFormatting=Just (DocumentRangeFormattingClientCapabilities dynamicReg)
, _onTypeFormatting=Just (DocumentOnTypeFormattingClientCapabilities dynamicReg)
, _declaration=since 3 14 (DeclarationClientCapabilities dynamicReg (Just True))
, _definition=Just (DefinitionClientCapabilities dynamicReg (since 3 14 True))
, _typeDefinition=since 3 6 (TypeDefinitionClientCapabilities dynamicReg (since 3 14 True))
, _implementation=since 3 6 (ImplementationClientCapabilities dynamicReg (since 3 14 True))
, _codeAction=Just codeActionCapability
, _codeLens=Just (CodeLensClientCapabilities dynamicReg)
, _documentLink=Just (DocumentLinkClientCapabilities dynamicReg (since 3 15 True))
, _colorProvider=since 3 6 (DocumentColorClientCapabilities dynamicReg)
, _rename=Just (RenameClientCapabilities dynamicReg (since 3 12 True) (since 3 16 PrepareSupportDefaultBehavior_Identifier) (since 3 16 True))
, _publishDiagnostics=Just publishDiagnosticsCapabilities
, _foldingRange=since 3 10 foldingRangeCapability
, _selectionRange=since 3 5 (SelectionRangeClientCapabilities dynamicReg)
, _callHierarchy=since 3 16 (CallHierarchyClientCapabilities dynamicReg)
, _semanticTokens=since 3 16 semanticTokensCapabilities
-- TODO
, _linkedEditingRange=Nothing
, _moniker=Nothing
, _typeHierarchy=Nothing
, _inlineValue=Nothing
, _inlayHint=Nothing
, _diagnostic=Nothing
}
sync =
TextDocumentSyncClientCapabilities {
_dynamicRegistration=dynamicReg
, _willSave=Just True
, _willSaveWaitUntil=Just True
, _didSave=Just True
}
completionCapability =
CompletionClientCapabilities{
_dynamicRegistration=dynamicReg
, _completionItem=Just completionItemCapabilities
, _completionItemKind=since 3 4 (#valueSet .== Just ciKs)
, _insertTextMode=since 3 17 InsertTextMode_AsIs
, _contextSupport=since 3 3 True
, _completionList=since 3 17 (#itemDefaults .== Just [])
}
completionItemCapabilities =
#snippetSupport .== Just True
.+ #commitCharactersSupport .== Just True
.+ #documentationFormat .== since 3 3 allMarkups
.+ #deprecatedSupport .== Just True
.+ #preselectSupport .== since 3 9 True
.+ #tagSupport .== since 3 15 (#valueSet .== [])
.+ #insertReplaceSupport .== since 3 16 True
.+ #resolveSupport .== since 3 16 (#properties .== ["documentation", "details"])
.+ #insertTextModeSupport .== since 3 16 (#valueSet .== [])
.+ #labelDetailsSupport .== since 3 17 True
ciKs
| maj >= 3 && min >= 4 = oldCiKs ++ newCiKs
| otherwise = oldCiKs
oldCiKs = [ CompletionItemKind_Text
, CompletionItemKind_Method
, CompletionItemKind_Function
, CompletionItemKind_Constructor
, CompletionItemKind_Field
, CompletionItemKind_Variable
, CompletionItemKind_Class
, CompletionItemKind_Interface
, CompletionItemKind_Module
, CompletionItemKind_Property
, CompletionItemKind_Unit
, CompletionItemKind_Value
, CompletionItemKind_Enum
, CompletionItemKind_Keyword
, CompletionItemKind_Snippet
, CompletionItemKind_Color
, CompletionItemKind_File
, CompletionItemKind_Reference
]
newCiKs = [ CompletionItemKind_Folder
, CompletionItemKind_EnumMember
, CompletionItemKind_Constant
, CompletionItemKind_Struct
, CompletionItemKind_Event
, CompletionItemKind_Operator
, CompletionItemKind_TypeParameter
]
hoverCapability =
HoverClientCapabilities {
_dynamicRegistration=dynamicReg
, _contentFormat=since 3 3 allMarkups
}
codeActionCapability
= CodeActionClientCapabilities {
_dynamicRegistration=dynamicReg
, _codeActionLiteralSupport=since 3 8 (#codeActionKind .== (#valueSet .== Set.toList knownValues))
, _isPreferredSupport=since 3 15 True
, _disabledSupport=since 3 16 True
, _dataSupport=since 3 16 True
, _resolveSupport=since 3 16 (#properties .== [])
, _honorsChangeAnnotations=since 3 16 True
}
signatureHelpCapability =
SignatureHelpClientCapabilities {
_dynamicRegistration=dynamicReg
, _signatureInformation=Just (#documentationFormat .== Just allMarkups .+ #parameterInformation .== Just (#labelOffsetSupport .== Just True) .+ #activeParameterSupport .== Just True)
, _contextSupport=since 3 16 True
}
documentSymbolCapability =
DocumentSymbolClientCapabilities {
_dynamicRegistration=dynamicReg
-- same as workspace symbol kinds
, _symbolKind=Just (#valueSet .== Just sKs)
, _hierarchicalDocumentSymbolSupport=since 3 10 True
, _tagSupport=since 3 16 (#valueSet .== [SymbolTag_Deprecated])
, _labelSupport=since 3 16 True
}
foldingRangeCapability =
FoldingRangeClientCapabilities {
_dynamicRegistration=dynamicReg
, _rangeLimit=Nothing
, _lineFoldingOnly=Nothing
, _foldingRangeKind=since 3 17 (#valueSet .== Just [])
, _foldingRange=since 3 16 (#collapsedText .== Just True)
}
publishDiagnosticsCapabilities =
PublishDiagnosticsClientCapabilities {
_relatedInformation=since 3 7 True
, _tagSupport=since 3 15 (#valueSet .== [ DiagnosticTag_Unnecessary, DiagnosticTag_Deprecated ])
, _versionSupport=since 3 15 True
, _codeDescriptionSupport=since 3 16 True
, _dataSupport=since 3 16 True
}
dynamicReg
| maj >= 3 = Just True
| otherwise = Nothing
since :: Int -> Int -> a -> Maybe a
since x y a
| maj >= x && min >= y = Just a
| otherwise = Nothing
window =
WindowClientCapabilities {
_workDoneProgress=since 3 15 True
, _showMessage=since 3 16 $ ShowMessageRequestClientCapabilities Nothing
, _showDocument=since 3 16 $ ShowDocumentClientCapabilities True
}
general = GeneralClientCapabilities {
_staleRequestSupport=since 3 16 (#cancel .== True .+ #retryOnContentModified .== [])
, _regularExpressions=since 3 16 $ RegularExpressionsClientCapabilities "" Nothing
, _markdown=since 3 16 $ MarkdownClientCapabilities "" Nothing (Just [])
-- TODO
, _positionEncodings=Nothing
}
allMarkups = [MarkupKind_PlainText, MarkupKind_Markdown]