1
1
{-# LANGUAGE DuplicateRecordFields #-}
2
2
{-# LANGUAGE OverloadedLabels #-}
3
3
{-# LANGUAGE OverloadedStrings #-}
4
+ {-# LANGUAGE FlexibleContexts #-}
5
+ {-# LANGUAGE RankNTypes #-}
4
6
module Language.LSP.Protocol.Capabilities
5
7
(
6
8
fullCaps
7
9
, LSPVersion (.. )
8
10
, capsForVersion
11
+ , dynamicRegistrationSupported
9
12
) where
10
13
14
+ import Control.Lens
11
15
import Data.Row
12
16
import qualified Data.Set as Set
17
+ import Data.Maybe
13
18
import Language.LSP.Protocol.Types
19
+ import Language.LSP.Protocol.Message
20
+ import qualified Language.LSP.Protocol.Lens as L
14
21
import Prelude hiding (min )
15
22
16
23
{-
17
24
TODO: this is out-of-date/needs an audit
18
25
TODO: can we generate this? process the 'since' annotations in the metamodel?
19
26
-}
20
27
21
- -- | Capabilities for full conformance to the current (v3.15) LSP specification.
28
+ -- | Capabilities for full conformance to the current LSP specification.
22
29
fullCaps :: ClientCapabilities
23
30
fullCaps = capsForVersion (LSPVersion maxBound maxBound )
24
31
25
32
-- | A specific version of the LSP specification.
26
- data LSPVersion = LSPVersion Int Int -- ^ Construct a major.minor version
33
+ data LSPVersion = LSPVersion Int Int
27
34
28
35
-- | 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
40
36
capsForVersion :: LSPVersion -> ClientCapabilities
41
37
capsForVersion (LSPVersion maj min ) = caps
42
38
where
@@ -45,9 +41,8 @@ capsForVersion (LSPVersion maj min) = caps
45
41
, _textDocument= Just td
46
42
, _window= Just window
47
43
, _general= since 3 16 general
44
+ , _notebookDocument= since 3 17 $ NotebookDocumentClientCapabilities $ NotebookDocumentSyncClientCapabilities dynamicReg (Just True )
48
45
, _experimental= Nothing
49
- -- TODO
50
- , _notebookDocument= Nothing
51
46
}
52
47
w = WorkspaceClientCapabilities {
53
48
_applyEdit = Just True
@@ -61,15 +56,14 @@ capsForVersion (LSPVersion maj min) = caps
61
56
, _didChangeWatchedFiles = Just (DidChangeWatchedFilesClientCapabilities dynamicReg (Just True ))
62
57
, _symbol = Just symbolCapabilities
63
58
, _executeCommand = Just (ExecuteCommandClientCapabilities dynamicReg)
59
+ , _codeLens = Just (CodeLensWorkspaceClientCapabilities $ Just True )
64
60
, _workspaceFolders = since 3 6 True
65
61
, _configuration = since 3 6 True
66
62
, _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 )
73
67
}
74
68
75
69
resourceOperations =
@@ -78,6 +72,15 @@ capsForVersion (LSPVersion maj min) = caps
78
72
, ResourceOperationKind_Rename
79
73
]
80
74
75
+ fileOperations = FileOperationClientCapabilities
76
+ dynamicReg
77
+ (Just True )
78
+ (Just True )
79
+ (Just True )
80
+ (Just True )
81
+ (Just True )
82
+ (Just True )
83
+
81
84
symbolCapabilities = WorkspaceSymbolClientCapabilities
82
85
dynamicReg
83
86
(since 3 4 (# valueSet .== Just sKs))
@@ -158,13 +161,12 @@ capsForVersion (LSPVersion maj min) = caps
158
161
, _selectionRange= since 3 5 (SelectionRangeClientCapabilities dynamicReg)
159
162
, _callHierarchy= since 3 16 (CallHierarchyClientCapabilities dynamicReg)
160
163
, _semanticTokens= since 3 16 semanticTokensCapabilities
164
+ , _linkedEditingRange= since 3 16 (LinkedEditingRangeClientCapabilities dynamicReg)
165
+ , _moniker= since 3 16 (MonikerClientCapabilities dynamicReg)
161
166
, _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 ))
168
170
}
169
171
170
172
sync =
@@ -184,16 +186,11 @@ capsForVersion (LSPVersion maj min) = caps
184
186
, _contextSupport= since 3 3 True
185
187
, _completionList= since 3 17 (# itemDefaults .== Just [] )
186
188
}
187
-
188
- inlayHint =
189
- InlayHintWorkspaceClientCapabilities {
190
- _refreshSupport= since 3 17 True
191
- }
192
-
189
+
193
190
inlayHintCapabilities =
194
191
InlayHintClientCapabilities {
195
192
_dynamicRegistration= dynamicReg,
196
- _resolveSupport= since 3 17 (# properties .== [] )
193
+ _resolveSupport= Just (# properties .== [] )
197
194
}
198
195
199
196
completionItemCapabilities =
@@ -312,8 +309,63 @@ capsForVersion (LSPVersion maj min) = caps
312
309
_staleRequestSupport= since 3 16 (# cancel .== True .+ # retryOnContentModified .== [] )
313
310
, _regularExpressions= since 3 16 $ RegularExpressionsClientCapabilities " " Nothing
314
311
, _markdown= since 3 16 $ MarkdownClientCapabilities " " Nothing (Just [] )
315
- -- TODO
316
- , _positionEncodings= Nothing
312
+ , _positionEncodings= since 3 17 [PositionEncodingKind_UTF16 ]
317
313
}
318
314
319
315
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