{-# 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 :: ClientCapabilities
fullCaps = LSPVersion -> ClientCapabilities
capsForVersion (Int -> Int -> LSPVersion
LSPVersion forall a. Bounded a => a
maxBound forall a. Bounded a => a
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 -> ClientCapabilities
capsForVersion (LSPVersion Int
maj Int
min) = ClientCapabilities
caps
  where
    caps :: ClientCapabilities
caps = ClientCapabilities {
      $sel:_workspace:ClientCapabilities :: Maybe WorkspaceClientCapabilities
_workspace=forall a. a -> Maybe a
Just WorkspaceClientCapabilities
w
      , $sel:_textDocument:ClientCapabilities :: Maybe TextDocumentClientCapabilities
_textDocument=forall a. a -> Maybe a
Just TextDocumentClientCapabilities
td
      , $sel:_window:ClientCapabilities :: Maybe WindowClientCapabilities
_window=forall a. a -> Maybe a
Just WindowClientCapabilities
window
      , $sel:_general:ClientCapabilities :: Maybe GeneralClientCapabilities
_general=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 GeneralClientCapabilities
general
      , $sel:_experimental:ClientCapabilities :: Maybe Value
_experimental=forall a. Maybe a
Nothing
      -- TODO
      , $sel:_notebookDocument:ClientCapabilities :: Maybe NotebookDocumentClientCapabilities
_notebookDocument=forall a. Maybe a
Nothing
      }
    w :: WorkspaceClientCapabilities
w = WorkspaceClientCapabilities {
      $sel:_applyEdit:WorkspaceClientCapabilities :: Maybe Bool
_applyEdit = forall a. a -> Maybe a
Just Bool
True
      , $sel:_workspaceEdit:WorkspaceClientCapabilities :: Maybe WorkspaceEditClientCapabilities
_workspaceEdit = forall a. a -> Maybe a
Just (Maybe Bool
-> Maybe [ResourceOperationKind]
-> Maybe FailureHandlingKind
-> Maybe Bool
-> Maybe (Rec (("groupsOnLabel" .== Maybe Bool) .+ 'R '[]))
-> WorkspaceEditClientCapabilities
WorkspaceEditClientCapabilities
                  (forall a. a -> Maybe a
Just Bool
True)
                  (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
13 [ResourceOperationKind]
resourceOperations)
                  forall a. Maybe a
Nothing
                  (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 Bool
True)
                  (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 (forall a. IsLabel "groupsOnLabel" a => a
#groupsOnLabel forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just Bool
True)))
      , $sel:_didChangeConfiguration:WorkspaceClientCapabilities :: Maybe DidChangeConfigurationClientCapabilities
_didChangeConfiguration = forall a. a -> Maybe a
Just (Maybe Bool -> DidChangeConfigurationClientCapabilities
DidChangeConfigurationClientCapabilities Maybe Bool
dynamicReg)
      , $sel:_didChangeWatchedFiles:WorkspaceClientCapabilities :: Maybe DidChangeWatchedFilesClientCapabilities
_didChangeWatchedFiles = forall a. a -> Maybe a
Just (Maybe Bool -> Maybe Bool -> DidChangeWatchedFilesClientCapabilities
DidChangeWatchedFilesClientCapabilities Maybe Bool
dynamicReg (forall a. a -> Maybe a
Just Bool
True))
      , $sel:_symbol:WorkspaceClientCapabilities :: Maybe WorkspaceSymbolClientCapabilities
_symbol = forall a. a -> Maybe a
Just WorkspaceSymbolClientCapabilities
symbolCapabilities
      , $sel:_executeCommand:WorkspaceClientCapabilities :: Maybe ExecuteCommandClientCapabilities
_executeCommand = forall a. a -> Maybe a
Just (Maybe Bool -> ExecuteCommandClientCapabilities
ExecuteCommandClientCapabilities Maybe Bool
dynamicReg)
      , $sel:_workspaceFolders:WorkspaceClientCapabilities :: Maybe Bool
_workspaceFolders = forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
6 Bool
True
      , $sel:_configuration:WorkspaceClientCapabilities :: Maybe Bool
_configuration = forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
6 Bool
True
      , $sel:_semanticTokens:WorkspaceClientCapabilities :: Maybe SemanticTokensWorkspaceClientCapabilities
_semanticTokens = forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 (Maybe Bool -> SemanticTokensWorkspaceClientCapabilities
SemanticTokensWorkspaceClientCapabilities forall a b. (a -> b) -> a -> b
$ forall a. a -> Maybe a
Just Bool
True)
      -- TODO
      , $sel:_codeLens:WorkspaceClientCapabilities :: Maybe CodeLensWorkspaceClientCapabilities
_codeLens = forall a. Maybe a
Nothing
      , $sel:_fileOperations:WorkspaceClientCapabilities :: Maybe FileOperationClientCapabilities
_fileOperations = forall a. Maybe a
Nothing
      , $sel:_inlineValue:WorkspaceClientCapabilities :: Maybe InlineValueWorkspaceClientCapabilities
_inlineValue = forall a. Maybe a
Nothing
      , $sel:_inlayHint:WorkspaceClientCapabilities :: Maybe InlayHintWorkspaceClientCapabilities
_inlayHint = forall a. Maybe a
Nothing
      , $sel:_diagnostics:WorkspaceClientCapabilities :: Maybe DiagnosticWorkspaceClientCapabilities
_diagnostics = forall a. Maybe a
Nothing
      }

    resourceOperations :: [ResourceOperationKind]
resourceOperations =
      [ ResourceOperationKind
ResourceOperationKind_Create
      , ResourceOperationKind
ResourceOperationKind_Delete
      , ResourceOperationKind
ResourceOperationKind_Rename
      ]

    symbolCapabilities :: WorkspaceSymbolClientCapabilities
symbolCapabilities = Maybe Bool
-> Maybe (Rec (("valueSet" .== Maybe [SymbolKind]) .+ 'R '[]))
-> Maybe (Rec (("valueSet" .== [SymbolTag]) .+ 'R '[]))
-> Maybe (Rec (("properties" .== [Text]) .+ 'R '[]))
-> WorkspaceSymbolClientCapabilities
WorkspaceSymbolClientCapabilities
      Maybe Bool
dynamicReg
      (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
4 (forall a. IsLabel "valueSet" a => a
#valueSet forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just [SymbolKind]
sKs))
      (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 (forall a. IsLabel "valueSet" a => a
#valueSet forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== [SymbolTag
SymbolTag_Deprecated]))
      (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
17 (forall a. IsLabel "properties" a => a
#properties forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== []))

    sKs :: [SymbolKind]
sKs
      | Int
maj forall a. Ord a => a -> a -> Bool
>= Int
3 Bool -> Bool -> Bool
&& Int
min forall a. Ord a => a -> a -> Bool
>= Int
4 = [SymbolKind]
oldSKs forall a. [a] -> [a] -> [a]
++ [SymbolKind]
newSKs
      | Bool
otherwise            = [SymbolKind]
oldSKs

    oldSKs :: [SymbolKind]
oldSKs =   [ SymbolKind
SymbolKind_File
               , SymbolKind
SymbolKind_Module
               , SymbolKind
SymbolKind_Namespace
               , SymbolKind
SymbolKind_Package
               , SymbolKind
SymbolKind_Class
               , SymbolKind
SymbolKind_Method
               , SymbolKind
SymbolKind_Property
               , SymbolKind
SymbolKind_Field
               , SymbolKind
SymbolKind_Constructor
               , SymbolKind
SymbolKind_Enum
               , SymbolKind
SymbolKind_Interface
               , SymbolKind
SymbolKind_Function
               , SymbolKind
SymbolKind_Variable
               , SymbolKind
SymbolKind_Constant
               , SymbolKind
SymbolKind_String
               , SymbolKind
SymbolKind_Number
               , SymbolKind
SymbolKind_Boolean
               , SymbolKind
SymbolKind_Array
               ]

    newSKs :: [SymbolKind]
newSKs = [ SymbolKind
SymbolKind_Object
             , SymbolKind
SymbolKind_Key
             , SymbolKind
SymbolKind_Null
             , SymbolKind
SymbolKind_EnumMember
             , SymbolKind
SymbolKind_Struct
             , SymbolKind
SymbolKind_Event
             , SymbolKind
SymbolKind_Operator
             , SymbolKind
SymbolKind_TypeParameter
             ]

    -- Only one token format for now, just list it here
    tfs :: [TokenFormat]
tfs = [ TokenFormat
TokenFormat_Relative ]

    semanticTokensCapabilities :: SemanticTokensClientCapabilities
semanticTokensCapabilities = SemanticTokensClientCapabilities {
        $sel:_dynamicRegistration:SemanticTokensClientCapabilities :: Maybe Bool
_dynamicRegistration=forall a. a -> Maybe a
Just Bool
True
        , $sel:_requests:SemanticTokensClientCapabilities :: Rec
  (Extend "range" (Maybe (Bool |? Rec ('R '[]))) ('R '[])
   .+ (("full"
        .== Maybe (Bool |? Rec (("delta" .== Maybe Bool) .+ 'R '[])))
       .+ 'R '[]))
_requests= forall a. IsLabel "range" a => a
#range forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just (forall a b. a -> a |? b
InL Bool
True) forall (l :: Row (*)) (r :: Row (*)).
FreeForall l =>
Rec l -> Rec r -> Rec (l .+ r)
.+ forall a. IsLabel "full" a => a
#full forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just (forall a b. b -> a |? b
InR (forall a. IsLabel "delta" a => a
#delta forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just Bool
True))
        , $sel:_tokenTypes:SemanticTokensClientCapabilities :: [Text]
_tokenTypes=forall a. LspEnum a => a -> EnumBaseType a
toEnumBaseType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Set a -> [a]
Set.toList (forall a. LspEnum a => Set a
knownValues @SemanticTokenTypes)
        , $sel:_tokenModifiers:SemanticTokensClientCapabilities :: [Text]
_tokenModifiers=forall a. LspEnum a => a -> EnumBaseType a
toEnumBaseType forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall a. Set a -> [a]
Set.toList (forall a. LspEnum a => Set a
knownValues @SemanticTokenModifiers)
        , $sel:_formats:SemanticTokensClientCapabilities :: [TokenFormat]
_formats=[TokenFormat]
tfs
        , $sel:_overlappingTokenSupport:SemanticTokensClientCapabilities :: Maybe Bool
_overlappingTokenSupport=forall a. a -> Maybe a
Just Bool
True
        , $sel:_multilineTokenSupport:SemanticTokensClientCapabilities :: Maybe Bool
_multilineTokenSupport=forall a. a -> Maybe a
Just Bool
True
        , $sel:_serverCancelSupport:SemanticTokensClientCapabilities :: Maybe Bool
_serverCancelSupport=forall a. a -> Maybe a
Just Bool
True
        , $sel:_augmentsSyntaxTokens:SemanticTokensClientCapabilities :: Maybe Bool
_augmentsSyntaxTokens=forall a. a -> Maybe a
Just Bool
True
      }

    td :: TextDocumentClientCapabilities
td = TextDocumentClientCapabilities {
          $sel:_synchronization:TextDocumentClientCapabilities :: Maybe TextDocumentSyncClientCapabilities
_synchronization=forall a. a -> Maybe a
Just TextDocumentSyncClientCapabilities
sync
          , $sel:_completion:TextDocumentClientCapabilities :: Maybe CompletionClientCapabilities
_completion=forall a. a -> Maybe a
Just CompletionClientCapabilities
completionCapability
          , $sel:_hover:TextDocumentClientCapabilities :: Maybe HoverClientCapabilities
_hover=forall a. a -> Maybe a
Just HoverClientCapabilities
hoverCapability
          , $sel:_signatureHelp:TextDocumentClientCapabilities :: Maybe SignatureHelpClientCapabilities
_signatureHelp=forall a. a -> Maybe a
Just SignatureHelpClientCapabilities
signatureHelpCapability
          , $sel:_references:TextDocumentClientCapabilities :: Maybe ReferenceClientCapabilities
_references=forall a. a -> Maybe a
Just (Maybe Bool -> ReferenceClientCapabilities
ReferenceClientCapabilities Maybe Bool
dynamicReg)
          , $sel:_documentHighlight:TextDocumentClientCapabilities :: Maybe DocumentHighlightClientCapabilities
_documentHighlight=forall a. a -> Maybe a
Just (Maybe Bool -> DocumentHighlightClientCapabilities
DocumentHighlightClientCapabilities Maybe Bool
dynamicReg)
          , $sel:_documentSymbol:TextDocumentClientCapabilities :: Maybe DocumentSymbolClientCapabilities
_documentSymbol=forall a. a -> Maybe a
Just DocumentSymbolClientCapabilities
documentSymbolCapability
          , $sel:_formatting:TextDocumentClientCapabilities :: Maybe DocumentFormattingClientCapabilities
_formatting=forall a. a -> Maybe a
Just (Maybe Bool -> DocumentFormattingClientCapabilities
DocumentFormattingClientCapabilities Maybe Bool
dynamicReg)
          , $sel:_rangeFormatting:TextDocumentClientCapabilities :: Maybe DocumentRangeFormattingClientCapabilities
_rangeFormatting=forall a. a -> Maybe a
Just (Maybe Bool -> DocumentRangeFormattingClientCapabilities
DocumentRangeFormattingClientCapabilities Maybe Bool
dynamicReg)
          , $sel:_onTypeFormatting:TextDocumentClientCapabilities :: Maybe DocumentOnTypeFormattingClientCapabilities
_onTypeFormatting=forall a. a -> Maybe a
Just (Maybe Bool -> DocumentOnTypeFormattingClientCapabilities
DocumentOnTypeFormattingClientCapabilities Maybe Bool
dynamicReg)
          , $sel:_declaration:TextDocumentClientCapabilities :: Maybe DeclarationClientCapabilities
_declaration=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
14 (Maybe Bool -> Maybe Bool -> DeclarationClientCapabilities
DeclarationClientCapabilities Maybe Bool
dynamicReg (forall a. a -> Maybe a
Just Bool
True))
          , $sel:_definition:TextDocumentClientCapabilities :: Maybe DefinitionClientCapabilities
_definition=forall a. a -> Maybe a
Just (Maybe Bool -> Maybe Bool -> DefinitionClientCapabilities
DefinitionClientCapabilities Maybe Bool
dynamicReg (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
14 Bool
True))
          , $sel:_typeDefinition:TextDocumentClientCapabilities :: Maybe TypeDefinitionClientCapabilities
_typeDefinition=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
6 (Maybe Bool -> Maybe Bool -> TypeDefinitionClientCapabilities
TypeDefinitionClientCapabilities Maybe Bool
dynamicReg (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
14 Bool
True))
          , $sel:_implementation:TextDocumentClientCapabilities :: Maybe ImplementationClientCapabilities
_implementation=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
6 (Maybe Bool -> Maybe Bool -> ImplementationClientCapabilities
ImplementationClientCapabilities Maybe Bool
dynamicReg (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
14 Bool
True))
          , $sel:_codeAction:TextDocumentClientCapabilities :: Maybe CodeActionClientCapabilities
_codeAction=forall a. a -> Maybe a
Just CodeActionClientCapabilities
codeActionCapability
          , $sel:_codeLens:TextDocumentClientCapabilities :: Maybe CodeLensClientCapabilities
_codeLens=forall a. a -> Maybe a
Just (Maybe Bool -> CodeLensClientCapabilities
CodeLensClientCapabilities Maybe Bool
dynamicReg)
          , $sel:_documentLink:TextDocumentClientCapabilities :: Maybe DocumentLinkClientCapabilities
_documentLink=forall a. a -> Maybe a
Just (Maybe Bool -> Maybe Bool -> DocumentLinkClientCapabilities
DocumentLinkClientCapabilities Maybe Bool
dynamicReg (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
15 Bool
True))
          , $sel:_colorProvider:TextDocumentClientCapabilities :: Maybe DocumentColorClientCapabilities
_colorProvider=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
6 (Maybe Bool -> DocumentColorClientCapabilities
DocumentColorClientCapabilities Maybe Bool
dynamicReg)
          , $sel:_rename:TextDocumentClientCapabilities :: Maybe RenameClientCapabilities
_rename=forall a. a -> Maybe a
Just (Maybe Bool
-> Maybe Bool
-> Maybe PrepareSupportDefaultBehavior
-> Maybe Bool
-> RenameClientCapabilities
RenameClientCapabilities Maybe Bool
dynamicReg (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
12 Bool
True) (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 PrepareSupportDefaultBehavior
PrepareSupportDefaultBehavior_Identifier) (forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 Bool
True))
          , $sel:_publishDiagnostics:TextDocumentClientCapabilities :: Maybe PublishDiagnosticsClientCapabilities
_publishDiagnostics=forall a. a -> Maybe a
Just PublishDiagnosticsClientCapabilities
publishDiagnosticsCapabilities
          , $sel:_foldingRange:TextDocumentClientCapabilities :: Maybe FoldingRangeClientCapabilities
_foldingRange=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
10 FoldingRangeClientCapabilities
foldingRangeCapability
          , $sel:_selectionRange:TextDocumentClientCapabilities :: Maybe SelectionRangeClientCapabilities
_selectionRange=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
5 (Maybe Bool -> SelectionRangeClientCapabilities
SelectionRangeClientCapabilities Maybe Bool
dynamicReg)
          , $sel:_callHierarchy:TextDocumentClientCapabilities :: Maybe CallHierarchyClientCapabilities
_callHierarchy=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 (Maybe Bool -> CallHierarchyClientCapabilities
CallHierarchyClientCapabilities Maybe Bool
dynamicReg)
          , $sel:_semanticTokens:TextDocumentClientCapabilities :: Maybe SemanticTokensClientCapabilities
_semanticTokens=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 SemanticTokensClientCapabilities
semanticTokensCapabilities
          -- TODO
          , $sel:_linkedEditingRange:TextDocumentClientCapabilities :: Maybe LinkedEditingRangeClientCapabilities
_linkedEditingRange=forall a. Maybe a
Nothing
          , $sel:_moniker:TextDocumentClientCapabilities :: Maybe MonikerClientCapabilities
_moniker=forall a. Maybe a
Nothing
          , $sel:_typeHierarchy:TextDocumentClientCapabilities :: Maybe TypeHierarchyClientCapabilities
_typeHierarchy=forall a. Maybe a
Nothing
          , $sel:_inlineValue:TextDocumentClientCapabilities :: Maybe InlineValueClientCapabilities
_inlineValue=forall a. Maybe a
Nothing
          , $sel:_inlayHint:TextDocumentClientCapabilities :: Maybe InlayHintClientCapabilities
_inlayHint=forall a. Maybe a
Nothing
          , $sel:_diagnostic:TextDocumentClientCapabilities :: Maybe DiagnosticClientCapabilities
_diagnostic=forall a. Maybe a
Nothing
        }

    sync :: TextDocumentSyncClientCapabilities
sync =
      TextDocumentSyncClientCapabilities {
        $sel:_dynamicRegistration:TextDocumentSyncClientCapabilities :: Maybe Bool
_dynamicRegistration=Maybe Bool
dynamicReg
        , $sel:_willSave:TextDocumentSyncClientCapabilities :: Maybe Bool
_willSave=forall a. a -> Maybe a
Just Bool
True
        , $sel:_willSaveWaitUntil:TextDocumentSyncClientCapabilities :: Maybe Bool
_willSaveWaitUntil=forall a. a -> Maybe a
Just Bool
True
        , $sel:_didSave:TextDocumentSyncClientCapabilities :: Maybe Bool
_didSave=forall a. a -> Maybe a
Just Bool
True
        }

    completionCapability :: CompletionClientCapabilities
completionCapability =
      CompletionClientCapabilities{
        $sel:_dynamicRegistration:CompletionClientCapabilities :: Maybe Bool
_dynamicRegistration=Maybe Bool
dynamicReg
        , $sel:_completionItem:CompletionClientCapabilities :: Maybe
  (Rec
     (("snippetSupport" .== Maybe Bool)
      .+ (("commitCharactersSupport" .== Maybe Bool)
          .+ (Extend "documentationFormat" (Maybe [MarkupKind]) ('R '[])
              .+ (("deprecatedSupport" .== Maybe Bool)
                  .+ (("preselectSupport" .== Maybe Bool)
                      .+ (("tagSupport"
                           .== Maybe (Rec (("valueSet" .== [CompletionItemTag]) .+ 'R '[])))
                          .+ (("insertReplaceSupport" .== Maybe Bool)
                              .+ (("resolveSupport"
                                   .== Maybe (Rec (("properties" .== [Text]) .+ 'R '[])))
                                  .+ (("insertTextModeSupport"
                                       .== Maybe
                                             (Rec (("valueSet" .== [InsertTextMode]) .+ 'R '[])))
                                      .+ (("labelDetailsSupport" .== Maybe Bool)
                                          .+ 'R '[])))))))))))
_completionItem=forall a. a -> Maybe a
Just forall {a} {a}.
Rec
  ('R
     '[ "commitCharactersSupport" ':-> Maybe Bool,
        "deprecatedSupport" ':-> Maybe Bool,
        "documentationFormat" ':-> Maybe [MarkupKind],
        "insertReplaceSupport" ':-> Maybe Bool,
        "insertTextModeSupport"
        ':-> Maybe (Rec ('R '[ "valueSet" ':-> [a]])),
        "labelDetailsSupport" ':-> Maybe Bool,
        "preselectSupport" ':-> Maybe Bool,
        "resolveSupport"
        ':-> Maybe (Rec ('R '[ "properties" ':-> [Text]])),
        "snippetSupport" ':-> Maybe Bool,
        "tagSupport" ':-> Maybe (Rec ('R '[ "valueSet" ':-> [a]]))])
completionItemCapabilities
        , $sel:_completionItemKind:CompletionClientCapabilities :: Maybe (Rec (("valueSet" .== Maybe [CompletionItemKind]) .+ 'R '[]))
_completionItemKind=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
4 (forall a. IsLabel "valueSet" a => a
#valueSet forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just [CompletionItemKind]
ciKs)
        , $sel:_insertTextMode:CompletionClientCapabilities :: Maybe InsertTextMode
_insertTextMode=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
17 InsertTextMode
InsertTextMode_AsIs
        , $sel:_contextSupport:CompletionClientCapabilities :: Maybe Bool
_contextSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
3 Bool
True
        , $sel:_completionList:CompletionClientCapabilities :: Maybe (Rec (("itemDefaults" .== Maybe [Text]) .+ 'R '[]))
_completionList=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
17 (forall a. IsLabel "itemDefaults" a => a
#itemDefaults forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just [])
        }

    completionItemCapabilities :: Rec
  ((((((((('R '[ "snippetSupport" ':-> Maybe Bool]
           .+ 'R '[ "commitCharactersSupport" ':-> Maybe Bool])
          .+ 'R '[ "documentationFormat" ':-> Maybe [MarkupKind]])
         .+ 'R '[ "deprecatedSupport" ':-> Maybe Bool])
        .+ 'R '[ "preselectSupport" ':-> Maybe Bool])
       .+ 'R
            '[ "tagSupport" ':-> Maybe (Rec ('R '[ "valueSet" ':-> [a]]))])
      .+ 'R '[ "insertReplaceSupport" ':-> Maybe Bool])
     .+ 'R
          '[ "resolveSupport"
             ':-> Maybe (Rec ('R '[ "properties" ':-> [Text]]))])
    .+ 'R
         '[ "insertTextModeSupport"
            ':-> Maybe (Rec ('R '[ "valueSet" ':-> [a]]))])
   .+ 'R '[ "labelDetailsSupport" ':-> Maybe Bool])
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 :: [CompletionItemKind]
ciKs
      | Int
maj forall a. Ord a => a -> a -> Bool
>= Int
3 Bool -> Bool -> Bool
&& Int
min forall a. Ord a => a -> a -> Bool
>= Int
4 = [CompletionItemKind]
oldCiKs forall a. [a] -> [a] -> [a]
++ [CompletionItemKind]
newCiKs
      | Bool
otherwise            = [CompletionItemKind]
oldCiKs

    oldCiKs :: [CompletionItemKind]
oldCiKs =   [ CompletionItemKind
CompletionItemKind_Text
                , CompletionItemKind
CompletionItemKind_Method
                , CompletionItemKind
CompletionItemKind_Function
                , CompletionItemKind
CompletionItemKind_Constructor
                , CompletionItemKind
CompletionItemKind_Field
                , CompletionItemKind
CompletionItemKind_Variable
                , CompletionItemKind
CompletionItemKind_Class
                , CompletionItemKind
CompletionItemKind_Interface
                , CompletionItemKind
CompletionItemKind_Module
                , CompletionItemKind
CompletionItemKind_Property
                , CompletionItemKind
CompletionItemKind_Unit
                , CompletionItemKind
CompletionItemKind_Value
                , CompletionItemKind
CompletionItemKind_Enum
                , CompletionItemKind
CompletionItemKind_Keyword
                , CompletionItemKind
CompletionItemKind_Snippet
                , CompletionItemKind
CompletionItemKind_Color
                , CompletionItemKind
CompletionItemKind_File
                , CompletionItemKind
CompletionItemKind_Reference
                ]

    newCiKs :: [CompletionItemKind]
newCiKs =   [ CompletionItemKind
CompletionItemKind_Folder
                , CompletionItemKind
CompletionItemKind_EnumMember
                , CompletionItemKind
CompletionItemKind_Constant
                , CompletionItemKind
CompletionItemKind_Struct
                , CompletionItemKind
CompletionItemKind_Event
                , CompletionItemKind
CompletionItemKind_Operator
                , CompletionItemKind
CompletionItemKind_TypeParameter
                ]

    hoverCapability :: HoverClientCapabilities
hoverCapability =
      HoverClientCapabilities {
        $sel:_dynamicRegistration:HoverClientCapabilities :: Maybe Bool
_dynamicRegistration=Maybe Bool
dynamicReg
        , $sel:_contentFormat:HoverClientCapabilities :: Maybe [MarkupKind]
_contentFormat=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
3 [MarkupKind]
allMarkups
      }

    codeActionCapability :: CodeActionClientCapabilities
codeActionCapability
      = CodeActionClientCapabilities {
          $sel:_dynamicRegistration:CodeActionClientCapabilities :: Maybe Bool
_dynamicRegistration=Maybe Bool
dynamicReg
          , $sel:_codeActionLiteralSupport:CodeActionClientCapabilities :: Maybe
  (Rec
     (("codeActionKind"
       .== Rec (("valueSet" .== [CodeActionKind]) .+ 'R '[]))
      .+ 'R '[]))
_codeActionLiteralSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
8 (forall a. IsLabel "codeActionKind" a => a
#codeActionKind forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== (forall a. IsLabel "valueSet" a => a
#valueSet forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. Set a -> [a]
Set.toList forall a. LspEnum a => Set a
knownValues))
          , $sel:_isPreferredSupport:CodeActionClientCapabilities :: Maybe Bool
_isPreferredSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
15 Bool
True
          , $sel:_disabledSupport:CodeActionClientCapabilities :: Maybe Bool
_disabledSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 Bool
True
          , $sel:_dataSupport:CodeActionClientCapabilities :: Maybe Bool
_dataSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 Bool
True
          , $sel:_resolveSupport:CodeActionClientCapabilities :: Maybe (Rec (("properties" .== [Text]) .+ 'R '[]))
_resolveSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 (forall a. IsLabel "properties" a => a
#properties forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== [])
          , $sel:_honorsChangeAnnotations:CodeActionClientCapabilities :: Maybe Bool
_honorsChangeAnnotations=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 Bool
True
        }

    signatureHelpCapability :: SignatureHelpClientCapabilities
signatureHelpCapability =
      SignatureHelpClientCapabilities {
        $sel:_dynamicRegistration:SignatureHelpClientCapabilities :: Maybe Bool
_dynamicRegistration=Maybe Bool
dynamicReg
        , $sel:_signatureInformation:SignatureHelpClientCapabilities :: Maybe
  (Rec
     (Extend "documentationFormat" (Maybe [MarkupKind]) ('R '[])
      .+ (("parameterInformation"
           .== Maybe (Rec (("labelOffsetSupport" .== Maybe Bool) .+ 'R '[])))
          .+ (("activeParameterSupport" .== Maybe Bool) .+ 'R '[]))))
_signatureInformation=forall a. a -> Maybe a
Just (forall a. IsLabel "documentationFormat" a => a
#documentationFormat forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just [MarkupKind]
allMarkups forall (l :: Row (*)) (r :: Row (*)).
FreeForall l =>
Rec l -> Rec r -> Rec (l .+ r)
.+ forall a. IsLabel "parameterInformation" a => a
#parameterInformation forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just (forall a. IsLabel "labelOffsetSupport" a => a
#labelOffsetSupport forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just Bool
True) forall (l :: Row (*)) (r :: Row (*)).
FreeForall l =>
Rec l -> Rec r -> Rec (l .+ r)
.+ forall a. IsLabel "activeParameterSupport" a => a
#activeParameterSupport forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just Bool
True)
        , $sel:_contextSupport:SignatureHelpClientCapabilities :: Maybe Bool
_contextSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 Bool
True
      }

    documentSymbolCapability :: DocumentSymbolClientCapabilities
documentSymbolCapability =
      DocumentSymbolClientCapabilities {
        $sel:_dynamicRegistration:DocumentSymbolClientCapabilities :: Maybe Bool
_dynamicRegistration=Maybe Bool
dynamicReg
        -- same as workspace symbol kinds
        , $sel:_symbolKind:DocumentSymbolClientCapabilities :: Maybe (Rec (("valueSet" .== Maybe [SymbolKind]) .+ 'R '[]))
_symbolKind=forall a. a -> Maybe a
Just (forall a. IsLabel "valueSet" a => a
#valueSet forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just [SymbolKind]
sKs)
        , $sel:_hierarchicalDocumentSymbolSupport:DocumentSymbolClientCapabilities :: Maybe Bool
_hierarchicalDocumentSymbolSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
10 Bool
True
        , $sel:_tagSupport:DocumentSymbolClientCapabilities :: Maybe (Rec (("valueSet" .== [SymbolTag]) .+ 'R '[]))
_tagSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 (forall a. IsLabel "valueSet" a => a
#valueSet forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== [SymbolTag
SymbolTag_Deprecated])
        , $sel:_labelSupport:DocumentSymbolClientCapabilities :: Maybe Bool
_labelSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 Bool
True
      }

    foldingRangeCapability :: FoldingRangeClientCapabilities
foldingRangeCapability =
      FoldingRangeClientCapabilities {
        $sel:_dynamicRegistration:FoldingRangeClientCapabilities :: Maybe Bool
_dynamicRegistration=Maybe Bool
dynamicReg
        , $sel:_rangeLimit:FoldingRangeClientCapabilities :: Maybe UInt
_rangeLimit=forall a. Maybe a
Nothing
        , $sel:_lineFoldingOnly:FoldingRangeClientCapabilities :: Maybe Bool
_lineFoldingOnly=forall a. Maybe a
Nothing
        , $sel:_foldingRangeKind:FoldingRangeClientCapabilities :: Maybe (Rec (("valueSet" .== Maybe [FoldingRangeKind]) .+ 'R '[]))
_foldingRangeKind=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
17 (forall a. IsLabel "valueSet" a => a
#valueSet forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just [])
        , $sel:_foldingRange:FoldingRangeClientCapabilities :: Maybe (Rec (("collapsedText" .== Maybe Bool) .+ 'R '[]))
_foldingRange=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 (forall a. IsLabel "collapsedText" a => a
#collapsedText forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== forall a. a -> Maybe a
Just Bool
True)
      }

    publishDiagnosticsCapabilities :: PublishDiagnosticsClientCapabilities
publishDiagnosticsCapabilities =
      PublishDiagnosticsClientCapabilities {
        $sel:_relatedInformation:PublishDiagnosticsClientCapabilities :: Maybe Bool
_relatedInformation=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
7 Bool
True
        , $sel:_tagSupport:PublishDiagnosticsClientCapabilities :: Maybe (Rec (("valueSet" .== [DiagnosticTag]) .+ 'R '[]))
_tagSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
15 (forall a. IsLabel "valueSet" a => a
#valueSet forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== [ DiagnosticTag
DiagnosticTag_Unnecessary, DiagnosticTag
DiagnosticTag_Deprecated ])
        , $sel:_versionSupport:PublishDiagnosticsClientCapabilities :: Maybe Bool
_versionSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
15 Bool
True
        , $sel:_codeDescriptionSupport:PublishDiagnosticsClientCapabilities :: Maybe Bool
_codeDescriptionSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 Bool
True
        , $sel:_dataSupport:PublishDiagnosticsClientCapabilities :: Maybe Bool
_dataSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 Bool
True
      }

    dynamicReg :: Maybe Bool
dynamicReg
      | Int
maj forall a. Ord a => a -> a -> Bool
>= Int
3  = forall a. a -> Maybe a
Just Bool
True
      | Bool
otherwise = forall a. Maybe a
Nothing
    since :: Int -> Int -> a -> Maybe a
    since :: forall a. Int -> Int -> a -> Maybe a
since Int
x Int
y a
a
      | Int
maj forall a. Ord a => a -> a -> Bool
>= Int
x Bool -> Bool -> Bool
&& Int
min forall a. Ord a => a -> a -> Bool
>= Int
y = forall a. a -> Maybe a
Just a
a
      | Bool
otherwise            = forall a. Maybe a
Nothing

    window :: WindowClientCapabilities
window =
      WindowClientCapabilities {
        $sel:_workDoneProgress:WindowClientCapabilities :: Maybe Bool
_workDoneProgress=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
15 Bool
True
        , $sel:_showMessage:WindowClientCapabilities :: Maybe ShowMessageRequestClientCapabilities
_showMessage=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 forall a b. (a -> b) -> a -> b
$ Maybe
  (Rec (("additionalPropertiesSupport" .== Maybe Bool) .+ 'R '[]))
-> ShowMessageRequestClientCapabilities
ShowMessageRequestClientCapabilities forall a. Maybe a
Nothing
        , $sel:_showDocument:WindowClientCapabilities :: Maybe ShowDocumentClientCapabilities
_showDocument=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 forall a b. (a -> b) -> a -> b
$ Bool -> ShowDocumentClientCapabilities
ShowDocumentClientCapabilities Bool
True
      }

    general :: GeneralClientCapabilities
general = GeneralClientCapabilities {
      $sel:_staleRequestSupport:GeneralClientCapabilities :: Maybe
  (Rec
     (Extend "cancel" Bool ('R '[])
      .+ (("retryOnContentModified" .== [Text]) .+ 'R '[])))
_staleRequestSupport=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 (forall a. IsLabel "cancel" a => a
#cancel forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== Bool
True forall (l :: Row (*)) (r :: Row (*)).
FreeForall l =>
Rec l -> Rec r -> Rec (l .+ r)
.+ forall a. IsLabel "retryOnContentModified" a => a
#retryOnContentModified forall (l :: Symbol) a.
KnownSymbol l =>
Label l -> a -> Rec (l .== a)
.== [])
      , $sel:_regularExpressions:GeneralClientCapabilities :: Maybe RegularExpressionsClientCapabilities
_regularExpressions=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text -> RegularExpressionsClientCapabilities
RegularExpressionsClientCapabilities Text
"" forall a. Maybe a
Nothing
      , $sel:_markdown:GeneralClientCapabilities :: Maybe MarkdownClientCapabilities
_markdown=forall a. Int -> Int -> a -> Maybe a
since Int
3 Int
16 forall a b. (a -> b) -> a -> b
$ Text -> Maybe Text -> Maybe [Text] -> MarkdownClientCapabilities
MarkdownClientCapabilities Text
"" forall a. Maybe a
Nothing (forall a. a -> Maybe a
Just [])
      -- TODO
      , $sel:_positionEncodings:GeneralClientCapabilities :: Maybe [PositionEncodingKind]
_positionEncodings=forall a. Maybe a
Nothing
      }

    allMarkups :: [MarkupKind]
allMarkups = [MarkupKind
MarkupKind_PlainText, MarkupKind
MarkupKind_Markdown]