11{-# LANGUAGE DuplicateRecordFields #-}
22{-# LANGUAGE OverloadedLabels #-}
33{-# LANGUAGE OverloadedStrings #-}
4+ {-# LANGUAGE FlexibleContexts #-}
5+ {-# LANGUAGE RankNTypes #-}
46module Language.LSP.Protocol.Capabilities
57 (
68 fullCaps
79 , LSPVersion (.. )
810 , capsForVersion
11+ , dynamicRegistrationSupported
912 ) where
1013
14+ import Control.Lens
1115import Data.Row
1216import qualified Data.Set as Set
17+ import Data.Maybe
1318import Language.LSP.Protocol.Types
19+ import Language.LSP.Protocol.Message
20+ import qualified Language.LSP.Protocol.Lens as L
1421import Prelude hiding (min )
1522
1623{-
1724TODO: this is out-of-date/needs an audit
1825TODO: can we generate this? process the 'since' annotations in the metamodel?
1926-}
2027
21- -- | Capabilities for full conformance to the current (v3.15) LSP specification.
28+ -- | Capabilities for full conformance to the current LSP specification.
2229fullCaps :: ClientCapabilities
2330fullCaps = capsForVersion (LSPVersion maxBound maxBound )
2431
2532-- | A specific version of the LSP specification.
26- data LSPVersion = LSPVersion Int Int -- ^ Construct a major.minor version
33+ data LSPVersion = LSPVersion Int Int
2734
2835-- | Capabilities for full conformance to the LSP specification up until a version.
29- -- Some important milestones:
30- --
31- -- * 3.12 textDocument/prepareRename request
32- -- * 3.11 CodeActionOptions provided by the server
33- -- * 3.10 hierarchical document symbols, folding ranges
34- -- * 3.9 completion item preselect
35- -- * 3.8 codeAction literals
36- -- * 3.7 related information in diagnostics
37- -- * 3.6 workspace folders, colors, goto type/implementation
38- -- * 3.4 extended completion item and symbol item kinds
39- -- * 3.0 dynamic registration
4036capsForVersion :: LSPVersion -> ClientCapabilities
4137capsForVersion (LSPVersion maj min ) = caps
4238 where
@@ -45,9 +41,8 @@ capsForVersion (LSPVersion maj min) = caps
4541 , _textDocument= Just td
4642 , _window= Just window
4743 , _general= since 3 16 general
44+ , _notebookDocument= since 3 17 $ NotebookDocumentClientCapabilities $ NotebookDocumentSyncClientCapabilities dynamicReg (Just True )
4845 , _experimental= Nothing
49- -- TODO
50- , _notebookDocument= Nothing
5146 }
5247 w = WorkspaceClientCapabilities {
5348 _applyEdit = Just True
@@ -61,15 +56,14 @@ capsForVersion (LSPVersion maj min) = caps
6156 , _didChangeWatchedFiles = Just (DidChangeWatchedFilesClientCapabilities dynamicReg (Just True ))
6257 , _symbol = Just symbolCapabilities
6358 , _executeCommand = Just (ExecuteCommandClientCapabilities dynamicReg)
59+ , _codeLens = Just (CodeLensWorkspaceClientCapabilities $ Just True )
6460 , _workspaceFolders = since 3 6 True
6561 , _configuration = since 3 6 True
6662 , _semanticTokens = since 3 16 (SemanticTokensWorkspaceClientCapabilities $ Just True )
67- , _inlayHint = since 3 17 inlayHint
68- -- TODO
69- , _codeLens = Nothing
70- , _fileOperations = Nothing
71- , _inlineValue = Nothing
72- , _diagnostics = Nothing
63+ , _inlayHint = since 3 17 (InlayHintWorkspaceClientCapabilities $ Just True )
64+ , _fileOperations = since 3 16 fileOperations
65+ , _inlineValue = since 3 17 (InlineValueWorkspaceClientCapabilities $ Just True )
66+ , _diagnostics = since 3 17 (DiagnosticWorkspaceClientCapabilities $ Just True )
7367 }
7468
7569 resourceOperations =
@@ -78,6 +72,15 @@ capsForVersion (LSPVersion maj min) = caps
7872 , ResourceOperationKind_Rename
7973 ]
8074
75+ fileOperations = FileOperationClientCapabilities
76+ dynamicReg
77+ (Just True )
78+ (Just True )
79+ (Just True )
80+ (Just True )
81+ (Just True )
82+ (Just True )
83+
8184 symbolCapabilities = WorkspaceSymbolClientCapabilities
8285 dynamicReg
8386 (since 3 4 (# valueSet .== Just sKs))
@@ -158,13 +161,12 @@ capsForVersion (LSPVersion maj min) = caps
158161 , _selectionRange= since 3 5 (SelectionRangeClientCapabilities dynamicReg)
159162 , _callHierarchy= since 3 16 (CallHierarchyClientCapabilities dynamicReg)
160163 , _semanticTokens= since 3 16 semanticTokensCapabilities
164+ , _linkedEditingRange= since 3 16 (LinkedEditingRangeClientCapabilities dynamicReg)
165+ , _moniker= since 3 16 (MonikerClientCapabilities dynamicReg)
161166 , _inlayHint= since 3 17 inlayHintCapabilities
162- -- TODO
163- , _linkedEditingRange= Nothing
164- , _moniker= Nothing
165- , _typeHierarchy= Nothing
166- , _inlineValue= Nothing
167- , _diagnostic= Nothing
167+ , _typeHierarchy= since 3 17 (TypeHierarchyClientCapabilities dynamicReg)
168+ , _inlineValue= since 3 17 (InlineValueClientCapabilities dynamicReg)
169+ , _diagnostic= since 3 17 (DiagnosticClientCapabilities dynamicReg (Just True ))
168170 }
169171
170172 sync =
@@ -184,16 +186,11 @@ capsForVersion (LSPVersion maj min) = caps
184186 , _contextSupport= since 3 3 True
185187 , _completionList= since 3 17 (# itemDefaults .== Just [] )
186188 }
187-
188- inlayHint =
189- InlayHintWorkspaceClientCapabilities {
190- _refreshSupport= since 3 17 True
191- }
192-
189+
193190 inlayHintCapabilities =
194191 InlayHintClientCapabilities {
195192 _dynamicRegistration= dynamicReg,
196- _resolveSupport= since 3 17 (# properties .== [] )
193+ _resolveSupport= Just (# properties .== [] )
197194 }
198195
199196 completionItemCapabilities =
@@ -312,8 +309,63 @@ capsForVersion (LSPVersion maj min) = caps
312309 _staleRequestSupport= since 3 16 (# cancel .== True .+ # retryOnContentModified .== [] )
313310 , _regularExpressions= since 3 16 $ RegularExpressionsClientCapabilities " " Nothing
314311 , _markdown= since 3 16 $ MarkdownClientCapabilities " " Nothing (Just [] )
315- -- TODO
316- , _positionEncodings= Nothing
312+ , _positionEncodings= since 3 17 [PositionEncodingKind_UTF16 ]
317313 }
318314
319315 allMarkups = [MarkupKind_PlainText , MarkupKind_Markdown ]
316+
317+ -- | Whether the client supports dynamic registration for the given method.
318+ dynamicRegistrationSupported :: SMethod m -> ClientCapabilities -> Bool
319+ dynamicRegistrationSupported method caps = fromMaybe False $ case method of
320+ SMethod_WorkspaceDidChangeConfiguration -> caps ^? ws . L. didChangeConfiguration . _Just . dyn
321+ SMethod_WorkspaceDidChangeWatchedFiles -> caps ^? ws . L. didChangeWatchedFiles . _Just . dyn
322+ SMethod_WorkspaceSymbol -> caps ^? ws . L. symbol . _Just . dyn
323+ SMethod_WorkspaceExecuteCommand -> caps ^? ws . L. executeCommand . _Just . dyn
324+ SMethod_WorkspaceWillCreateFiles -> caps ^? ws . L. fileOperations . _Just . dyn
325+ SMethod_WorkspaceDidCreateFiles -> caps ^? ws . L. fileOperations . _Just . dyn
326+ SMethod_WorkspaceWillDeleteFiles -> caps ^? ws . L. fileOperations . _Just . dyn
327+ SMethod_WorkspaceDidDeleteFiles -> caps ^? ws . L. fileOperations . _Just . dyn
328+ SMethod_TextDocumentDidOpen -> caps ^? td . L. synchronization . _Just . dyn
329+ SMethod_TextDocumentDidChange -> caps ^? td . L. synchronization . _Just . dyn
330+ SMethod_TextDocumentDidClose -> caps ^? td . L. synchronization . _Just . dyn
331+ SMethod_TextDocumentCompletion -> caps ^? td . L. completion . _Just . dyn
332+ SMethod_TextDocumentHover -> caps ^? td . L. hover . _Just . dyn
333+ SMethod_TextDocumentSignatureHelp -> caps ^? td . L. signatureHelp . _Just . dyn
334+ SMethod_TextDocumentDeclaration -> caps ^? td . L. declaration . _Just . dyn
335+ SMethod_TextDocumentDefinition -> caps ^? td . L. definition . _Just . dyn
336+ SMethod_TextDocumentTypeDefinition -> caps ^? td . L. typeDefinition . _Just . dyn
337+ SMethod_TextDocumentImplementation -> caps ^? td . L. implementation . _Just . dyn
338+ SMethod_TextDocumentReferences -> caps ^? td . L. references . _Just . dyn
339+ SMethod_TextDocumentDocumentHighlight -> caps ^? td . L. documentHighlight . _Just . dyn
340+ SMethod_TextDocumentDocumentSymbol -> caps ^? td . L. documentSymbol . _Just . dyn
341+ SMethod_TextDocumentCodeAction -> caps ^? td . L. codeAction . _Just . dyn
342+ SMethod_TextDocumentCodeLens -> caps ^? td . L. codeLens . _Just . dyn
343+ SMethod_TextDocumentDocumentLink -> caps ^? td . L. documentLink . _Just . dyn
344+ SMethod_TextDocumentDocumentColor -> caps ^? td . L. colorProvider . _Just . dyn
345+ SMethod_TextDocumentColorPresentation -> caps ^? td . L. colorProvider . _Just . dyn
346+ SMethod_TextDocumentFormatting -> caps ^? td . L. formatting . _Just . dyn
347+ SMethod_TextDocumentRangeFormatting -> caps ^? td . L. rangeFormatting . _Just . dyn
348+ SMethod_TextDocumentOnTypeFormatting -> caps ^? td . L. onTypeFormatting . _Just . dyn
349+ SMethod_TextDocumentRename -> caps ^? td . L. rename . _Just . dyn
350+ SMethod_TextDocumentFoldingRange -> caps ^? td . L. foldingRange . _Just . dyn
351+ SMethod_TextDocumentSelectionRange -> caps ^? td . L. selectionRange . _Just . dyn
352+ SMethod_TextDocumentLinkedEditingRange -> caps ^? td . L. linkedEditingRange . _Just . dyn
353+ SMethod_TextDocumentPrepareCallHierarchy -> caps ^? td . L. callHierarchy . _Just . dyn
354+ SMethod_TextDocumentInlayHint -> caps ^? td . L. inlayHint . _Just . dyn
355+ SMethod_TextDocumentInlineValue -> caps ^? td . L. inlineValue . _Just . dyn
356+ SMethod_TextDocumentMoniker -> caps ^? td . L. moniker . _Just . dyn
357+ SMethod_TextDocumentPrepareTypeHierarchy -> caps ^? td . L. typeHierarchy . _Just . dyn
358+ SMethod_TextDocumentDiagnostic -> caps ^? td . L. diagnostic . _Just . dyn
359+ -- semantic tokens is messed up due to it having you register with an otherwise non-existent method
360+ -- SMethod_TextDocumentSemanticTokens -> capDyn $ clientCaps ^? L.textDocument . _Just . L.semanticTokens . _Just
361+ -- Notebook document methods alway support dynamic registration, it seems?
362+ _ -> Just False
363+ where
364+ td :: Traversal' ClientCapabilities TextDocumentClientCapabilities
365+ td = L. textDocument . _Just
366+
367+ ws :: Traversal' ClientCapabilities WorkspaceClientCapabilities
368+ ws = L. workspace . _Just
369+
370+ dyn :: L. HasDynamicRegistration a (Maybe Bool ) => Traversal' a Bool
371+ dyn = L. dynamicRegistration . _Just
0 commit comments