haskell-lsp-types (empty) → 0.2.1.0
raw patch · 10 files changed
+5327/−0 lines, 10 filesdep +aesondep +basedep +bytestringsetup-changed
Dependencies added: aeson, base, bytestring, data-default, filepath, hashable, lens, network-uri, text, unordered-containers
Files
- ChangeLog.md +8/−0
- LICENSE +20/−0
- README.md +13/−0
- Setup.hs +2/−0
- haskell-lsp-types.cabal +44/−0
- src/Language/Haskell/LSP/TH/ClientCapabilities.hs +641/−0
- src/Language/Haskell/LSP/TH/Constants.hs +17/−0
- src/Language/Haskell/LSP/TH/DataTypesJSON.hs +4265/−0
- src/Language/Haskell/LSP/TH/Messages.hs +311/−0
- src/Language/Haskell/LSP/TH/Utils.hs +6/−0
+ ChangeLog.md view
@@ -0,0 +1,8 @@+# Revision history for haskell-lsp++## 0.2.1.0 -- 2018-05-02++* Broken out from the haskell-lsp package, to simplify development+ by not having to run massive TH processes when working on the+ framework.+
+ LICENSE view
@@ -0,0 +1,20 @@+Copyright (c) 2016 Alan Zimmerman++Permission is hereby granted, free of charge, to any person obtaining+a copy of this software and associated documentation files (the+"Software"), to deal in the Software without restriction, including+without limitation the rights to use, copy, modify, merge, publish,+distribute, sublicense, and/or sell copies of the Software, and to+permit persons to whom the Software is furnished to do so, subject to+the following conditions:++The above copyright notice and this permission notice shall be included+in all copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ README.md view
@@ -0,0 +1,13 @@+[](https://hackage.haskell.org/package/haskell-lsp-types)++# haskell-lsp-types+Haskell library for the data types for Microsoft Language Server Protocol++## Useful links++- https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md++## Other resource++See #haskell-ide-engine on IRC freenode+
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ haskell-lsp-types.cabal view
@@ -0,0 +1,44 @@+name: haskell-lsp-types+version: 0.2.1.0+synopsis: Haskell library for the Microsoft Language Server Protocol, data types++description: An implementation of the types to allow language implementors to+ support the Language Server Protocol for their specific language.++homepage: https://github.com/alanz/haskell-lsp+license: MIT+license-file: LICENSE+author: Alan Zimmerman+maintainer: alan.zimm@gmail.com+copyright: Alan Zimmerman, 2016-2017+category: Development+build-type: Simple+extra-source-files: ChangeLog.md, README.md+cabal-version: >=1.10++library+ exposed-modules: Language.Haskell.LSP.TH.ClientCapabilities+ , Language.Haskell.LSP.TH.Constants+ , Language.Haskell.LSP.TH.DataTypesJSON+ , Language.Haskell.LSP.TH.Messages+ , Language.Haskell.LSP.TH.Utils+ -- other-modules:+ -- other-extensions:+ ghc-options: -Wall+ -- ghc-options: -Werror+ build-depends: base >=4.9 && <4.12+ , aeson >=1.0.0.0+ , bytestring+ , data-default+ , filepath+ , hashable+ , lens >= 4.15.2+ , network-uri+ , text+ , unordered-containers+ hs-source-dirs: src+ default-language: Haskell2010++source-repository head+ type: git+ location: https://github.com/alanz/haskell-lsp
+ src/Language/Haskell/LSP/TH/ClientCapabilities.hs view
@@ -0,0 +1,641 @@+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeSynonymInstances #-}++module Language.Haskell.LSP.TH.ClientCapabilities where++import Data.Aeson.TH+-- import Data.Aeson.Types+import qualified Data.Aeson as A+-- import qualified Data.HashMap.Strict as H+-- import qualified Data.Text as T++import Language.Haskell.LSP.TH.Constants+-- import Language.Haskell.LSP.Utility+import Data.Default++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++WorkspaceClientCapabilities++define capabilities the editor / tool provides on the workspace:+/**+ * Workspace specific client capabilities.+ */+export interface WorkspaceClientCapabilities {+ /**+ * The client supports applying batch edits to the workspace by supporting+ * the request 'workspace/applyEdit'+ */+ applyEdit?: boolean;++ /**+ * Capabilities specific to `WorkspaceEdit`s+ */+ workspaceEdit?: {+ /**+ * The client supports versioned document changes in `WorkspaceEdit`s+ */+ documentChanges?: boolean;+ };++ /**+ * Capabilities specific to the `workspace/didChangeConfiguration` notification.+ */+ didChangeConfiguration?: {+ /**+ * Did change configuration notification supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `workspace/didChangeWatchedFiles` notification.+ */+ didChangeWatchedFiles?: {+ /**+ * Did change watched files notification supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `workspace/symbol` request.+ */+ symbol?: {+ /**+ * Symbol request supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `workspace/executeCommand` request.+ */+ executeCommand?: {+ /**+ * Execute command supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };+}+-}++-- -------------------------------------++data WorkspaceEditClientCapabilities =+ WorkspaceEditClientCapabilities+ { _documentChanges :: Maybe Bool -- ^The client supports versioned document+ -- changes in `WorkspaceEdit`s+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''WorkspaceEditClientCapabilities)++-- -------------------------------------++data DidChangeConfigurationClientCapabilities =+ DidChangeConfigurationClientCapabilities+ { _dynamicRegistration :: Maybe Bool -- ^Did change configuration+ -- notification supports dynamic+ -- registration.+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''DidChangeConfigurationClientCapabilities)++-- -------------------------------------++data DidChangeWatchedFilesClientCapabilities =+ DidChangeWatchedFilesClientCapabilities+ { _dynamicRegistration :: Maybe Bool -- ^Did change watched files+ -- notification supports dynamic+ -- registration.+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''DidChangeWatchedFilesClientCapabilities)++-- -------------------------------------++data SymbolClientCapabilities =+ SymbolClientCapabilities+ { _dynamicRegistration :: Maybe Bool -- ^Symbol request supports dynamic+ -- registration.+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''SymbolClientCapabilities)++-- -------------------------------------++data ExecuteClientCapabilities =+ ExecuteClientCapabilities+ { _dynamicRegistration :: Maybe Bool -- ^Execute command supports dynamic+ -- registration.+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''ExecuteClientCapabilities)++-- -------------------------------------++data WorkspaceClientCapabilities =+ WorkspaceClientCapabilities+ { -- | The client supports applying batch edits to the workspace by supporting+ -- the request 'workspace/applyEdit'+ _applyEdit :: Maybe Bool++ -- | Capabilities specific to `WorkspaceEdit`s+ , _workspaceEdit :: Maybe WorkspaceEditClientCapabilities++ -- | Capabilities specific to the `workspace/didChangeConfiguration` notification.+ , _didChangeConfiguration :: Maybe DidChangeConfigurationClientCapabilities++ -- | Capabilities specific to the `workspace/didChangeWatchedFiles` notification.+ , _didChangeWatchedFiles :: Maybe DidChangeWatchedFilesClientCapabilities++ -- | Capabilities specific to the `workspace/symbol` request.+ , _symbol :: Maybe SymbolClientCapabilities++ -- | Capabilities specific to the `workspace/executeCommand` request.+ , _executeCommand :: Maybe ExecuteClientCapabilities+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''WorkspaceClientCapabilities)++instance Default WorkspaceClientCapabilities where+ def = WorkspaceClientCapabilities def def def def def def++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++TextDocumentClientCapabilities+ define capabilities the editor / tool provides on text documents.++/**+ * Text document specific client capabilities.+ */+export interface TextDocumentClientCapabilities {++ synchronization?: {+ /**+ * Whether text document synchronization supports dynamic registration.+ */+ dynamicRegistration?: boolean;++ /**+ * The client supports sending will save notifications.+ */+ willSave?: boolean;++ /**+ * The client supports sending a will save request and+ * waits for a response providing text edits which will+ * be applied to the document before it is saved.+ */+ willSaveWaitUntil?: boolean;++ /**+ * The client supports did save notifications.+ */+ didSave?: boolean;+ }++ /**+ * Capabilities specific to the `textDocument/completion`+ */+ completion?: {+ /**+ * Whether completion supports dynamic registration.+ */+ dynamicRegistration?: boolean;++ /**+ * The client supports the following `CompletionItem` specific+ * capabilities.+ */+ completionItem?: {+ /**+ * Client supports snippets as insert text.+ *+ * A snippet can define tab stops and placeholders with `$1`, `$2`+ * and `${3:foo}`. `$0` defines the final tab stop, it defaults to+ * the end of the snippet. Placeholders with equal identifiers are linked,+ * that is typing in one will update others too.+ */+ snippetSupport?: boolean;+ }+ };++ /**+ * Capabilities specific to the `textDocument/hover`+ */+ hover?: {+ /**+ * Whether hover supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/signatureHelp`+ */+ signatureHelp?: {+ /**+ * Whether signature help supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/references`+ */+ references?: {+ /**+ * Whether references supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/documentHighlight`+ */+ documentHighlight?: {+ /**+ * Whether document highlight supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/documentSymbol`+ */+ documentSymbol?: {+ /**+ * Whether document symbol supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/formatting`+ */+ formatting?: {+ /**+ * Whether formatting supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/rangeFormatting`+ */+ rangeFormatting?: {+ /**+ * Whether range formatting supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/onTypeFormatting`+ */+ onTypeFormatting?: {+ /**+ * Whether on type formatting supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/definition`+ */+ definition?: {+ /**+ * Whether definition supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/codeAction`+ */+ codeAction?: {+ /**+ * Whether code action supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/codeLens`+ */+ codeLens?: {+ /**+ * Whether code lens supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/documentLink`+ */+ documentLink?: {+ /**+ * Whether document link supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };++ /**+ * Capabilities specific to the `textDocument/rename`+ */+ rename?: {+ /**+ * Whether rename supports dynamic registration.+ */+ dynamicRegistration?: boolean;+ };+}++-}++-- -------------------------------------++-- TODO:AZ: this name is Java-ridiculously long+data SynchronizationTextDocumentClientCapabilities =+ SynchronizationTextDocumentClientCapabilities+ { -- | Whether text document synchronization supports dynamic registration.+ _dynamicRegistration :: Maybe Bool++ -- | The client supports sending will save notifications.+ , _willSave :: Maybe Bool++ -- | The client supports sending a will save request and waits for a+ -- response providing text edits which will be applied to the document+ -- before it is saved.+ , _willSaveWaitUntil :: Maybe Bool++ -- | The client supports did save notifications.+ , _didSave :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''SynchronizationTextDocumentClientCapabilities)++instance Default SynchronizationTextDocumentClientCapabilities where+ def = SynchronizationTextDocumentClientCapabilities def def def def++-- -------------------------------------++data CompletionItemClientCapabilities =+ CompletionItemClientCapabilities+ {+ -- | Client supports snippets as insert text.+ --+ -- A snippet can define tab stops and placeholders with `$1`, `$2` and+ -- `${3:foo}`. `$0` defines the final tab stop, it defaults to the end of+ -- the snippet. Placeholders with equal identifiers are linked, that is+ -- typing in one will update others too.+ _snippetSupport :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''CompletionItemClientCapabilities)++data CompletionClientCapabilities =+ CompletionClientCapabilities+ { _dynamicRegistration :: Maybe Bool -- ^Whether completion supports dynamic+ -- registration.+ , _completionItem :: Maybe CompletionItemClientCapabilities+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''CompletionClientCapabilities)++-- -------------------------------------++data HoverClientCapabilities =+ HoverClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''HoverClientCapabilities)++-- -------------------------------------++data SignatureHelpClientCapabilities =+ SignatureHelpClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''SignatureHelpClientCapabilities)++-- -------------------------------------++data ReferencesClientCapabilities =+ ReferencesClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''ReferencesClientCapabilities)++-- -------------------------------------++data DocumentHighlightClientCapabilities =+ DocumentHighlightClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''DocumentHighlightClientCapabilities)++-- -------------------------------------++data DocumentSymbolClientCapabilities =+ DocumentSymbolClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''DocumentSymbolClientCapabilities)++-- -------------------------------------++data FormattingClientCapabilities =+ FormattingClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''FormattingClientCapabilities)++-- -------------------------------------++data RangeFormattingClientCapabilities =+ RangeFormattingClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''RangeFormattingClientCapabilities)++-- -------------------------------------++data OnTypeFormattingClientCapabilities =+ OnTypeFormattingClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''OnTypeFormattingClientCapabilities)++-- -------------------------------------++data DefinitionClientCapabilities =+ DefinitionClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''DefinitionClientCapabilities)++-- -------------------------------------++data CodeActionClientCapabilities =+ CodeActionClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''CodeActionClientCapabilities)++-- -------------------------------------++data CodeLensClientCapabilities =+ CodeLensClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''CodeLensClientCapabilities)++-- -------------------------------------++data DocumentLinkClientCapabilities =+ DocumentLinkClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''DocumentLinkClientCapabilities)++-- -------------------------------------++data RenameClientCapabilities =+ RenameClientCapabilities+ { _dynamicRegistration :: Maybe Bool+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''RenameClientCapabilities)++-- -------------------------------------++data TextDocumentClientCapabilities =+ TextDocumentClientCapabilities+ { _synchronization :: Maybe SynchronizationTextDocumentClientCapabilities++ -- | Capabilities specific to the `textDocument/completion`+ , _completion :: Maybe CompletionClientCapabilities++ -- | Capabilities specific to the `textDocument/hover`+ , _hover :: Maybe HoverClientCapabilities++ -- | Capabilities specific to the `textDocument/signatureHelp`+ , _signatureHelp :: Maybe SignatureHelpClientCapabilities++ -- | Capabilities specific to the `textDocument/references`+ , _references :: Maybe ReferencesClientCapabilities++ -- | Capabilities specific to the `textDocument/documentHighlight`+ , _documentHighlight :: Maybe DocumentHighlightClientCapabilities++ -- | Capabilities specific to the `textDocument/documentSymbol`+ , _documentSymbol :: Maybe DocumentSymbolClientCapabilities++ -- | Capabilities specific to the `textDocument/formatting`+ , _formatting :: Maybe FormattingClientCapabilities++ -- | Capabilities specific to the `textDocument/rangeFormatting`+ , _rangeFormatting :: Maybe RangeFormattingClientCapabilities++ -- | Capabilities specific to the `textDocument/onTypeFormatting`+ , _onTypeFormatting :: Maybe OnTypeFormattingClientCapabilities++ -- | Capabilities specific to the `textDocument/definition`+ , _definition :: Maybe DefinitionClientCapabilities++ -- | Capabilities specific to the `textDocument/codeAction`+ , _codeAction :: Maybe CodeActionClientCapabilities++ -- | Capabilities specific to the `textDocument/codeLens`+ , _codeLens :: Maybe CodeLensClientCapabilities++ -- | Capabilities specific to the `textDocument/documentLink`+ , _documentLink :: Maybe DocumentLinkClientCapabilities++ -- | Capabilities specific to the `textDocument/rename`+ , _rename :: Maybe RenameClientCapabilities+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''TextDocumentClientCapabilities)++instance Default TextDocumentClientCapabilities where+ def = TextDocumentClientCapabilities def def def def def def def+ def def def def def def def def++-- ---------------------------------------------------------------------+{-+New in 3.0++-----------++ClientCapabilities++now define capabilities for dynamic registration, workspace and text document+features the client supports. The experimental can be used to pass experimential+capabilities under development. For future compatibility a ClientCapabilities+object literal can have more properties set than currently defined. Servers+receiving a ClientCapabilities object literal with unknown properties should+ignore these properties. A missing property should be interpreted as an absence+of the capability. If a property is missing that defines sub properties all sub+properties should be interpreted as an absence of the capability.++Client capabilities got introduced with the version 3.0 of the protocol. They+therefore only describe capabilities that got introduced in 3.x or later.+Capabilities that existed in the 2.x version of the protocol are still mandatory+for clients. Clients cannot opt out of providing them. So even if a client omits+the ClientCapabilities.textDocument.synchronization it is still required that+the client provides text document synchronization (e.g. open, changed and close+notifications).++interface ClientCapabilities {+ /**+ * Workspace specific client capabilities.+ */+ workspace?: WorkspaceClientCapabilities;++ /**+ * Text document specific client capabilities.+ */+ textDocument?: TextDocumentClientCapabilities;++ /**+ * Experimental client capabilities.+ */+ experimental?: any;+}+-}++data ClientCapabilities =+ ClientCapabilities+ { _workspace :: Maybe WorkspaceClientCapabilities+ , _textDocument :: Maybe TextDocumentClientCapabilities+ , _experimental :: Maybe A.Object+ } deriving (Show, Read, Eq)++$(deriveJSON lspOptions ''ClientCapabilities)++instance Default ClientCapabilities where+ def = ClientCapabilities def def def
+ src/Language/Haskell/LSP/TH/Constants.hs view
@@ -0,0 +1,17 @@++module Language.Haskell.LSP.TH.Constants where++import Data.Aeson.TH++-- ---------------------------------------------------------------------++-- | Standard options for use when generating JSON instances+lspOptions :: Options+lspOptions = defaultOptions { omitNothingFields = True, fieldLabelModifier = drop 1 }+ -- NOTE: This needs to be in a separate file because of the TH stage restriction++customModifier :: String -> String+customModifier "_xdata" = "data"+customModifier "_xtype" = "type"+customModifier xs = drop 1 xs+
+ src/Language/Haskell/LSP/TH/DataTypesJSON.hs view
@@ -0,0 +1,4265 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE DeriveTraversable #-}+{-# LANGUAGE DuplicateRecordFields #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeSynonymInstances #-}++module Language.Haskell.LSP.TH.DataTypesJSON where++import Control.Lens.TH (makeFieldsNoPrefix)+import qualified Data.Aeson as A+import Data.Aeson.TH+import Data.Aeson.Types+import Data.Hashable+import qualified Data.HashMap.Strict as H+import Data.Monoid ((<>))+import Data.Text (Text)+import qualified Data.Text as T+import Network.URI+import qualified System.FilePath.Posix as FPP+import qualified System.FilePath.Windows as FPW+import qualified System.Info+import System.IO (FilePath)++import Language.Haskell.LSP.TH.ClientCapabilities+import Language.Haskell.LSP.TH.Constants+import Language.Haskell.LSP.TH.Utils++-- ---------------------------------------------------------------------++-- | This data type is used to host a FromJSON instance for the encoding used by+-- elisp, where an empty list shows up as "null"+newtype List a = List [a]+ deriving (Show,Read,Eq,Ord,Monoid,Functor,Foldable,Traversable)++instance (A.ToJSON a) => A.ToJSON (List a) where+ toJSON (List ls) = toJSON ls++instance (A.FromJSON a) => A.FromJSON (List a) where+ parseJSON A.Null = return (List [])+ parseJSON v = List <$> parseJSON v++#if __GLASGOW_HASKELL__ >= 804+instance Semigroup (List a) where+ (<>) = mappend+#endif++-- ---------------------------------------------------------------------++newtype Uri = Uri { getUri :: Text }+ deriving (Eq,Ord,Read,Show,A.FromJSON,A.ToJSON,Hashable,A.ToJSONKey,A.FromJSONKey)++fileScheme :: String+fileScheme = "file:"++windowsOS :: String+windowsOS = "mingw32"++type SystemOS = String++uriToFilePath :: Uri -> Maybe FilePath+uriToFilePath = platformAwareUriToFilePath System.Info.os++platformAwareUriToFilePath :: String -> Uri -> Maybe FilePath+platformAwareUriToFilePath systemOS (Uri uri) = do+ parsedUri <- parseURI $ T.unpack uri+ if uriScheme parsedUri == fileScheme+ then return $ (platformAdjustFromUriPath systemOS . unEscapeString . uriPath) parsedUri+ else Nothing++platformAdjustFromUriPath :: SystemOS -> String -> FilePath+platformAdjustFromUriPath systemOS srcPath =+ if systemOS /= windowsOS then srcPath+ else let+ firstSegment:rest = (FPP.splitDirectories . tail) srcPath -- Drop leading '/' for absolute Windows paths+ drive = if FPW.isDrive firstSegment then FPW.addTrailingPathSeparator firstSegment else firstSegment+ in FPW.joinDrive drive $ FPW.joinPath rest++filePathToUri :: FilePath -> Uri+filePathToUri = platformAwareFilePathToUri System.Info.os++platformAwareFilePathToUri :: SystemOS -> FilePath -> Uri+platformAwareFilePathToUri systemOS fp = Uri . T.pack . show $ URI+ { uriScheme = fileScheme+ , uriAuthority = Just $ URIAuth "" "" ""+ , uriPath = platformAdjustToUriPath systemOS fp+ , uriQuery = ""+ , uriFragment = ""+ }++platformAdjustToUriPath :: SystemOS -> FilePath -> String+platformAdjustToUriPath systemOS srcPath =+ if systemOS /= windowsOS then srcPath+ else let+ drive:rest = FPW.splitDirectories srcPath+ leaveCharUnescaped = (/= ':')+ removePathSeparator = filter (not . FPW.isPathSeparator)+ escapedDrive = removePathSeparator $ escapeURIString leaveCharUnescaped drive+ in '/' : FPP.joinPath (escapedDrive : rest)++-- ---------------------------------------------------------------------++-- | Id used for a request, Can be either a String or an Int+data LspId = IdInt Int | IdString Text+ deriving (Show,Read,Eq,Ord)++instance A.ToJSON LspId where+ toJSON (IdInt i) = toJSON i+ toJSON (IdString s) = toJSON s++instance A.FromJSON LspId where+ parseJSON v@(A.Number _) = IdInt <$> parseJSON v+ parseJSON (A.String s) = return (IdString s)+ parseJSON _ = mempty++-- ---------------------------------------------------------------------++-- | Id used for a response, Can be either a String or an Int, or Null. If a+-- request doesn't provide a result value the receiver of a request still needs+-- to return a response message to conform to the JSON RPC specification. The+-- result property of the ResponseMessage should be set to null in this case to+-- signal a successful request.+data LspIdRsp = IdRspInt Int | IdRspString Text | IdRspNull+ deriving (Show,Read,Eq)++instance A.ToJSON LspIdRsp where+ toJSON (IdRspInt i) = toJSON i+ toJSON (IdRspString s) = toJSON s+ toJSON IdRspNull = A.Null++instance A.FromJSON LspIdRsp where+ parseJSON v@(A.Number _) = IdRspInt <$> parseJSON v+ parseJSON (A.String s) = return $ IdRspString s+ parseJSON A.Null = return IdRspNull+ parseJSON _ = mempty++responseId :: LspId -> LspIdRsp+responseId (IdInt i) = (IdRspInt i)+responseId (IdString s) = (IdRspString s)++-- ---------------------------------------------------------------------++-- Client Methods+data ClientMethod =+ -- General+ Initialize+ | Initialized+ | Shutdown+ | Exit+ | CancelRequest+ -- Workspace+ | WorkspaceDidChangeConfiguration+ | WorkspaceDidChangeWatchedFiles+ | WorkspaceSymbol+ | WorkspaceExecuteCommand+ -- Document+ | TextDocumentDidOpen+ | TextDocumentDidChange+ | TextDocumentWillSave+ | TextDocumentWillSaveWaitUntil+ | TextDocumentDidSave+ | TextDocumentDidClose+ | TextDocumentCompletion+ | CompletionItemResolve+ | TextDocumentHover+ | TextDocumentSignatureHelp+ | TextDocumentReferences+ | TextDocumentDocumentHighlight+ | TextDocumentDocumentSymbol+ | TextDocumentFormatting+ | TextDocumentRangeFormatting+ | TextDocumentOnTypeFormatting+ | TextDocumentDefinition+ | TextDocumentCodeAction+ | TextDocumentCodeLens+ | CodeLensResolve+ | TextDocumentDocumentLink+ | DocumentLinkResolve+ | TextDocumentRename+ -- Messages of the form $/message+ -- Implementation Dependent, can be ignored+ | Misc Text+ deriving (Eq,Ord,Read,Show)++instance A.FromJSON ClientMethod where+ -- General+ parseJSON (A.String "initialize") = return Initialize+ parseJSON (A.String "initialized") = return Initialized+ parseJSON (A.String "shutdown") = return Shutdown+ parseJSON (A.String "exit") = return Exit+ parseJSON (A.String "$/cancelRequest") = return CancelRequest+ -- Workspace+ parseJSON (A.String "workspace/didChangeConfiguration") = return WorkspaceDidChangeConfiguration+ parseJSON (A.String "workspace/didChangeWatchedFiles") = return WorkspaceDidChangeWatchedFiles+ parseJSON (A.String "workspace/symbol") = return WorkspaceSymbol+ parseJSON (A.String "workspace/executeCommand") = return WorkspaceExecuteCommand+ -- Document+ parseJSON (A.String "textDocument/didOpen") = return TextDocumentDidOpen+ parseJSON (A.String "textDocument/didChange") = return TextDocumentDidChange+ parseJSON (A.String "textDocument/willSave") = return TextDocumentWillSave+ parseJSON (A.String "textDocument/willSaveWaitUntil") = return TextDocumentWillSaveWaitUntil+ parseJSON (A.String "textDocument/didSave") = return TextDocumentDidSave+ parseJSON (A.String "textDocument/didClose") = return TextDocumentDidClose+ parseJSON (A.String "textDocument/completion") = return TextDocumentCompletion+ parseJSON (A.String "completionItem/resolve") = return CompletionItemResolve+ parseJSON (A.String "textDocument/hover") = return TextDocumentHover+ parseJSON (A.String "textDocument/signatureHelp") = return TextDocumentSignatureHelp+ parseJSON (A.String "textDocument/references") = return TextDocumentReferences+ parseJSON (A.String "textDocument/documentHighlight") = return TextDocumentDocumentHighlight+ parseJSON (A.String "textDocument/documentSymbol") = return TextDocumentDocumentSymbol+ parseJSON (A.String "textDocument/formatting") = return TextDocumentFormatting+ parseJSON (A.String "textDocument/rangeFormatting") = return TextDocumentRangeFormatting+ parseJSON (A.String "textDocument/onTypeFormatting") = return TextDocumentOnTypeFormatting+ parseJSON (A.String "textDocument/definition") = return TextDocumentDefinition+ parseJSON (A.String "textDocument/codeAction") = return TextDocumentCodeAction+ parseJSON (A.String "textDocument/codeLens") = return TextDocumentCodeLens+ parseJSON (A.String "codeLens/resolve") = return CodeLensResolve+ parseJSON (A.String "textDocument/documentLink") = return TextDocumentDocumentLink+ parseJSON (A.String "documentLink/resolve") = return DocumentLinkResolve+ parseJSON (A.String "textDocument/rename") = return TextDocumentRename+ parseJSON (A.String x) = if T.isPrefixOf "$/" x+ then return $ Misc (T.drop 2 x)+ else mempty+ parseJSON _ = mempty++instance A.ToJSON ClientMethod where+ -- General+ toJSON Initialize = A.String "initialize"+ toJSON Initialized = A.String "initialized"+ toJSON Shutdown = A.String "shutdown"+ toJSON Exit = A.String "exit"+ toJSON CancelRequest = A.String "$/cancelRequest"+ -- Workspace+ toJSON WorkspaceDidChangeConfiguration = A.String "workspace/didChangeConfiguration"+ toJSON WorkspaceDidChangeWatchedFiles = A.String "workspace/didChangeWatchedFiles"+ toJSON WorkspaceSymbol = A.String "workspace/symbol"+ toJSON WorkspaceExecuteCommand = A.String "workspace/executeCommand"+ -- Document+ toJSON TextDocumentDidOpen = A.String "textDocument/didOpen"+ toJSON TextDocumentDidChange = A.String "textDocument/didChange"+ toJSON TextDocumentWillSave = A.String "textDocument/willSave"+ toJSON TextDocumentWillSaveWaitUntil = A.String "textDocument/willSaveWaitUntil"+ toJSON TextDocumentDidSave = A.String "textDocument/didSave"+ toJSON TextDocumentDidClose = A.String "textDocument/didClose"+ toJSON TextDocumentCompletion = A.String "textDocument/completion"+ toJSON CompletionItemResolve = A.String "completionItem/resolve"+ toJSON TextDocumentHover = A.String "textDocument/hover"+ toJSON TextDocumentSignatureHelp = A.String "textDocument/signatureHelp"+ toJSON TextDocumentReferences = A.String "textDocument/references"+ toJSON TextDocumentDocumentHighlight = A.String "textDocument/documentHighlight"+ toJSON TextDocumentDocumentSymbol = A.String "textDocument/documentSymbol"+ toJSON TextDocumentFormatting = A.String "textDocument/formatting"+ toJSON TextDocumentRangeFormatting = A.String "textDocument/rangeFormatting"+ toJSON TextDocumentOnTypeFormatting = A.String "textDocument/onTypeFormatting"+ toJSON TextDocumentDefinition = A.String "textDocument/definition"+ toJSON TextDocumentCodeAction = A.String "textDocument/codeAction"+ toJSON TextDocumentCodeLens = A.String "textDocument/codeLens"+ toJSON CodeLensResolve = A.String "codeLens/resolve"+ toJSON TextDocumentRename = A.String "textDocument/rename"+ toJSON TextDocumentDocumentLink = A.String "textDocument/documentLink"+ toJSON DocumentLinkResolve = A.String "documentLink/resolve"+ toJSON (Misc xs) = A.String $ "$/" <> xs++data ServerMethod =+ -- Window+ WindowShowMessage+ | WindowShowMessageRequest+ | WindowLogMessage+ | TelemetryEvent+ -- Client+ | ClientRegisterCapability+ | ClientUnregisterCapability+ -- Workspace+ | WorkspaceApplyEdit+ -- Document+ | TextDocumentPublishDiagnostics+ deriving (Eq,Ord,Read,Show)++instance A.FromJSON ServerMethod where+ -- Window+ parseJSON (A.String "window/showMessage") = return WindowShowMessage+ parseJSON (A.String "window/showMessageRequest") = return WindowShowMessageRequest+ parseJSON (A.String "window/logMessage") = return WindowLogMessage+ parseJSON (A.String "telemetry/event") = return TelemetryEvent+ -- Client+ parseJSON (A.String "client/registerCapability") = return ClientRegisterCapability+ parseJSON (A.String "client/unregisterCapability") = return ClientUnregisterCapability+ -- Workspace+ parseJSON (A.String "workspace/applyEdit") = return WorkspaceApplyEdit+ -- Document+ parseJSON (A.String "textDocument/publishDiagnostics") = return TextDocumentPublishDiagnostics+ parseJSON _ = mempty++instance A.ToJSON ServerMethod where+ -- Window+ toJSON WindowShowMessage = A.String "window/showMessage"+ toJSON WindowShowMessageRequest = A.String "window/showMessageRequest"+ toJSON WindowLogMessage = A.String "window/logMessage"+ toJSON TelemetryEvent = A.String "telemetry/event"+ -- Client+ toJSON ClientRegisterCapability = A.String "client/registerCapability"+ toJSON ClientUnregisterCapability = A.String "client/unregisterCapability"+ -- Workspace+ toJSON WorkspaceApplyEdit = A.String "workspace/applyEdit"+ -- Document+ toJSON TextDocumentPublishDiagnostics = A.String "textDocument/publishDiagnostics"++data RequestMessage m req resp =+ RequestMessage+ { _jsonrpc :: Text+ , _id :: LspId+ , _method :: m+ , _params :: req+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''RequestMessage+makeFieldsNoPrefix ''RequestMessage++-- ---------------------------------------------------------------------+{-+interface ResponseError<D> {+ /**+ * A number indicating the error type that occurred.+ */+ code: number;++ /**+ * A string providing a short description of the error.+ */+ message: string;++ /**+ * A Primitive or Structured value that contains additional+ * information about the error. Can be omitted.+ */+ data?: D;+}++export namespace ErrorCodes {+ // Defined by JSON RPC+ export const ParseError: number = -32700;+ export const InvalidRequest: number = -32600;+ export const MethodNotFound: number = -32601;+ export const InvalidParams: number = -32602;+ export const InternalError: number = -32603;+ export const serverErrorStart: number = -32099;+ export const serverErrorEnd: number = -32000;+ export const ServerNotInitialized: number = -32002;+ export const UnknownErrorCode: number = -32001;++ // Defined by the protocol.+ export const RequestCancelled: number = -32800;+}+-}++data ErrorCode = ParseError+ | InvalidRequest+ | MethodNotFound+ | InvalidParams+ | InternalError+ -- ^ Note: server error codes are reserved from -32099 to -32000+ deriving (Read,Show,Eq)++instance A.ToJSON ErrorCode where+ toJSON ParseError = A.Number (-32700)+ toJSON InvalidRequest = A.Number (-32600)+ toJSON MethodNotFound = A.Number (-32601)+ toJSON InvalidParams = A.Number (-32602)+ toJSON InternalError = A.Number (-32603)++instance A.FromJSON ErrorCode where+ parseJSON (A.Number (-32700)) = pure ParseError+ parseJSON (A.Number (-32600)) = pure InvalidRequest+ parseJSON (A.Number (-32601)) = pure MethodNotFound+ parseJSON (A.Number (-32602)) = pure InvalidParams+ parseJSON (A.Number (-32603)) = pure InternalError+ parseJSON _ = mempty++-- -------------------------------------++data ResponseError =+ ResponseError+ { _code :: ErrorCode+ , _message :: Text+ , _xdata :: Maybe A.Value+ } deriving (Read,Show,Eq)++deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''ResponseError+makeFieldsNoPrefix ''ResponseError++-- ---------------------------------------------------------------------++data ResponseMessage a =+ ResponseMessage+ { _jsonrpc :: Text+ , _id :: LspIdRsp+ , _result :: Maybe a+ , _error :: Maybe ResponseError+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''ResponseMessage+makeFieldsNoPrefix ''ResponseMessage++type ErrorResponse = ResponseMessage ()++-- ---------------------------------------------------------------------++type BareResponseMessage = ResponseMessage A.Value++-- ---------------------------------------------------------------------+{-+$ Notifications and Requests++Notification and requests ids starting with '$/' are messages which are protocol+implementation dependent and might not be implementable in all clients or+servers. For example if the server implementation uses a single threaded+synchronous programming language then there is little a server can do to react+to a '$/cancelRequest'. If a server or client receives notifications or requests+starting with '$/' it is free to ignore them if they are unknown.+-}++data NotificationMessage m a =+ NotificationMessage+ { _jsonrpc :: Text+ , _method :: m+ , _params :: a+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''NotificationMessage+makeFieldsNoPrefix ''NotificationMessage++-- ---------------------------------------------------------------------+{-+Cancellation Support++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#cancellation-support++ New: The base protocol now offers support for request cancellation. To+ cancel a request, a notification message with the following properties is+ sent:++Notification:++ method: '$/cancelRequest'+ params: CancelParams defined as follows:++interface CancelParams {+ /**+ * The request id to cancel.+ */+ id: number | string;+}++A request that got canceled still needs to return from the server and send a+response back. It can not be left open / hanging. This is in line with the JSON+RPC protocol that requires that every request sends a response back. In addition+it allows for returning partial results on cancel.+-}++data CancelParams =+ CancelParams+ { _id :: LspId+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''CancelParams+makeFieldsNoPrefix ''CancelParams++type CancelNotification = NotificationMessage ClientMethod CancelParams++-- ---------------------------------------------------------------------++{-+The current protocol is talored for textual documents which content can be+represented as a string. There is currently no support for binary documents.+Positions inside a document (see Position definition below) are expressed as a+zero-based line and character offset. To ensure that both client and server+split the string into the same line representation the protocol specs the+following end of line sequences: '\n', '\r\n' and '\r'.++export const EOL: string[] = ['\n', '\r\n', '\r'];+-}+{-+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#position++Position in a text document expressed as zero-based line and character offset. A+position is between two characters like an 'insert' cursor in a editor.++interface Position {+ /**+ * Line position in a document (zero-based).+ */+ line: number;++ /**+ * Character offset on a line in a document (zero-based).+ */+ character: number;+}+-}+data Position =+ Position+ { _line :: Int+ , _character :: Int+ } deriving (Show, Read, Eq, Ord)++deriveJSON lspOptions ''Position+makeFieldsNoPrefix ''Position++-- ---------------------------------------------------------------------+{-+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#range++A range in a text document expressed as (zero-based) start and end positions. A+range is comparable to a selection in an editor. Therefore the end position is+exclusive.++interface Range {+ /**+ * The range's start position.+ */+ start: Position;++ /**+ * The range's end position.+ */+ end: Position;+}+-}++data Range =+ Range+ { _start :: Position+ , _end :: Position+ } deriving (Show, Read, Eq, Ord)++deriveJSON lspOptions ''Range+makeFieldsNoPrefix ''Range++-- ---------------------------------------------------------------------+{-+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#location++Represents a location inside a resource, such as a line inside a text file.++interface Location {+ uri: string;+ range: Range;+}+-}++data Location =+ Location+ { _uri :: Uri+ , _range :: Range+ } deriving (Show, Read, Eq, Ord)++deriveJSON lspOptions ''Location+makeFieldsNoPrefix ''Location++-- ---------------------------------------------------------------------+{-+The protocol currently supports the following diagnostic severities:++enum DiagnosticSeverity {+ /**+ * Reports an error.+ */+ Error = 1,+ /**+ * Reports a warning.+ */+ Warning = 2,+ /**+ * Reports an information.+ */+ Information = 3,+ /**+ * Reports a hint.+ */+ Hint = 4+}+-}+data DiagnosticSeverity+ = DsError -- ^ Error = 1,+ | DsWarning -- ^ Warning = 2,+ | DsInfo -- ^ Info = 3,+ | DsHint -- ^ Hint = 4+ deriving (Eq,Ord,Show,Read)++instance A.ToJSON DiagnosticSeverity where+ toJSON DsError = A.Number 1+ toJSON DsWarning = A.Number 2+ toJSON DsInfo = A.Number 3+ toJSON DsHint = A.Number 4++instance A.FromJSON DiagnosticSeverity where+ parseJSON (A.Number 1) = pure DsError+ parseJSON (A.Number 2) = pure DsWarning+ parseJSON (A.Number 3) = pure DsInfo+ parseJSON (A.Number 4) = pure DsHint+ parseJSON _ = mempty++-- ---------------------------------------------------------------------+{-+Represents a related message and source code location for a diagnostic. This should be+used to point to code locations that cause or related to a diagnostics, e.g when duplicating+a symbol in a scope.++export interface DiagnosticRelatedInformation {+ /**+ * The location of this related diagnostic information.+ */+ location: Location;++ /**+ * The message of this related diagnostic information.+ */+ message: string;+}+-}++data DiagnosticRelatedInformation =+ DiagnosticRelatedInformation+ { _location :: Location+ , _message :: Text+ } deriving (Show, Read, Eq, Ord)++deriveJSON lspOptions ''DiagnosticRelatedInformation+makeFieldsNoPrefix ''DiagnosticRelatedInformation++-- ---------------------------------------------------------------------+{-+Diagnostic++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#diagnostic++Represents a diagnostic, such as a compiler error or warning. Diagnostic objects+are only valid in the scope of a resource.++interface Diagnostic {+ /**+ * The range at which the message applies.+ */+ range: Range;++ /**+ * The diagnostic's severity. Can be omitted. If omitted it is up to the+ * client to interpret diagnostics as error, warning, info or hint.+ */+ severity?: number;++ /**+ * The diagnostic's code. Can be omitted.+ */+ code?: number | string;++ /**+ * A human-readable string describing the source of this+ * diagnostic, e.g. 'typescript' or 'super lint'.+ */+ source?: string;++ /**+ * The diagnostic's message.+ */+ message: string;++ /**+ * An array of related diagnostic information, e.g. when symbol-names within+ * a scope collide all definitions can be marked via this property.+ */+ relatedInformation?: DiagnosticRelatedInformation[];+}+-}++type DiagnosticSource = Text+data Diagnostic =+ Diagnostic+ { _range :: Range+ , _severity :: Maybe DiagnosticSeverity+ , _code :: Maybe Text -- Note: Protocol allows Int too.+ , _source :: Maybe DiagnosticSource+ , _message :: Text+ , _relatedInformation :: List DiagnosticRelatedInformation+ } deriving (Show, Read, Eq, Ord)++deriveJSON lspOptions ''Diagnostic+makeFieldsNoPrefix ''Diagnostic++-- ---------------------------------------------------------------------+{-+Command++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#command++Represents a reference to a command. Provides a title which will be used to+represent a command in the UI. Commands are identitifed using a string+identifier and the protocol currently doesn't specify a set of well known+commands. So executing a command requires some tool extension code.++interface Command {+ /**+ * Title of the command, like `save`.+ */+ title: string;+ /**+ * The identifier of the actual command handler.+ */+ command: string;+ /**+ * Arguments that the command handler should be+ * invoked with.+ */+ arguments?: any[];+}+-}++data Command =+ Command+ { _title :: Text+ , _command :: Text+ , _arguments :: Maybe A.Value+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''Command+makeFieldsNoPrefix ''Command++-- ---------------------------------------------------------------------+{-+TextEdit++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textedit++A textual edit applicable to a text document.++interface TextEdit {+ /**+ * The range of the text document to be manipulated. To insert+ * text into a document create a range where start === end.+ */+ range: Range;++ /**+ * The string to be inserted. For delete operations use an+ * empty string.+ */+ newText: string;+}+++-}++data TextEdit =+ TextEdit+ { _range :: Range+ , _newText :: Text+ } deriving (Show,Read,Eq)++deriveJSON lspOptions ''TextEdit+makeFieldsNoPrefix ''TextEdit++-- ---------------------------------------------------------------------+{-+VersionedTextDocumentIdentifier++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#versionedtextdocumentidentifier++ New: An identifier to denote a specific version of a text document.++interface VersionedTextDocumentIdentifier extends TextDocumentIdentifier {+ /**+ * The version number of this document.+ */+ version: number;+-}++type TextDocumentVersion = Int++data VersionedTextDocumentIdentifier =+ VersionedTextDocumentIdentifier+ { _uri :: Uri+ , _version :: TextDocumentVersion+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''VersionedTextDocumentIdentifier+makeFieldsNoPrefix ''VersionedTextDocumentIdentifier++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++TextDocumentEdit+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#new-textdocumentedit++If multiple TextEdits are applied to a text document, all text edits describe+changes made to the initial document version. Execution wise text edits should+applied from the bottom to the top of the text document. Overlapping text edits+are not supported.++export interface TextDocumentEdit {+ /**+ * The text document to change.+ */+ textDocument: VersionedTextDocumentIdentifier;++ /**+ * The edits to be applied.+ */+ edits: TextEdit[];+}++-}++data TextDocumentEdit =+ TextDocumentEdit+ { _textDocument :: VersionedTextDocumentIdentifier+ , _edits :: List TextEdit+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''TextDocumentEdit+makeFieldsNoPrefix ''TextDocumentEdit++-- ---------------------------------------------------------------------+{-+Changed in 3.0+--------------++WorkspaceEdit++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#workspaceedit+++Changed A workspace edit represents changes to many resources managed in the+workspace. The edit should either provide changes or documentChanges. If+documentChanges are present they are preferred over changes if the client can+handle versioned document edits.++export interface WorkspaceEdit {+ /**+ * Holds changes to existing resources.+ */+ changes?: { [uri: string]: TextEdit[]; };++ /**+ * An array of `TextDocumentEdit`s to express changes to specific a specific+ * version of a text document. Whether a client supports versioned document+ * edits is expressed via `WorkspaceClientCapabilities.versionedWorkspaceEdit`.+ */+ documentChanges?: TextDocumentEdit[];+}+-}++type WorkspaceEditMap = H.HashMap Uri (List TextEdit)++data WorkspaceEdit =+ WorkspaceEdit+ { _changes :: Maybe WorkspaceEditMap+ , _documentChanges :: Maybe (List TextDocumentEdit)+ } deriving (Show, Read, Eq)++instance Monoid WorkspaceEdit where+ mempty = WorkspaceEdit Nothing Nothing+ mappend (WorkspaceEdit a b) (WorkspaceEdit c d) = WorkspaceEdit (a <> c) (b <> d)++deriveJSON lspOptions ''WorkspaceEdit+makeFieldsNoPrefix ''WorkspaceEdit++#if __GLASGOW_HASKELL__ >= 804+instance Semigroup WorkspaceEdit where+ (<>) = mappend+#endif++-- ---------------------------------------------------------------------+{-+TextDocumentIdentifier++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textdocumentidentifier++Text documents are identified using a URI. On the protocol level, URIs are+passed as strings. The corresponding JSON structure looks like this:++interface TextDocumentIdentifier {+ /**+ * The text document's URI.+ */+ uri: string;+}+-}+data TextDocumentIdentifier =+ TextDocumentIdentifier+ { _uri :: Uri+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''TextDocumentIdentifier+makeFieldsNoPrefix ''TextDocumentIdentifier++-- ---------------------------------------------------------------------++{-+TextDocumentItem++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textdocumentitem++ New: An item to transfer a text document from the client to the server.++interface TextDocumentItem {+ /**+ * The text document's URI.+ */+ uri: string;++ /**+ * The text document's language identifier.+ */+ languageId: string;++ /**+ * The version number of this document (it will strictly increase after each+ * change, including undo/redo).+ */+ version: number;++ /**+ * The content of the opened text document.+ */+ text: string;+}+-}++data TextDocumentItem =+ TextDocumentItem {+ _uri :: Uri+ , _languageId :: Text+ , _version :: Int+ , _text :: Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''TextDocumentItem+makeFieldsNoPrefix ''TextDocumentItem++-- ---------------------------------------------------------------------+{-+TextDocumentPositionParams++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#textdocumentpositionparams++ Changed: Was TextDocumentPosition in 1.0 with inlined parameters+++interface TextDocumentPositionParams {+ /**+ * The text document.+ */+ textDocument: TextDocumentIdentifier;++ /**+ * The position inside the text document.+ */+ position: Position;+}++-}+data TextDocumentPositionParams =+ TextDocumentPositionParams+ { _textDocument :: TextDocumentIdentifier+ , _position :: Position+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''TextDocumentPositionParams+makeFieldsNoPrefix ''TextDocumentPositionParams++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++DocumentFilter+https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#new-documentfilter++A document filter denotes a document through properties like language, schema or+pattern. Examples are a filter that applies to TypeScript files on disk or a+filter the applies to JSON files with name package.json:++ { language: 'typescript', scheme: 'file' }+ { language: 'json', pattern: '**/package.json' }++export interface DocumentFilter {+ /**+ * A language id, like `typescript`.+ */+ language?: string;++ /**+ * A Uri [scheme](#Uri.scheme), like `file` or `untitled`.+ */+ scheme?: string;++ /**+ * A glob pattern, like `*.{ts,js}`.+ */+ pattern?: string;+}+-}+data DocumentFilter =+ DocumentFilter+ { _language :: Text+ , _scheme :: Text+ , _pattern :: Maybe Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''DocumentFilter+makeFieldsNoPrefix ''DocumentFilter++{-+A document selector is the combination of one or many document filters.++export type DocumentSelector = DocumentFilter[];+-}+type DocumentSelector = List DocumentFilter++-- =====================================================================+-- ACTUAL PROTOCOL -----------------------------------------------------+-- =====================================================================++-- ---------------------------------------------------------------------+-- Initialize Request+-- ---------------------------------------------------------------------+{-+Initialize Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#initialize-request++The initialize request is sent as the first request from the client to the server.++Request++ method: 'initialize'+ params: InitializeParams defined as follows:++interface InitializeParams {+ /**+ * The process Id of the parent process that started+ * the server. Is null if the process has not been started by another process.+ * If the parent process is not alive then the server should exit (see exit notification) its process.+ */+ processId: number | null;++ /**+ * The rootPath of the workspace. Is null+ * if no folder is open.+ *+ * @deprecated in favour of rootUri.+ */+ rootPath?: string | null;++ /**+ * The rootUri of the workspace. Is null if no+ * folder is open. If both `rootPath` and `rootUri` are set+ * `rootUri` wins.+ */+ rootUri: DocumentUri | null;++ /**+ * User provided initialization options.+ */+ initializationOptions?: any;++ /**+ * The capabilities provided by the client (editor or tool)+ */+ capabilities: ClientCapabilities;++ /**+ * The initial trace setting. If omitted trace is disabled ('off').+ */+ trace?: 'off' | 'messages' | 'verbose';+}+-}++data Trace = TraceOff | TraceMessages | TraceVerbose+ deriving (Show, Read, Eq)++instance A.ToJSON Trace where+ toJSON TraceOff = A.String (T.pack "off")+ toJSON TraceMessages = A.String (T.pack "messages")+ toJSON TraceVerbose = A.String (T.pack "verbose")++instance A.FromJSON Trace where+ parseJSON (A.String s) = case T.unpack s of+ "off" -> return TraceOff+ "messages" -> return TraceMessages+ "verbose" -> return TraceVerbose+ _ -> mempty+ parseJSON _ = mempty++data InitializeParams =+ InitializeParams {+ _processId :: Maybe Int+ , _rootPath :: Maybe Text -- ^ Deprecated in favour of _rootUri+ , _rootUri :: Maybe Uri+ , _initializationOptions :: Maybe A.Value+ , _capabilities :: ClientCapabilities+ , _trace :: Maybe Trace+ } deriving (Show, Read, Eq)+++deriveJSON lspOptions ''InitializeParams+makeFieldsNoPrefix ''InitializeParams++-- ---------------------------------------------------------------------+-- Initialize Response+-- ---------------------------------------------------------------------+{-++ error.data:++interface InitializeError {+ /**+ * Indicates whether the client should retry to send the+ * initilize request after showing the message provided+ * in the ResponseError.+ */+ retry: boolean;+-+-}+data InitializeError =+ InitializeError+ { _retry :: Bool+ } deriving (Read, Show, Eq)++deriveJSON lspOptions ''InitializeError+makeFieldsNoPrefix ''InitializeError++-- ---------------------------------------------------------------------+{-+The server can signal the following capabilities:++/**+ * Defines how the host (editor) should sync document changes to the language server.+ */+enum TextDocumentSyncKind {+ /**+ * Documents should not be synced at all.+ */+ None = 0,+ /**+ * Documents are synced by always sending the full content of the document.+ */+ Full = 1,+ /**+ * Documents are synced by sending the full content on open. After that only incremental+ * updates to the document are sent.+ */+ Incremental = 2+}+-}++-- ^ Note: Omitting this parameter from the capabilities is effectively a fourth+-- state, where DidSave events are generated without sending document contents.+data TextDocumentSyncKind = TdSyncNone+ | TdSyncFull+ | TdSyncIncremental+ deriving (Read,Eq,Show)++instance A.ToJSON TextDocumentSyncKind where+ toJSON TdSyncNone = A.Number 0+ toJSON TdSyncFull = A.Number 1+ toJSON TdSyncIncremental = A.Number 2++instance A.FromJSON TextDocumentSyncKind where+ parseJSON (A.Number 0) = pure TdSyncNone+ parseJSON (A.Number 1) = pure TdSyncFull+ parseJSON (A.Number 2) = pure TdSyncIncremental+ parseJSON _ = mempty++-- ---------------------------------------------------------------------+{-+/**+ * Completion options.+ */+interface CompletionOptions {+ /**+ * The server provides support to resolve additional information for a completion item.+ */+ resolveProvider?: boolean;++ /**+ * The characters that trigger completion automatically.+ */+ triggerCharacters?: string[];+}+-}++data CompletionOptions =+ CompletionOptions+ { _resolveProvider :: Maybe Bool+ , _triggerCharacters :: Maybe [String]+ } deriving (Read,Show,Eq)++deriveJSON lspOptions {omitNothingFields = True } ''CompletionOptions+makeFieldsNoPrefix ''CompletionOptions++-- ---------------------------------------------------------------------+{-+/**+ * Signature help options.+ */+interface SignatureHelpOptions {+ /**+ * The characters that trigger signature help automatically.+ */+ triggerCharacters?: string[];+-}++data SignatureHelpOptions =+ SignatureHelpOptions+ { _triggerCharacters :: Maybe [String]+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''SignatureHelpOptions+makeFieldsNoPrefix ''SignatureHelpOptions++-- ---------------------------------------------------------------------+{-+/**+ * Code Lens options.+ */+interface CodeLensOptions {+ /**+ * Code lens has a resolve provider as well.+ */+ resolveProvider?: boolean;+}+-}++data CodeLensOptions =+ CodeLensOptions+ { _resolveProvider :: Maybe Bool+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''CodeLensOptions+makeFieldsNoPrefix ''CodeLensOptions++-- ---------------------------------------------------------------------+{-+/**+ * Format document on type options+ */+interface DocumentOnTypeFormattingOptions {+ /**+ * A character on which formatting should be triggered, like `}`.+ */+ firstTriggerCharacter: string;+ /**+ * More trigger characters.+ */+ moreTriggerCharacter?: string[]+}+-}+data DocumentOnTypeFormattingOptions =+ DocumentOnTypeFormattingOptions+ { _firstTriggerCharacter :: Text+ , _moreTriggerCharacter :: Maybe [String]+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''DocumentOnTypeFormattingOptions+makeFieldsNoPrefix ''DocumentOnTypeFormattingOptions++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++/**+ * Document link options+ */+export interface DocumentLinkOptions {+ /**+ * Document links have a resolve provider as well.+ */+ resolveProvider?: boolean;+}+-}++data DocumentLinkOptions =+ DocumentLinkOptions+ { -- |Document links have a resolve provider as well.+ _resolveProvider :: Maybe Bool+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''DocumentLinkOptions+makeFieldsNoPrefix ''DocumentLinkOptions++-- ---------------------------------------------------------------------++{-+New in 3.0+-----------++/**+ * Execute command options.+ */+export interface ExecuteCommandOptions {+ /**+ * The commands to be executed on the server+ */+ commands: string[]+}+-}++data ExecuteCommandOptions =+ ExecuteCommandOptions+ { -- | The commands to be executed on the server+ _commands :: List Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''ExecuteCommandOptions+makeFieldsNoPrefix ''ExecuteCommandOptions++-- ---------------------------------------------------------------------+{-+New in 3.0+----------+/**+ * Save options.+ */+export interface SaveOptions {+ /**+ * The client is supposed to include the content on save.+ */+ includeText?: boolean;+}+-}+data SaveOptions =+ SaveOptions+ { -- |The client is supposed to include the content on save.+ _includeText :: Maybe Bool+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''SaveOptions+makeFieldsNoPrefix ''SaveOptions++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++export interface TextDocumentSyncOptions {+ /**+ * Open and close notifications are sent to the server.+ */+ openClose?: boolean;+ /**+ * Change notificatins are sent to the server. See TextDocumentSyncKind.None, TextDocumentSyncKind.Full+ * and TextDocumentSyncKindIncremental.+ */+ change?: number;+ /**+ * Will save notifications are sent to the server.+ */+ willSave?: boolean;+ /**+ * Will save wait until requests are sent to the server.+ */+ willSaveWaitUntil?: boolean;+ /**+ * Save notifications are sent to the server.+ */+ save?: SaveOptions;+}+-}++data TextDocumentSyncOptions =+ TextDocumentSyncOptions+ { -- | Open and close notifications are sent to the server.+ _openClose :: Maybe Bool++ -- | Change notificatins are sent to the server. See+ -- TextDocumentSyncKind.None, TextDocumentSyncKind.Full and+ -- TextDocumentSyncKindIncremental.+ , _change :: Maybe TextDocumentSyncKind++ -- | Will save notifications are sent to the server.+ , _willSave :: Maybe Bool++ -- | Will save wait until requests are sent to the server.+ , _willSaveWaitUntil :: Maybe Bool++ -- |Save notifications are sent to the server.+ , _save :: Maybe SaveOptions+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''TextDocumentSyncOptions+makeFieldsNoPrefix ''TextDocumentSyncOptions++-- ---------------------------------------------------------------------+{-++Extended in 3.0+---------------++interface ServerCapabilities {+ /**+ * Defines how text documents are synced. Is either a detailed structure defining each notification or+ * for backwards compatibility the TextDocumentSyncKind number.+ */+ textDocumentSync?: TextDocumentSyncOptions | number;+ /**+ * The server provides hover support.+ */+ hoverProvider?: boolean;+ /**+ * The server provides completion support.+ */+ completionProvider?: CompletionOptions;+ /**+ * The server provides signature help support.+ */+ signatureHelpProvider?: SignatureHelpOptions;+ /**+ * The server provides goto definition support.+ */+ definitionProvider?: boolean;+ /**+ * The server provides find references support.+ */+ referencesProvider?: boolean;+ /**+ * The server provides document highlight support.+ */+ documentHighlightProvider?: boolean;+ /**+ * The server provides document symbol support.+ */+ documentSymbolProvider?: boolean;+ /**+ * The server provides workspace symbol support.+ */+ workspaceSymbolProvider?: boolean;+ /**+ * The server provides code actions.+ */+ codeActionProvider?: boolean;+ /**+ * The server provides code lens.+ */+ codeLensProvider?: CodeLensOptions;+ /**+ * The server provides document formatting.+ */+ documentFormattingProvider?: boolean;+ /**+ * The server provides document range formatting.+ */+ documentRangeFormattingProvider?: boolean;+ /**+ * The server provides document formatting on typing.+ */+ documentOnTypeFormattingProvider?: DocumentOnTypeFormattingOptions;+ /**+ * The server provides rename support.+ */+ renameProvider?: boolean;+ /**+ * The server provides document link support.+ */+ documentLinkProvider?: DocumentLinkOptions;+ /**+ * The server provides execute command support.+ */+ executeCommandProvider?: ExecuteCommandOptions;+ /**+ * Experimental server capabilities.+ */+ experimental?: any;+}+-}++data InitializeResponseCapabilitiesInner =+ InitializeResponseCapabilitiesInner+ { _textDocumentSync :: Maybe TextDocumentSyncOptions+ , _hoverProvider :: Maybe Bool+ , _completionProvider :: Maybe CompletionOptions+ , _signatureHelpProvider :: Maybe SignatureHelpOptions+ , _definitionProvider :: Maybe Bool+ , _referencesProvider :: Maybe Bool+ , _documentHighlightProvider :: Maybe Bool+ , _documentSymbolProvider :: Maybe Bool+ , _workspaceSymbolProvider :: Maybe Bool+ , _codeActionProvider :: Maybe Bool+ , _codeLensProvider :: Maybe CodeLensOptions+ , _documentFormattingProvider :: Maybe Bool+ , _documentRangeFormattingProvider :: Maybe Bool+ , _documentOnTypeFormattingProvider :: Maybe DocumentOnTypeFormattingOptions+ , _renameProvider :: Maybe Bool+ -- Following are new in 3.0+ , _documentLinkProvider :: Maybe DocumentLinkOptions+ , _executeCommandProvider :: Maybe ExecuteCommandOptions+ , _experimental :: Maybe A.Value+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''InitializeResponseCapabilitiesInner+makeFieldsNoPrefix ''InitializeResponseCapabilitiesInner+++-- ---------------------------------------------------------------------+-- |+-- Information about the capabilities of a language server+--+data InitializeResponseCapabilities =+ InitializeResponseCapabilities {+ _capabilities :: InitializeResponseCapabilitiesInner+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''InitializeResponseCapabilities+makeFieldsNoPrefix ''InitializeResponseCapabilities++-- ---------------------------------------------------------------------++type InitializeResponse = ResponseMessage InitializeResponseCapabilities++type InitializeRequest = RequestMessage ClientMethod InitializeParams InitializeResponseCapabilities++{-+ error.code:++/**+ * Known error codes for an `InitializeError`;+ */+export namespace InitializeError {+ /**+ * If the protocol version provided by the client can't be handled by the server.+ * @deprecated This initialize error got replaced by client capabilities. There is+ * no version handshake in version 3.0x+ */+ export const unknownProtocolVersion: number = 1;+}++ error.data:++interface InitializeError {+ /**+ * Indicates whether the client execute the following retry logic:+ * (1) show the message provided by the ResponseError to the user+ * (2) user selects retry or cancel+ * (3) if user selected retry the initialize method is sent again.+ */+ retry: boolean;+}+-}++-- ---------------------------------------------------------------------++{-+New in 3.0+----------+Initialized Notification++The initialized notification is sent from the client to the server after the+client is fully initialized and is able to listen to arbritary requests and+notifications sent from the server.++Notification:++ method: 'initialized'+ params: void++-}++data InitializedParams =+ InitializedParams+ {+ } deriving (Show, Read, Eq)++instance A.FromJSON InitializedParams where+ parseJSON (A.Object _) = pure InitializedParams+ parseJSON _ = mempty++instance A.ToJSON InitializedParams where+ toJSON InitializedParams = A.Object mempty++type InitializedNotification = NotificationMessage ClientMethod (Maybe InitializedParams)++-- ---------------------------------------------------------------------+{-+Shutdown Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#shutdown-request++The shutdown request is sent from the client to the server. It asks the server+to shut down, but to not exit (otherwise the response might not be delivered+correctly to the client). There is a separate exit notification that asks the+server to exit.++Request++ method: 'shutdown'+ params: undefined++Response++ result: undefined+ error: code and message set in case an exception happens during shutdown request.+++-}++type ShutdownRequest = RequestMessage ClientMethod (Maybe A.Value) Text+type ShutdownResponse = ResponseMessage Text++-- ---------------------------------------------------------------------+{-+Exit Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#exit-notification++A notification to ask the server to exit its process.++Notification++ method: 'exit'++-}++-- |+-- Notification from the server to actually exit now, after shutdown acked+--+data ExitParams =+ ExitParams+ {+ } deriving (Show, Read, Eq)++deriveJSON defaultOptions ''ExitParams++type ExitNotification = NotificationMessage ClientMethod (Maybe ExitParams)++-- ---------------------------------------------------------------------+{-+ShowMessage Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#showmessage-notification++The show message notification is sent from a server to a client to ask the+client to display a particular message in the user interface.++Notification:++ method: 'window/showMessage'+ params: ShowMessageParams defined as follows:++interface ShowMessageParams {+ /**+ * The message type. See {@link MessageType}.+ */+ type: number;++ /**+ * The actual message.+ */+ message: string;+}++Where the type is defined as follows:++enum MessageType {+ /**+ * An error message.+ */+ Error = 1,+ /**+ * A warning message.+ */+ Warning = 2,+ /**+ * An information message.+ */+ Info = 3,+ /**+ * A log message.+ */+ Log = 4+}+-}+data MessageType = MtError -- ^ Error = 1,+ | MtWarning -- ^ Warning = 2,+ | MtInfo -- ^ Info = 3,+ | MtLog -- ^ Log = 4+ deriving (Eq,Ord,Show,Read,Enum)++instance A.ToJSON MessageType where+ toJSON MtError = A.Number 1+ toJSON MtWarning = A.Number 2+ toJSON MtInfo = A.Number 3+ toJSON MtLog = A.Number 4++instance A.FromJSON MessageType where+ parseJSON (A.Number 1) = pure MtError+ parseJSON (A.Number 2) = pure MtWarning+ parseJSON (A.Number 3) = pure MtInfo+ parseJSON (A.Number 4) = pure MtLog+ parseJSON _ = mempty++-- ---------------------------------------+++data ShowMessageParams =+ ShowMessageParams {+ _xtype :: MessageType+ , _message :: Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''ShowMessageParams+makeFieldsNoPrefix ''ShowMessageParams++type ShowMessageNotification = NotificationMessage ServerMethod ShowMessageParams++-- ---------------------------------------------------------------------+{-+ShowMessage Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#showmessage-request++ New: The show message request is sent from a server to a client to ask the+ client to display a particular message in the user interface. In addition to+ the show message notification the request allows to pass actions and to wait+ for an answer from the client.++Request:++ method: 'window/showMessageRequest'+ params: ShowMessageRequestParams defined as follows:++Response:++ result: the selected MessageActionItem+ error: code and message set in case an exception happens during showing a message.++interface ShowMessageRequestParams {+ /**+ * The message type. See {@link MessageType}+ */+ type: number;++ /**+ * The actual message+ */+ message: string;++ /**+ * The message action items to present.+ */+ actions?: MessageActionItem[];+}++Where the MessageActionItem is defined as follows:++interface MessageActionItem {+ /**+ * A short title like 'Retry', 'Open Log' etc.+ */+ title: string;+}+-}++data MessageActionItem =+ MessageActionItem+ { _title :: Text+ } deriving (Show,Read,Eq)++deriveJSON lspOptions ''MessageActionItem+makeFieldsNoPrefix ''MessageActionItem+++data ShowMessageRequestParams =+ ShowMessageRequestParams+ { _xtype :: MessageType+ , _message :: Text+ , _actions :: Maybe [MessageActionItem]+ } deriving (Show,Read,Eq)++deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''ShowMessageRequestParams+makeFieldsNoPrefix ''ShowMessageRequestParams++type ShowMessageRequest = RequestMessage ServerMethod ShowMessageRequestParams Text+type ShowMessageResponse = ResponseMessage Text++-- ---------------------------------------------------------------------+{-+LogMessage Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#logmessage-notification++The log message notification is sent from the server to the client to ask the+client to log a particular message.++Notification:++ method: 'window/logMessage'+ params: LogMessageParams defined as follows:++interface LogMessageParams {+ /**+ * The message type. See {@link MessageType}+ */+ type: number;++ /**+ * The actual message+ */+ message: string;+}++Where type is defined as above.+-}++data LogMessageParams =+ LogMessageParams {+ _xtype :: MessageType+ , _message :: Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''LogMessageParams+makeFieldsNoPrefix ''LogMessageParams+++type LogMessageNotification = NotificationMessage ServerMethod LogMessageParams++-- ---------------------------------------------------------------------+{-+Telemetry Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#telemetry-notification++ New: The telemetry notification is sent from the server to the client to ask+ the client to log a telemetry event.++Notification:++ method: 'telemetry/event'+ params: 'any'+-}+++type TelemetryNotification = NotificationMessage ServerMethod A.Value++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++Register Capability++The client/registerCapability request is sent from the server to the client to+register for a new capability on the client side. Not all clients need to+support dynamic capability registration. A client opts in via the+ClientCapabilities.dynamicRegistration property.++Request:++ method: 'client/registerCapability'+ params: RegistrationParams++Where RegistrationParams are defined as follows:++/**+ * General paramters to to regsiter for a capability.+ */+export interface Registration {+ /**+ * The id used to register the request. The id can be used to deregister+ * the request again.+ */+ id: string;++ /**+ * The method / capability to register for.+ */+ method: string;++ /**+ * Options necessary for the registration.+ */+ registerOptions?: any;+}++export interface RegistrationParams {+ registrations: Registration[];+}+-}++data Registration =+ Registration+ { -- |The id used to register the request. The id can be used to deregister+ -- the request again.+ _id :: Text++ -- | The method / capability to register for.+ , _method :: ClientMethod++ -- | Options necessary for the registration.+ , _registerOptions :: Maybe A.Value+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''Registration+makeFieldsNoPrefix ''Registration++data RegistrationParams =+ RegistrationParams+ { _registrations :: List Registration+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''RegistrationParams+makeFieldsNoPrefix ''RegistrationParams++-- |Note: originates at the server+type RegisterCapabilityRequest = RequestMessage ServerMethod RegistrationParams ()++-- -------------------------------------++{-+Since most of the registration options require to specify a document selector+there is a base interface that can be used.++export interface TextDocumentRegistrationOptions {+ /**+ * A document selector to identify the scope of the registration. If set to null+ * the document selector provided on the client side will be used.+ */+ documentSelector: DocumentSelector | null;+}+-}++data TextDocumentRegistrationOptions =+ TextDocumentRegistrationOptions+ { _documentSelector :: Maybe DocumentSelector+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''TextDocumentRegistrationOptions+makeFieldsNoPrefix ''TextDocumentRegistrationOptions++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++Unregister Capability++The client/unregisterCapability request is sent from the server to the client to+unregister a previously register capability.++Request:++ method: 'client/unregisterCapability'+ params: UnregistrationParams++Where UnregistrationParams are defined as follows:++/**+ * General parameters to unregister a capability.+ */+export interface Unregistration {+ /**+ * The id used to unregister the request or notification. Usually an id+ * provided during the register request.+ */+ id: string;++ /**+ * The method / capability to unregister for.+ */+ method: string;+}++export interface UnregistrationParams {+ unregisterations: Unregistration[];+}+-}++data Unregistration =+ Unregistration+ { -- | The id used to unregister the request or notification. Usually an id+ -- provided during the register request.+ _id :: Text++ -- |The method / capability to unregister for.+ , _method :: Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''Unregistration+makeFieldsNoPrefix ''Unregistration++data UnregistrationParams =+ UnregistrationParams+ { _unregistrations :: List Unregistration+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''UnregistrationParams+makeFieldsNoPrefix ''UnregistrationParams++type UnregisterCapabilityRequest = RequestMessage ServerMethod UnregistrationParams ()++-- ---------------------------------------------------------------------+{-+DidChangeConfiguration Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangeconfiguration-notification++A notification sent from the client to the server to signal the change of+configuration settings.++Notification:++ method: 'workspace/didChangeConfiguration',+ params: DidChangeConfigurationParams defined as follows:++interface DidChangeConfigurationParams {+ /**+ * The actual changed settings+ */+ settings: any;+}+-}++data DidChangeConfigurationParams =+ DidChangeConfigurationParams {+ _settings :: A.Value+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''DidChangeConfigurationParams+makeFieldsNoPrefix ''DidChangeConfigurationParams+++type DidChangeConfigurationNotification = NotificationMessage ClientMethod DidChangeConfigurationParams++-- ---------------------------------------------------------------------+{-+DidOpenTextDocument Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didopentextdocument-notification++The document open notification is sent from the client to the server to signal+newly opened text documents. The document's truth is now managed by the client+and the server must not try to read the document's truth using the document's+uri.++Notification:++ method: 'textDocument/didOpen'+ params: DidOpenTextDocumentParams defined as follows:++interface DidOpenTextDocumentParams {+ /**+ * The document that was opened.+ */+ textDocument: TextDocumentItem;+}++Registration Options: TextDocumentRegistrationOptions+-}++data DidOpenTextDocumentParams =+ DidOpenTextDocumentParams {+ _textDocument :: TextDocumentItem+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''DidOpenTextDocumentParams+makeFieldsNoPrefix ''DidOpenTextDocumentParams++type DidOpenTextDocumentNotification = NotificationMessage ClientMethod DidOpenTextDocumentParams++-- ---------------------------------------------------------------------+{-+DidChangeTextDocument Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangetextdocument-notification++ Changed: The document change notification is sent from the client to the+ server to signal changes to a text document. In 2.0 the shape of the params+ has changed to include proper version numbers and language ids.++Notification:++ method: 'textDocument/didChange'+ params: DidChangeTextDocumentParams defined as follows:++interface DidChangeTextDocumentParams {+ /**+ * The document that did change. The version number points+ * to the version after all provided content changes have+ * been applied.+ */+ textDocument: VersionedTextDocumentIdentifier;++ /**+ * The actual content changes.+ */+ contentChanges: TextDocumentContentChangeEvent[];+}++/**+ * An event describing a change to a text document. If range and rangeLength are omitted+ * the new text is considered to be the full content of the document.+ */+interface TextDocumentContentChangeEvent {+ /**+ * The range of the document that changed.+ */+ range?: Range;++ /**+ * The length of the range that got replaced.+ */+ rangeLength?: number;++ /**+ * The new text of the document.+ */+ text: string;+}+-}+data TextDocumentContentChangeEvent =+ TextDocumentContentChangeEvent+ { _range :: Maybe Range+ , _rangeLength :: Maybe Int+ , _text :: Text+ } deriving (Read,Show,Eq)++deriveJSON lspOptions { omitNothingFields = True } ''TextDocumentContentChangeEvent+makeFieldsNoPrefix ''TextDocumentContentChangeEvent++-- -------------------------------------++data DidChangeTextDocumentParams =+ DidChangeTextDocumentParams+ { _textDocument :: VersionedTextDocumentIdentifier+ , _contentChanges :: List TextDocumentContentChangeEvent+ } deriving (Show,Read,Eq)++deriveJSON lspOptions ''DidChangeTextDocumentParams+makeFieldsNoPrefix ''DidChangeTextDocumentParams++type DidChangeTextDocumentNotification = NotificationMessage ClientMethod DidChangeTextDocumentParams+{-+New in 3.0+----------++Registration Options: TextDocumentChangeRegistrationOptions defined as follows:++/**+ * Descibe options to be used when registered for text document change events.+ */+export interface TextDocumentChangeRegistrationOptions extends TextDocumentRegistrationOptions {+ /**+ * How documents are synced to the server. See TextDocumentSyncKind.Full+ * and TextDocumentSyncKindIncremental.+ */+ syncKind: number;+}+-}++data TextDocumentChangeRegistrationOptions =+ TextDocumentChangeRegistrationOptions+ { _documentSelector :: Maybe DocumentSelector+ , _syncKind :: TextDocumentSyncKind+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''TextDocumentChangeRegistrationOptions+makeFieldsNoPrefix ''TextDocumentChangeRegistrationOptions++-- ---------------------------------------------------------------------+{-++New in 3.0+----------++WillSaveTextDocument Notification++The document will save notification is sent from the client to the server before+the document is actually saved.++Notification:++ method: 'textDocument/willSave'+ params: WillSaveTextDocumentParams defined as follows:++/**+ * The parameters send in a will save text document notification.+ */+export interface WillSaveTextDocumentParams {+ /**+ * The document that will be saved.+ */+ textDocument: TextDocumentIdentifier;++ /**+ * The 'TextDocumentSaveReason'.+ */+ reason: number;+}++/**+ * Represents reasons why a text document is saved.+ */+export namespace TextDocumentSaveReason {++ /**+ * Manually triggered, e.g. by the user pressing save, by starting debugging,+ * or by an API call.+ */+ export const Manual = 1;++ /**+ * Automatic after a delay.+ */+ export const AfterDelay = 2;++ /**+ * When the editor lost focus.+ */+ export const FocusOut = 3;+}+Registration Options: TextDocumentRegistrationOptions+-}++data TextDocumentSaveReason+ = SaveManual+ -- ^ Manually triggered, e.g. by the user pressing save, by starting+ -- debugging, or by an API call.+ | SaveAfterDelay -- ^ Automatic after a delay+ | SaveFocusOut -- ^ When the editor lost focus+ deriving (Show, Read, Eq)++instance A.ToJSON TextDocumentSaveReason where+ toJSON SaveManual = A.Number 1+ toJSON SaveAfterDelay = A.Number 2+ toJSON SaveFocusOut = A.Number 3++instance A.FromJSON TextDocumentSaveReason where+ parseJSON (A.Number 1) = pure SaveManual+ parseJSON (A.Number 2) = pure SaveAfterDelay+ parseJSON (A.Number 3) = pure SaveFocusOut+ parseJSON _ = mempty++data WillSaveTextDocumentParams =+ WillSaveTextDocumentParams+ { _textDocument :: TextDocumentIdentifier+ , _reason :: TextDocumentSaveReason+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''WillSaveTextDocumentParams+makeFieldsNoPrefix ''WillSaveTextDocumentParams++type WillSaveTextDocumentNotification = NotificationMessage ClientMethod WillSaveTextDocumentParams++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++WillSaveWaitUntilTextDocument Request++The document will save request is sent from the client to the server before the+document is actually saved. The request can return an array of TextEdits which+will be applied to the text document before it is saved. Please note that+clients might drop results if computing the text edits took too long or if a+server constantly fails on this request. This is done to keep the save fast and+reliable.++Request:++ method: 'textDocument/willSaveWaitUntil'+ params: WillSaveTextDocumentParams++Response:++ result: TextEdit[]+ error: code and message set in case an exception happens during the willSaveWaitUntil request.++Registration Options: TextDocumentRegistrationOptions+-}++type WillSaveWaitUntilTextDocumentRequest = RequestMessage ClientMethod WillSaveTextDocumentParams (List TextEdit)+type WillSaveWaitUntilTextDocumentResponse = ResponseMessage (List TextEdit)++-- ---------------------------------------------------------------------+{-+DidSaveTextDocument Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didsavetextdocument-notification++ New: The document save notification is sent from the client to the server+ when the document was saved in the client.++ method: 'textDocument/didSave'+ params: DidSaveTextDocumentParams defined as follows:++interface DidSaveTextDocumentParams {+ /**+ * The document that was saved.+ */+ textDocument: TextDocumentIdentifier;+}+-}+data DidSaveTextDocumentParams =+ DidSaveTextDocumentParams+ { _textDocument :: TextDocumentIdentifier+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''DidSaveTextDocumentParams+makeFieldsNoPrefix ''DidSaveTextDocumentParams++type DidSaveTextDocumentNotification = NotificationMessage ClientMethod DidSaveTextDocumentParams++++-- ---------------------------------------------------------------------+{-+DidCloseTextDocument Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didclosetextdocument-notification++The document close notification is sent from the client to the server when the+document got closed in the client. The document's truth now exists where the+document's uri points to (e.g. if the document's uri is a file uri the truth now+exists on disk).++ Changed: In 2.0 the params are of type DidCloseTextDocumentParams which+ contains a reference to a text document.++Notification:++ method: 'textDocument/didClose'+ params: DidCloseTextDocumentParams defined as follows:++interface DidCloseTextDocumentParams {+ /**+ * The document that was closed.+ */+ textDocument: TextDocumentIdentifier;+}+-}+data DidCloseTextDocumentParams =+ DidCloseTextDocumentParams+ { _textDocument :: TextDocumentIdentifier+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''DidCloseTextDocumentParams+makeFieldsNoPrefix ''DidCloseTextDocumentParams+++type DidCloseTextDocumentNotification = NotificationMessage ClientMethod DidCloseTextDocumentParams++-- ---------------------------------------------------------------------+{-+DidChangeWatchedFiles Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#didchangewatchedfiles-notification++The watched files notification is sent from the client to the server when the+client detects changes to files watched by the language client.++Notification:++ method: 'workspace/didChangeWatchedFiles'+ params: DidChangeWatchedFilesParams defined as follows:++interface DidChangeWatchedFilesParams {+ /**+ * The actual file events.+ */+ changes: FileEvent[];+}++Where FileEvents are described as follows:++/**+ * The file event type.+ */+enum FileChangeType {+ /**+ * The file got created.+ */+ Created = 1,+ /**+ * The file got changed.+ */+ Changed = 2,+ /**+ * The file got deleted.+ */+ Deleted = 3+}++/**+ * An event describing a file change.+ */+interface FileEvent {+ /**+ * The file's URI.+ */+ uri: string;+ /**+ * The change type.+ */+ type: number;+-}+data FileChangeType = FcCreated+ | FcChanged+ | FcDeleted+ deriving (Read,Show,Eq)++instance A.ToJSON FileChangeType where+ toJSON FcCreated = A.Number 1+ toJSON FcChanged = A.Number 2+ toJSON FcDeleted = A.Number 3++instance A.FromJSON FileChangeType where+ parseJSON (A.Number 1) = pure FcCreated+ parseJSON (A.Number 2) = pure FcChanged+ parseJSON (A.Number 3) = pure FcDeleted+ parseJSON _ = mempty+++-- -------------------------------------++data FileEvent =+ FileEvent+ { _uri :: Uri+ , _xtype :: FileChangeType+ } deriving (Read,Show,Eq)++deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''FileEvent+makeFieldsNoPrefix ''FileEvent++data DidChangeWatchedFilesParams =+ DidChangeWatchedFilesParams+ { _changes :: List FileEvent+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''DidChangeWatchedFilesParams+makeFieldsNoPrefix ''DidChangeWatchedFilesParams+++type DidChangeWatchedFilesNotification = NotificationMessage ClientMethod DidChangeWatchedFilesParams++-- ---------------------------------------------------------------------+{-+PublishDiagnostics Notification++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#publishdiagnostics-notification++Diagnostics notification are sent from the server to the client to signal+results of validation runs.++Notification++ method: 'textDocument/publishDiagnostics'+ params: PublishDiagnosticsParams defined as follows:++interface PublishDiagnosticsParams {+ /**+ * The URI for which diagnostic information is reported.+ */+ uri: string;++ /**+ * An array of diagnostic information items.+ */+ diagnostics: Diagnostic[];+}+-}++data PublishDiagnosticsParams =+ PublishDiagnosticsParams+ { _uri :: Uri+ , _diagnostics :: List Diagnostic+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''PublishDiagnosticsParams+makeFieldsNoPrefix ''PublishDiagnosticsParams+++type PublishDiagnosticsNotification = NotificationMessage ServerMethod PublishDiagnosticsParams++-- ---------------------------------------------------------------------+{-+Completion Request++The Completion request is sent from the client to the server to compute+completion items at a given cursor position. Completion items are presented in+the IntelliSense user interface. If computing full completion items is+expensive, servers can additionally provide a handler for the completion item+resolve request ('completionItem/resolve'). This request is sent when a+completion item is selected in the user interface. A typically use case is for+example: the 'textDocument/completion' request doesn't fill in the documentation+property for returned completion items since it is expensive to compute. When+the item is selected in the user interface then a 'completionItem/resolve'+request is sent with the selected completion item as a param. The returned+completion item should have the documentation property filled in.++ Changed: In 2.0 the request uses TextDocumentPositionParams with a proper+ textDocument and position property. In 1.0 the uri of the referenced text+ document was inlined into the params object.++Request++ method: 'textDocument/completion'+ params: TextDocumentPositionParams+-}++-- -------------------------------------++{-++Response++ result: CompletionItem[] | CompletionList++/**+ * Represents a collection of [completion items](#CompletionItem) to be presented+ * in the editor.+ */+interface CompletionList {+ /**+ * This list it not complete. Further typing should result in recomputing+ * this list.+ */+ isIncomplete: boolean;+ /**+ * The completion items.+ */+ items: CompletionItem[];+}+++New in 3.0 : InsertTextFormat++/**+ * Defines whether the insert text in a completion item should be interpreted as+ * plain text or a snippet.+ */+namespace InsertTextFormat {+ /**+ * The primary text to be inserted is treated as a plain string.+ */+ export const PlainText = 1;++ /**+ * The primary text to be inserted is treated as a snippet.+ *+ * A snippet can define tab stops and placeholders with `$1`, `$2`+ * and `${3:foo}`. `$0` defines the final tab stop, it defaults to+ * the end of the snippet. Placeholders with equal identifiers are linked,+ * that is typing in one will update others too.+ *+ * See also: https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md+ */+ export const Snippet = 2;+}++++interface CompletionItem {+ /**+ * The label of this completion item. By default+ * also the text that is inserted when selecting+ * this completion.+ */+ label: string;+ /**+ * The kind of this completion item. Based of the kind+ * an icon is chosen by the editor.+ */+ kind?: number;+ /**+ * A human-readable string with additional information+ * about this item, like type or symbol information.+ */+ detail?: string;+ /**+ * A human-readable string that represents a doc-comment.+ */+ documentation?: string;+ /**+ * A string that shoud be used when comparing this item+ * with other items. When `falsy` the label is used.+ */+ sortText?: string;+ /**+ * A string that should be used when filtering a set of+ * completion items. When `falsy` the label is used.+ */+ filterText?: string;+ /**+ * A string that should be inserted a document when selecting+ * this completion. When `falsy` the label is used.+ */+ insertText?: string;+ -- Following field is new in 3.0+ /**+ * The format of the insert text. The format applies to both the `insertText` property+ * and the `newText` property of a provided `textEdit`.+ */+ insertTextFormat?: InsertTextFormat;+ /**+ * An edit which is applied to a document when selecting this completion. When an edit is provided the value of+ * `insertText` is ignored.+ *+ * *Note:* The range of the edit must be a single line range and it must contain the position at which completion+ * has been requested.+ */++ textEdit?: TextEdit;++ -- Following field is new in 3.0+ /**+ * An optional array of additional text edits that are applied when+ * selecting this completion. Edits must not overlap with the main edit+ * nor with themselves.+ */+ additionalTextEdits?: TextEdit[];+ -- Following field is new in 3.0+ /**+ * An optional command that is executed *after* inserting this completion. *Note* that+ * additional modifications to the current document should be described with the+ * additionalTextEdits-property.+ */++ command?: Command;+ /**+ * An data entry field that is preserved on a completion item between+ * a completion and a completion resolve request.+ */++ data?: any+}++Where CompletionItemKind is defined as follows:++/**+ * The kind of a completion entry.+ */+enum CompletionItemKind {+ Text = 1,+ Method = 2,+ Function = 3,+ Constructor = 4,+ Field = 5,+ Variable = 6,+ Class = 7,+ Interface = 8,+ Module = 9,+ Property = 10,+ Unit = 11,+ Value = 12,+ Enum = 13,+ Keyword = 14,+ Snippet = 15,+ Color = 16,+ File = 17,+ Reference = 18+}++ error: code and message set in case an exception happens during the completion request.+-}++-- -------------------------------------++data InsertTextFormat+ = PlainText -- ^The primary text to be inserted is treated as a plain string.+ | Snippet+ -- ^ The primary text to be inserted is treated as a snippet.+ --+ -- A snippet can define tab stops and placeholders with `$1`, `$2`+ -- and `${3:foo}`. `$0` defines the final tab stop, it defaults to+ -- the end of the snippet. Placeholders with equal identifiers are linked,+ -- that is typing in one will update others too.+ --+ -- See also: https://github.com/Microsoft/vscode/blob/master/src/vs/editor/contrib/snippet/common/snippet.md+ deriving (Show, Read, Eq)++instance A.ToJSON InsertTextFormat where+ toJSON PlainText = A.Number 1+ toJSON Snippet = A.Number 2++instance A.FromJSON InsertTextFormat where+ parseJSON (A.Number 1) = pure PlainText+ parseJSON (A.Number 2) = pure Snippet+ parseJSON _ = mempty++-- -------------------------------------++data CompletionItemKind = CiText+ | CiMethod+ | CiFunction+ | CiConstructor+ | CiField+ | CiVariable+ | CiClass+ | CiInterface+ | CiModule+ | CiProperty+ | CiUnit+ | CiValue+ | CiEnum+ | CiKeyword+ | CiSnippet+ | CiColor+ | CiFile+ | CiReference+ deriving (Read,Show,Eq,Ord)++instance A.ToJSON CompletionItemKind where+ toJSON CiText = A.Number 1+ toJSON CiMethod = A.Number 2+ toJSON CiFunction = A.Number 3+ toJSON CiConstructor = A.Number 4+ toJSON CiField = A.Number 5+ toJSON CiVariable = A.Number 6+ toJSON CiClass = A.Number 7+ toJSON CiInterface = A.Number 8+ toJSON CiModule = A.Number 9+ toJSON CiProperty = A.Number 10+ toJSON CiUnit = A.Number 11+ toJSON CiValue = A.Number 12+ toJSON CiEnum = A.Number 13+ toJSON CiKeyword = A.Number 14+ toJSON CiSnippet = A.Number 15+ toJSON CiColor = A.Number 16+ toJSON CiFile = A.Number 17+ toJSON CiReference = A.Number 18++instance A.FromJSON CompletionItemKind where+ parseJSON (A.Number 1) = pure CiText+ parseJSON (A.Number 2) = pure CiMethod+ parseJSON (A.Number 3) = pure CiFunction+ parseJSON (A.Number 4) = pure CiConstructor+ parseJSON (A.Number 5) = pure CiField+ parseJSON (A.Number 6) = pure CiVariable+ parseJSON (A.Number 7) = pure CiClass+ parseJSON (A.Number 8) = pure CiInterface+ parseJSON (A.Number 9) = pure CiModule+ parseJSON (A.Number 10) = pure CiProperty+ parseJSON (A.Number 11) = pure CiUnit+ parseJSON (A.Number 12) = pure CiValue+ parseJSON (A.Number 13) = pure CiEnum+ parseJSON (A.Number 14) = pure CiKeyword+ parseJSON (A.Number 15) = pure CiSnippet+ parseJSON (A.Number 16) = pure CiColor+ parseJSON (A.Number 17) = pure CiFile+ parseJSON (A.Number 18) = pure CiReference+ parseJSON _ = mempty+++-- -------------------------------------++data CompletionItem =+ CompletionItem+ { _label :: Text -- ^ The label of this completion item. By default also+ -- the text that is inserted when selecting this+ -- completion.+ , _kind :: Maybe CompletionItemKind+ , _detail :: Maybe Text -- ^ A human-readable string with additional+ -- information about this item, like type or+ -- symbol information.+ , _documentation :: Maybe Text -- ^ A human-readable string that represents+ -- a doc-comment.+ , _sortText :: Maybe Text -- ^ A string that should be used when filtering+ -- a set of completion items. When `falsy` the+ -- label is used.+ , _filterText :: Maybe Text -- ^ A string that should be used when+ -- filtering a set of completion items. When+ -- `falsy` the label is used.+ , _insertText :: Maybe Text -- ^ A string that should be inserted a+ -- document when selecting this completion.+ -- When `falsy` the label is used.+ , _insertTextFormat :: Maybe InsertTextFormat+ -- ^ The format of the insert text. The format applies to both the+ -- `insertText` property and the `newText` property of a provided+ -- `textEdit`.+ , _textEdit :: Maybe TextEdit+ -- ^ An edit which is applied to a document when selecting this+ -- completion. When an edit is provided the value of `insertText` is+ -- ignored.+ --+ -- *Note:* The range of the edit must be a single line range and it+ -- must contain the position at which completion has been requested.+ , _additionalTextEdits :: Maybe (List TextEdit)+ -- ^ An optional array of additional text edits that are applied when+ -- selecting this completion. Edits must not overlap with the main edit+ -- nor with themselves.+ , _command :: Maybe Command+ -- ^ An optional command that is executed *after* inserting this+ -- completion. *Note* that additional modifications to the current+ -- document should be described with the additionalTextEdits-property.+ , _xdata :: Maybe A.Value -- ^ An data entry field that is preserved on a+ -- completion item between a completion and a+ -- completion resolve request.+ } deriving (Read,Show,Eq)++deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''CompletionItem+makeFieldsNoPrefix ''CompletionItem++data CompletionListType =+ CompletionListType+ { _isIncomplete :: Bool+ , _items :: List CompletionItem+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''CompletionListType+makeFieldsNoPrefix ''CompletionListType+++data CompletionResponseResult+ = CompletionList CompletionListType+ | Completions (List CompletionItem)+ deriving (Read,Show,Eq)++deriveJSON defaultOptions { fieldLabelModifier = rdrop (length ("CompletionResponseResult"::String)), sumEncoding = UntaggedValue } ''CompletionResponseResult++type CompletionResponse = ResponseMessage CompletionResponseResult+type CompletionRequest = RequestMessage ClientMethod TextDocumentPositionParams CompletionResponseResult++-- -------------------------------------+{-+New in 3.0+-----------+Registration Options: CompletionRegistrationOptions options defined as follows:++export interface CompletionRegistrationOptions extends TextDocumentRegistrationOptions {+ /**+ * The characters that trigger completion automatically.+ */+ triggerCharacters?: string[];++ /**+ * The server provides support to resolve additional+ * information for a completion item.+ */+ resolveProvider?: boolean;+}+-}++data CompletionRegistrationOptions =+ CompletionRegistrationOptions+ { _documentSelector :: Maybe DocumentSelector+ , _triggerCharacters :: Maybe (List String)+ , _resolveProvider :: Maybe Bool+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''CompletionRegistrationOptions+makeFieldsNoPrefix ''CompletionRegistrationOptions++-- ---------------------------------------------------------------------+{-+Completion Item Resolve Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#completion-item-resolve-request++The request is sent from the client to the server to resolve additional+information for a given completion item.++Request++ method: 'completionItem/resolve'+ params: CompletionItem++Response++ result: CompletionItem+ error: code and message set in case an exception happens during the completion resolve request.+-}++type CompletionItemResolveRequest = RequestMessage ClientMethod CompletionItem CompletionItem+type CompletionItemResolveResponse = ResponseMessage CompletionItem++-- ---------------------------------------------------------------------+{-+Hover Request++The hover request is sent from the client to the server to request hover+information at a given text document position.++ Changed: In 2.0 the request uses TextDocumentPositionParams with a proper+ textDocument and position property. In 1.0 the uri of the referenced text+ document was inlined into the params object.++Request++ method: 'textDocument/hover'+ params: TextDocumentPositionParams++Response++ result: Hover defined as follows:++/**+ * The result of a hove request.+ */+interface Hover {+ /**+ * The hover's content+ */+ contents: MarkedString | MarkedString[];++ /**+ * An optional range+ */+ range?: Range;+}++Where MarkedString is defined as follows:+/**+ * MarkedString can be used to render human readable text. It is either a markdown string+ * or a code-block that provides a language and a code snippet. The language identifier+ * is sematically equal to the optional language identifier in fenced code blocks in GitHub+ * issues. See https://help.github.com/articles/creating-and-highlighting-code-blocks/#syntax-highlighting+ *+ * The pair of a language and a value is an equivalent to markdown:+ * ```${language}+ * ${value}+ * ```+ *+ * Note that markdown strings will be sanitized - that means html will be escaped.+ */+type MarkedString = string | { language: string; value: string };++ error: code and message set in case an exception happens during the hover+ request.++Registration Options: TextDocumentRegistrationOptions++-}++data LanguageString =+ LanguageString+ { _language :: Text+ , _value :: Text+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''LanguageString+makeFieldsNoPrefix ''LanguageString++data MarkedString =+ PlainString T.Text+ | CodeString LanguageString+ deriving (Eq,Read,Show)++instance ToJSON MarkedString where+ toJSON (PlainString x) = toJSON x+ toJSON (CodeString x) = toJSON x+instance FromJSON MarkedString where+ parseJSON (A.String t) = pure $ PlainString t+ parseJSON o = CodeString <$> parseJSON o++data Hover =+ Hover+ { _contents :: List MarkedString+ , _range :: Maybe Range+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''Hover+makeFieldsNoPrefix ''Hover+++type HoverRequest = RequestMessage ClientMethod TextDocumentPositionParams Hover+type HoverResponse = ResponseMessage Hover++-- ---------------------------------------------------------------------+{-+Signature Help Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#signature-help-request++The signature help request is sent from the client to the server to request+signature information at a given cursor position.++ Changed: In 2.0 the request uses TextDocumentPositionParams with proper+ textDocument and position properties. In 1.0 the uri of the referenced text+ document was inlined into the params object.++Request++ method: 'textDocument/signatureHelp'+ params: TextDocumentPositionParams++Response++ result: SignatureHelp defined as follows:++/**+ * Signature help represents the signature of something+ * callable. There can be multiple signature but only one+ * active and only one active parameter.+ */+interface SignatureHelp {+ /**+ * One or more signatures.+ */+ signatures: SignatureInformation[];++ /**+ * The active signature.+ */+ activeSignature?: number;++ /**+ * The active parameter of the active signature.+ */+ activeParameter?: number;+}++/**+ * Represents the signature of something callable. A signature+ * can have a label, like a function-name, a doc-comment, and+ * a set of parameters.+ */+interface SignatureInformation {+ /**+ * The label of this signature. Will be shown in+ * the UI.+ */+ label: string;++ /**+ * The human-readable doc-comment of this signature. Will be shown+ * in the UI but can be omitted.+ */+ documentation?: string;++ /**+ * The parameters of this signature.+ */+ parameters?: ParameterInformation[];+}++/**+ * Represents a parameter of a callable-signature. A parameter can+ * have a label and a doc-comment.+ */+interface ParameterInformation {+ /**+ * The label of this signature. Will be shown in+ * the UI.+ */+ label: string;++ /**+ * The human-readable doc-comment of this signature. Will be shown+ * in the UI but can be omitted.+ */+ documentation?: string;+}++ error: code and message set in case an exception happens during the+ signature help request.+-}+++data ParameterInformation =+ ParameterInformation+ { _label :: Text+ , _documentation :: Maybe Text+ } deriving (Read,Show,Eq)+deriveJSON lspOptions ''ParameterInformation+makeFieldsNoPrefix ''ParameterInformation+++-- -------------------------------------++data SignatureInformation =+ SignatureInformation+ { _label :: Text+ , _documentation :: Maybe Text+ , _parameters :: Maybe [ParameterInformation]+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''SignatureInformation+makeFieldsNoPrefix ''SignatureInformation++data SignatureHelp =+ SignatureHelp+ { _signatures :: List SignatureInformation+ , _activeSignature :: Maybe Int -- ^ The active signature+ , _activeParameter :: Maybe Int -- ^ The active parameter of the active signature+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''SignatureHelp+makeFieldsNoPrefix ''SignatureHelp++type SignatureHelpRequest = RequestMessage ClientMethod TextDocumentPositionParams SignatureHelp+type SignatureHelpResponse = ResponseMessage SignatureHelp++-- -------------------------------------+{-+New in 3.0+----------+Registration Options: SignatureHelpRegistrationOptions defined as follows:++export interface SignatureHelpRegistrationOptions extends TextDocumentRegistrationOptions {+ /**+ * The characters that trigger signature help+ * automatically.+ */+ triggerCharacters?: string[];+}+-}++data SignatureHelpRegistrationOptions =+ SignatureHelpRegistrationOptions+ { _documentSelector :: Maybe DocumentSelector+ , _triggerCharacters :: Maybe (List String)+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''SignatureHelpRegistrationOptions+makeFieldsNoPrefix ''SignatureHelpRegistrationOptions++-- ---------------------------------------------------------------------+{-+Goto Definition Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#goto-definition-request++The goto definition request is sent from the client to the server to resolve the+definition location of a symbol at a given text document position.++ Changed: In 2.0 the request uses TextDocumentPositionParams with proper+ textDocument and position properties. In 1.0 the uri of the referenced text+ document was inlined into the params object.++Request++ method: 'textDocument/definition'+ params: TextDocumentPositionParams++Response:++ result: Location | Location[]+ error: code and message set in case an exception happens during the definition request.+++-}++-- {"jsonrpc":"2.0","id":1,"method":"textDocument/definition","params":{"textDocument":{"uri":"file:///tmp/Foo.hs"},"position":{"line":1,"character":8}}}++data DefinitionResponseParams = SingleLoc Location | MultiLoc [Location]+ deriving (Eq,Read,Show)++instance A.ToJSON DefinitionResponseParams where+ toJSON (SingleLoc x) = toJSON x+ toJSON (MultiLoc xs) = toJSON xs++instance A.FromJSON DefinitionResponseParams where+ parseJSON xs@(A.Array _) = MultiLoc <$> parseJSON xs+ parseJSON x = SingleLoc <$> parseJSON x++type DefinitionRequest = RequestMessage ClientMethod TextDocumentPositionParams DefinitionResponseParams+type DefinitionResponse = ResponseMessage DefinitionResponseParams++-- ---------------------------------------------------------------------++{-+Find References Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#find-references-request++The references request is sent from the client to the server to resolve+project-wide references for the symbol denoted by the given text document+position.++ Changed: In 2.0 the request uses TextDocumentPositionParams with proper+ textDocument and position properties. In 1.0 the uri of the referenced text+ document was inlined into the params object.++Request++ method: 'textDocument/references'+ params: ReferenceParams defined as follows:++interface ReferenceParams extends TextDocumentPositionParams {+ context: ReferenceContext+}++interface ReferenceContext {+ /**+ * Include the declaration of the current symbol.+ */+ includeDeclaration: boolean;+}++Response:++ result: Location[]+ error: code and message set in case an exception happens during the+ reference request.+-}++data ReferenceContext =+ ReferenceContext+ { _includeDeclaration :: Bool+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''ReferenceContext+makeFieldsNoPrefix ''ReferenceContext+++data ReferenceParams =+ ReferenceParams+ { _textDocument :: TextDocumentIdentifier+ , _position :: Position+ , _context :: ReferenceContext+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''ReferenceParams+makeFieldsNoPrefix ''ReferenceParams+++type ReferencesRequest = RequestMessage ClientMethod ReferenceParams (List Location)+type ReferencesResponse = ResponseMessage (List Location)++-- ---------------------------------------------------------------------+{-+Document Highlights Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-highlights-request++The document highlight request is sent from the client to the server to resolve+a document highlights for a given text document position. For programming+languages this usually highlights all references to the symbol scoped to this+file. However we kept 'textDocument/documentHighlight' and+'textDocument/references' separate requests since the first one is allowed to be+more fuzzy. Symbol matches usually have a DocumentHighlightKind of Read or Write+whereas fuzzy or textual matches use Textas the kind.++ Changed: In 2.0 the request uses TextDocumentPositionParams with proper+ textDocument and position properties. In 1.0 the uri of the referenced text+ document was inlined into the params object.++Request++ method: 'textDocument/documentHighlight'+ params: TextDocumentPositionParams++Response++ result: DocumentHighlight[] defined as follows:++/**+ * A document highlight is a range inside a text document which deserves+ * special attention. Usually a document highlight is visualized by changing+ * the background color of its range.+ *+ */+interface DocumentHighlight {+ /**+ * The range this highlight applies to.+ */+ range: Range;++ /**+ * The highlight kind, default is DocumentHighlightKind.Text.+ */+ kind?: number;+}++/**+ * A document highlight kind.+ */+enum DocumentHighlightKind {+ /**+ * A textual occurrance.+ */+ Text = 1,++ /**+ * Read-access of a symbol, like reading a variable.+ */+ Read = 2,++ /**+ * Write-access of a symbol, like writing to a variable.+ */+ Write = 3+}++ error: code and message set in case an exception happens during the document+ highlight request.++Registration Options: TextDocumentRegistrationOptions++-}++data DocumentHighlightKind = HkText | HkRead | HkWrite+ deriving (Read,Show,Eq)++instance A.ToJSON DocumentHighlightKind where+ toJSON HkText = A.Number 1+ toJSON HkRead = A.Number 2+ toJSON HkWrite = A.Number 3++instance A.FromJSON DocumentHighlightKind where+ parseJSON (A.Number 1) = pure HkText+ parseJSON (A.Number 2) = pure HkRead+ parseJSON (A.Number 3) = pure HkWrite+ parseJSON _ = mempty++-- -------------------------------------++data DocumentHighlight =+ DocumentHighlight+ { _range :: Range+ , _kind :: Maybe DocumentHighlightKind+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''DocumentHighlight+makeFieldsNoPrefix ''DocumentHighlight++type DocumentHighlightRequest = RequestMessage ClientMethod TextDocumentPositionParams (List DocumentHighlight)+type DocumentHighlightsResponse = ResponseMessage (List DocumentHighlight)++-- ---------------------------------------------------------------------+{-+Document Symbols Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-symbols-request++The document symbol request is sent from the client to the server to list all+symbols found in a given text document.++ Changed: In 2.0 the request uses DocumentSymbolParams instead of a single+ uri.++Request++ method: 'textDocument/documentSymbol'+ params: DocumentSymbolParams defined as follows:++interface DocumentSymbolParams {+ /**+ * The text document.+ */+ textDocument: TextDocumentIdentifier;+}++Response++ result: SymbolInformation[] defined as follows:++/**+ * Represents information about programming constructs like variables, classes,+ * interfaces etc.+ */+interface SymbolInformation {+ /**+ * The name of this symbol.+ */+ name: string;++ /**+ * The kind of this symbol.+ */+ kind: number;++ /**+ * The location of this symbol.+ */+ location: Location;++ /**+ * The name of the symbol containing this symbol.+ */+ containerName?: string;+}++Where the kind is defined like this:++/**+ * A symbol kind.+ */+export enum SymbolKind {+ File = 1,+ Module = 2,+ Namespace = 3,+ Package = 4,+ Class = 5,+ Method = 6,+ Property = 7,+ Field = 8,+ Constructor = 9,+ Enum = 10,+ Interface = 11,+ Function = 12,+ Variable = 13,+ Constant = 14,+ Text = 15,+ Number = 16,+ Boolean = 17,+ Array = 18,+}++ error: code and message set in case an exception happens during the document+ symbol request.++Registration Options: TextDocumentRegistrationOptions+-}++data DocumentSymbolParams =+ DocumentSymbolParams+ { _textDocument :: TextDocumentIdentifier+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''DocumentSymbolParams+makeFieldsNoPrefix ''DocumentSymbolParams++-- -------------------------------------++data SymbolKind+ = SkFile+ | SkModule+ | SkNamespace+ | SkPackage+ | SkClass+ | SkMethod+ | SkProperty+ | SkField+ | SkConstructor+ | SkEnum+ | SkInterface+ | SkFunction+ | SkVariable+ | SkConstant+ | SkString+ | SkNumber+ | SkBoolean+ | SkArray+ deriving (Read,Show,Eq)++instance A.ToJSON SymbolKind where+ toJSON SkFile = A.Number 1+ toJSON SkModule = A.Number 2+ toJSON SkNamespace = A.Number 3+ toJSON SkPackage = A.Number 4+ toJSON SkClass = A.Number 5+ toJSON SkMethod = A.Number 6+ toJSON SkProperty = A.Number 7+ toJSON SkField = A.Number 8+ toJSON SkConstructor = A.Number 9+ toJSON SkEnum = A.Number 10+ toJSON SkInterface = A.Number 11+ toJSON SkFunction = A.Number 12+ toJSON SkVariable = A.Number 13+ toJSON SkConstant = A.Number 14+ toJSON SkString = A.Number 15+ toJSON SkNumber = A.Number 16+ toJSON SkBoolean = A.Number 17+ toJSON SkArray = A.Number 18++instance A.FromJSON SymbolKind where+ parseJSON (A.Number 1) = pure SkFile+ parseJSON (A.Number 2) = pure SkModule+ parseJSON (A.Number 3) = pure SkNamespace+ parseJSON (A.Number 4) = pure SkPackage+ parseJSON (A.Number 5) = pure SkClass+ parseJSON (A.Number 6) = pure SkMethod+ parseJSON (A.Number 7) = pure SkProperty+ parseJSON (A.Number 8) = pure SkField+ parseJSON (A.Number 9) = pure SkConstructor+ parseJSON (A.Number 10) = pure SkEnum+ parseJSON (A.Number 11) = pure SkInterface+ parseJSON (A.Number 12) = pure SkFunction+ parseJSON (A.Number 13) = pure SkVariable+ parseJSON (A.Number 14) = pure SkConstant+ parseJSON (A.Number 15) = pure SkString+ parseJSON (A.Number 16) = pure SkNumber+ parseJSON (A.Number 17) = pure SkBoolean+ parseJSON (A.Number 18) = pure SkArray+ parseJSON _ = mempty+++-- ---------------------------------------------------------------------++data SymbolInformation =+ SymbolInformation+ { _name :: Text+ , _kind :: SymbolKind+ , _location :: Location+ , _containerName :: Maybe Text -- ^The name of the symbol containing this+ -- symbol.+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''SymbolInformation+makeFieldsNoPrefix ''SymbolInformation+++-- -------------------------------------++type DocumentSymbolRequest = RequestMessage ClientMethod DocumentSymbolParams (List SymbolInformation)+type DocumentSymbolsResponse = ResponseMessage (List SymbolInformation)++-- ---------------------------------------------------------------------+{-+Workspace Symbols Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#workspace-symbols-request++The workspace symbol request is sent from the client to the server to list+project-wide symbols matching the query string.++Request++ method: 'workspace/symbol'+ params: WorkspaceSymbolParams defined as follows:++/**+ * The parameters of a Workspace Symbol Request.+ */+interface WorkspaceSymbolParams {+ /**+ * A non-empty query string+ */+ query: string;+}++Response++ result: SymbolInformation[] as defined above.+ error: code and message set in case an exception happens during the+ workspace symbol request.+-}++data WorkspaceSymbolParams =+ WorkspaceSymbolParams+ { _query :: Text+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''WorkspaceSymbolParams+makeFieldsNoPrefix ''WorkspaceSymbolParams++type WorkspaceSymbolRequest = RequestMessage ClientMethod WorkspaceSymbolParams (List SymbolInformation)+type WorkspaceSymbolsResponse = ResponseMessage (List SymbolInformation)++-- ---------------------------------------------------------------------+{-+Code Action Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#code-action-request++The code action request is sent from the client to the server to compute+commands for a given text document and range. The request is triggered when the+user moves the cursor into a problem marker in the editor or presses the+lightbulb associated with a marker.++Request++ method: 'textDocument/codeAction'+ params: CodeActionParams defined as follows:++/**+ * Params for the CodeActionRequest+ */+interface CodeActionParams {+ /**+ * The document in which the command was invoked.+ */+ textDocument: TextDocumentIdentifier;++ /**+ * The range for which the command was invoked.+ */+ range: Range;++ /**+ * Context carrying additional information.+ */+ context: CodeActionContext;+}++/**+ * Contains additional diagnostic information about the context in which+ * a code action is run.+ */+interface CodeActionContext {+ /**+ * An array of diagnostics.+ */+ diagnostics: Diagnostic[];+}++Response++ result: Command[] defined as follows:+ error: code and message set in case an exception happens during the code+ action request.++-}++data CodeActionContext =+ CodeActionContext+ { _diagnostics :: List Diagnostic+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''CodeActionContext+makeFieldsNoPrefix ''CodeActionContext+++data CodeActionParams =+ CodeActionParams+ { _textDocument :: TextDocumentIdentifier+ , _range :: Range+ , _context :: CodeActionContext+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''CodeActionParams+makeFieldsNoPrefix ''CodeActionParams+++type CodeActionRequest = RequestMessage ClientMethod CodeActionParams (List Command)+type CodeActionResponse = ResponseMessage (List Command)++-- ---------------------------------------------------------------------+{-+Code Lens Request++The code lens request is sent from the client to the server to compute code+lenses for a given text document.++ Changed: In 2.0 the request uses CodeLensParams instead of a single uri.++Request++ method: 'textDocument/codeLens'+ params: CodeLensParams defined as follows:++interface CodeLensParams {+ /**+ * The document to request code lens for.+ */+ textDocument: TextDocumentIdentifier;+}++Response++ result: CodeLens[] defined as follows:++/**+ * A code lens represents a command that should be shown along with+ * source text, like the number of references, a way to run tests, etc.+ *+ * A code lens is _unresolved_ when no command is associated to it. For performance+ * reasons the creation of a code lens and resolving should be done in two stages.+ */+interface CodeLens {+ /**+ * The range in which this code lens is valid. Should only span a single line.+ */+ range: Range;++ /**+ * The command this code lens represents.+ */+ command?: Command;++ /**+ * A data entry field that is preserved on a code lens item between+ * a code lens and a code lens resolve request.+ */+ data?: any+}++ error: code and message set in case an exception happens during the code+ lens request.+-}++data CodeLensParams =+ CodeLensParams+ { _textDocument :: TextDocumentIdentifier+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''CodeLensParams+makeFieldsNoPrefix ''CodeLensParams+++-- -------------------------------------++data CodeLens =+ CodeLens+ { _range :: Range+ , _command :: Maybe Command+ , _xdata :: Maybe A.Value+ } deriving (Read,Show,Eq)++deriveJSON lspOptions{ fieldLabelModifier = customModifier } ''CodeLens+makeFieldsNoPrefix ''CodeLens+++type CodeLensRequest = RequestMessage ClientMethod CodeLensParams (List CodeLens)+type CodeLensResponse = ResponseMessage (List CodeLens)++-- -------------------------------------+{-+Registration Options: CodeLensRegistrationOptions defined as follows:++export interface CodeLensRegistrationOptions extends TextDocumentRegistrationOptions {+ /**+ * Code lens has a resolve provider as well.+ */+ resolveProvider?: boolean;+}+-}++data CodeLensRegistrationOptions =+ CodeLensRegistrationOptions+ { _documentSelector :: Maybe DocumentSelector+ , _resolveProvider :: Maybe Bool+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''CodeLensRegistrationOptions+makeFieldsNoPrefix ''CodeLensRegistrationOptions++-- ---------------------------------------------------------------------+{-+Code Lens Resolve Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#code-lens-resolve-request++The code lens resolve request is sent from the client to the server to resolve+the command for a given code lens item.++Request++ method: 'codeLens/resolve'+ params: CodeLens++Response++ result: CodeLens+ error: code and message set in case an exception happens during the code+ lens resolve request.+++-}++type CodeLensResolveRequest = RequestMessage ClientMethod CodeLens (List CodeLens)+type CodeLensResolveResponse = ResponseMessage (List CodeLens)++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++Document Link Request++The document links request is sent from the client to the server to request the+location of links in a document.++Request:++ method: 'textDocument/documentLink'+ params: DocumentLinkParams, defined as follows++interface DocumentLinkParams {+ /**+ * The document to provide document links for.+ */+ textDocument: TextDocumentIdentifier;+}++Response:++ result: An array of DocumentLink, or null.++/**+ * A document link is a range in a text document that links to an internal or external resource, like another+ * text document or a web site.+ */+interface DocumentLink {+ /**+ * The range this link applies to.+ */+ range: Range;+ /**+ * The uri this link points to. If missing a resolve request is sent later.+ */+ target?: DocumentUri;+}++ error: code and message set in case an exception happens during the document link request.++Registration Options: DocumentLinkRegistrationOptions defined as follows:++export interface DocumentLinkRegistrationOptions extends TextDocumentRegistrationOptions {+ /**+ * Document links have a resolve provider as well.+ */+ resolveProvider?: boolean;+}+-}++data DocumentLinkParams =+ DocumentLinkParams+ { _textDocument :: TextDocumentIdentifier+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''DocumentLinkParams+makeFieldsNoPrefix ''DocumentLinkParams++data DocumentLink =+ DocumentLink+ { _range :: Range+ , _target :: Maybe Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''DocumentLink+makeFieldsNoPrefix ''DocumentLink++type DocumentLinkRequest = RequestMessage ClientMethod DocumentLinkParams (List DocumentLink)+type DocumentLinkResponse = ResponseMessage (List DocumentLink)++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++Document Link Resolve Request++The document link resolve request is sent from the client to the server to resolve the target of a given document link.++Request:++ method: 'documentLink/resolve'+ params: DocumentLink++Response:++ result: DocumentLink+ error: code and message set in case an exception happens during the document link resolve request.++-}++type DocumentLinkResolveRequest = RequestMessage ClientMethod DocumentLink DocumentLink+type DocumentLinkResolveResponse = ResponseMessage DocumentLink++-- ---------------------------------------------------------------------+{-+Document Formatting Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-formatting-request++The document formatting request is sent from the server to the client to format+a whole document.++Request++ method: 'textDocument/formatting'+ params: DocumentFormattingParams defined as follows++interface DocumentFormattingParams {+ /**+ * The document to format.+ */+ textDocument: TextDocumentIdentifier;++ /**+ * The format options.+ */+ options: FormattingOptions;+}++/**+ * Value-object describing what options formatting should use.+ */+interface FormattingOptions {+ /**+ * Size of a tab in spaces.+ */+ tabSize: number;++ /**+ * Prefer spaces over tabs.+ */+ insertSpaces: boolean;++ /**+ * Signature for further properties.+ */+ [key: string]: boolean | number | string;+}++Response++ result: TextEdit[] describing the modification to the document to be+ formatted.+ error: code and message set in case an exception happens during the+ formatting request.++Registration Options: TextDocumentRegistrationOptions+-}++data FormattingOptions =+ FormattingOptions+ { _tabSize :: Int+ , _insertSpaces :: Bool -- ^ Prefer spaces over tabs+ -- Note: May be more properties+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''FormattingOptions+makeFieldsNoPrefix ''FormattingOptions++data DocumentFormattingParams =+ DocumentFormattingParams+ { _textDocument :: TextDocumentIdentifier+ , _options :: FormattingOptions+ } deriving (Show,Read,Eq)++deriveJSON lspOptions ''DocumentFormattingParams+makeFieldsNoPrefix ''DocumentFormattingParams++type DocumentFormattingRequest = RequestMessage ClientMethod DocumentFormattingParams (List TextEdit)+type DocumentFormattingResponse = ResponseMessage (List TextEdit)++-- ---------------------------------------------------------------------+{-+Document Range Formatting Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-range-formatting-request++The document range formatting request is sent from the client to the server to+format a given range in a document.++Request++ method: 'textDocument/rangeFormatting',+ params: DocumentRangeFormattingParams defined as follows++interface DocumentRangeFormattingParams {+ /**+ * The document to format.+ */+ textDocument: TextDocumentIdentifier;++ /**+ * The range to format+ */+ range: Range;++ /**+ * The format options+ */+ options: FormattingOptions;+}++Response++ result: TextEdit[] describing the modification to the document to be+ formatted.+ error: code and message set in case an exception happens during the range+ formatting request.+-}++data DocumentRangeFormattingParams =+ DocumentRangeFormattingParams+ { _textDocument :: TextDocumentIdentifier+ , _range :: Range+ , _options :: FormattingOptions+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''DocumentRangeFormattingParams+makeFieldsNoPrefix ''DocumentRangeFormattingParams++type DocumentRangeFormattingRequest = RequestMessage ClientMethod DocumentRangeFormattingParams (List TextEdit)+type DocumentRangeFormattingResponse = ResponseMessage (List TextEdit)++-- ---------------------------------------------------------------------+{-+Document on Type Formatting Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#document-on-type-formatting-request++The document on type formatting request is sent from the client to the server to+format parts of the document during typing.++Request++ method: 'textDocument/onTypeFormatting'+ params: DocumentOnTypeFormattingParams defined as follows++interface DocumentOnTypeFormattingParams {+ /**+ * The document to format.+ */+ textDocument: TextDocumentIdentifier;++ /**+ * The position at which this request was sent.+ */+ position: Position;++ /**+ * The character that has been typed.+ */+ ch: string;++ /**+ * The format options.+ */+ options: FormattingOptions;+}++Response++ result: TextEdit[] describing the modification to the document.+ error: code and message set in case an exception happens during the range+ formatting request.++Registration Options: DocumentOnTypeFormattingRegistrationOptions defined as follows:++export interface DocumentOnTypeFormattingRegistrationOptions extends TextDocumentRegistrationOptions {+ /**+ * A character on which formatting should be triggered, like `}`.+ */+ firstTriggerCharacter: string;+ /**+ * More trigger characters.+ */+ moreTriggerCharacter?: string[]+}+-}++data DocumentOnTypeFormattingParams =+ DocumentOnTypeFormattingParams+ { _textDocument :: TextDocumentIdentifier+ , _position :: Position+ , _ch :: Text+ , _options :: FormattingOptions+ } deriving (Read,Show,Eq)++deriveJSON lspOptions ''DocumentOnTypeFormattingParams+makeFieldsNoPrefix ''DocumentOnTypeFormattingParams++type DocumentOnTypeFormattingRequest = RequestMessage ClientMethod DocumentOnTypeFormattingParams (List TextEdit)+type DocumentOnTypeFormattingResponse = ResponseMessage (List TextEdit)++data DocumentOnTypeFormattingRegistrationOptions =+ DocumentOnTypeFormattingRegistrationOptions+ { _firstTriggerCharacter :: Text+ , _moreTriggerCharacter :: Maybe (List String)+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''DocumentOnTypeFormattingRegistrationOptions++-- ---------------------------------------------------------------------+{-+Rename Request++https://github.com/Microsoft/language-server-protocol/blob/master/protocol.md#rename-request++The rename request is sent from the client to the server to perform a+workspace-wide rename of a symbol.++Request++ method: 'textDocument/rename'+ params: RenameParams defined as follows++interface RenameParams {+ /**+ * The document to format.+ */+ textDocument: TextDocumentIdentifier;++ /**+ * The position at which this request was sent.+ */+ position: Position;++ /**+ * The new name of the symbol. If the given name is not valid the+ * request must return a [ResponseError](#ResponseError) with an+ * appropriate message set.+ */+ newName: string;+}++Response++ result: WorkspaceEdit describing the modification to the workspace.+ error: code and message set in case an exception happens during the rename+ request.++Registration Options: TextDocumentRegistrationOptions++-}+data RenameParams =+ RenameParams+ { _textDocument :: TextDocumentIdentifier+ , _position :: Position+ , _newName :: Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''RenameParams+makeFieldsNoPrefix ''RenameParams+++-- {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"textDocument/rename\",\"params\":{\"textDocument\":{\"uri\":\"file:///home/alanz/mysrc/github/alanz/haskell-lsp/src/HieVscode.hs\"},\"position\":{\"line\":37,\"character\":17},\"newName\":\"getArgs'\"}}++type RenameRequest = RequestMessage ClientMethod RenameParams WorkspaceEdit+type RenameResponse = ResponseMessage WorkspaceEdit++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++Execute a command++The workspace/executeCommand request is sent from the client to the server to+trigger command execution on the server. In most cases the server creates a+WorkspaceEdit structure and applies the changes to the workspace using the+request workspace/applyEdit which is sent from the server to the client.++Request:++ method: 'workspace/executeCommand'+ params: ExecuteCommandParams defined as follows:++export interface ExecuteCommandParams {++ /**+ * The identifier of the actual command handler.+ */+ command: string;+ /**+ * Arguments that the command should be invoked with.+ */+ arguments?: any[];+}++The arguments are typically specified when a command is returned from the server+to the client. Example requests that return a command are+textDocument/codeAction or textDocument/codeLens.++Response:++ result: any+ error: code and message set in case an exception happens during the request.++Registration Options: ExecuteCommandRegistrationOptions defined as follows:++/**+ * Execute command registration options.+ */+export interface ExecuteCommandRegistrationOptions {+ /**+ * The commands to be executed on the server+ */+ commands: string[]+}+-}++data ExecuteCommandParams =+ ExecuteCommandParams+ { _command :: Text+ , _arguments :: Maybe (List A.Value)+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''ExecuteCommandParams+makeFieldsNoPrefix ''ExecuteCommandParams++type ExecuteCommandRequest = RequestMessage ClientMethod ExecuteCommandParams A.Value+type ExecuteCommandResponse = ResponseMessage A.Value++data ExecuteCommandRegistrationOptions =+ ExecuteCommandRegistrationOptions+ { _commands :: List Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''ExecuteCommandRegistrationOptions+makeFieldsNoPrefix ''ExecuteCommandRegistrationOptions++-- ---------------------------------------------------------------------+{-+New in 3.0+----------++Applies a WorkspaceEdit++The workspace/applyEdit request is sent from the server to the client to modify+resource on the client side.++Request:++ method: 'workspace/applyEdit'+ params: ApplyWorkspaceEditParams defined as follows:++export interface ApplyWorkspaceEditParams {+ /**+ * The edits to apply.+ */+ edit: WorkspaceEdit;+}++Response:++ result: ApplyWorkspaceEditResponse defined as follows:++export interface ApplyWorkspaceEditResponse {+ /**+ * Indicates whether the edit was applied or not.+ */+ applied: boolean;+}++ error: code and message set in case an exception happens during the request.++-}+data ApplyWorkspaceEditParams =+ ApplyWorkspaceEditParams+ { _edit :: WorkspaceEdit+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''ApplyWorkspaceEditParams+makeFieldsNoPrefix ''ApplyWorkspaceEditParams++data ApplyWorkspaceEditResponseBody =+ ApplyWorkspaceEditResponseBody+ { _applied :: Bool+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''ApplyWorkspaceEditResponseBody+makeFieldsNoPrefix ''ApplyWorkspaceEditResponseBody++-- | Sent from the server to the client+type ApplyWorkspaceEditRequest = RequestMessage ServerMethod ApplyWorkspaceEditParams ApplyWorkspaceEditResponseBody+type ApplyWorkspaceEditResponse = ResponseMessage ApplyWorkspaceEditResponseBody++-- %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%++-- ---------------------------------------------------------------------++data TraceParams =+ TraceParams {+ _value :: Text+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''TraceParams+makeFieldsNoPrefix ''TraceParams+++data TraceNotification =+ TraceNotification {+ _params :: TraceParams+ } deriving (Show, Read, Eq)++deriveJSON lspOptions ''TraceNotification+makeFieldsNoPrefix ''TraceNotification++++-- ---------------------------------------------------------------------
+ src/Language/Haskell/LSP/TH/Messages.hs view
@@ -0,0 +1,311 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE BinaryLiterals #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}++module Language.Haskell.LSP.TH.Messages (+ -- * General+ fmClientInitializeRequest+ , fmClientInitializedNotification+ , fmClientShutdownRequest+ , fmClientExitNotification+ , fmClientCancelNotification++ -- * Window+ , fmServerShowMessageNotification+ , fmServerShowMessageRequest+ , fmServerLogMessageNotification+ , fmServerTelemetryNotification++ -- * Client+ , fmServerRegisterCapabilityRequest+ , fmServerUnregisterCapabilityRequest++ -- * Workspace+ , fmClientDidChangeConfigurationNotification+ , fmClientDidChangeWatchedFilesNotification+ , fmClientWorkspaceSymbolRequest+ , fmClientExecuteCommandRequest+ , fmServerApplyWorkspaceEditRequest++ -- * Document+ , fmServerPublishDiagnosticsNotification+ , fmClientDidOpenTextDocumentNotification+ , fmClientDidChangeTextDocumentNotification+ , fmClientWillSaveTextDocumentNotification+ , fmClientWillSaveWaitUntilRequest+ , fmClientDidSaveTextDocumentNotification+ , fmClientDidCloseTextDocumentNotification+ , fmClientCompletionRequest+ , fmClientCompletionItemResolveRequest+ , fmClientHoverRequest+ , fmClientSignatureHelpRequest+ , fmClientReferencesRequest+ , fmClientDocumentHighlightRequest+ , fmClientDocumentSymbolRequest+ , fmClientDocumentFormattingRequest+ , fmClientDocumentRangeFormattingRequest+ , fmClientDocumentOnTypeFormattingRequest+ , fmClientDefinitionRequest+ , fmClientCodeActionRequest+ , fmClientCodeLensRequest+ , fmClientCodeLensResolveRequest+ , fmClientDocumentLinkRequest+ , fmClientDocumentLinkResolveRequest+ , fmClientRenameRequest+ ) where++import qualified Data.Aeson as J+import Data.Text ( Text )+import qualified Language.Haskell.LSP.TH.DataTypesJSON as J++-- ---------------------------------------------------------------------+{-# ANN module ("HLint: ignore Eta reduce" :: String) #-}+{-# ANN module ("HLint: ignore Redundant do" :: String) #-}+{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}+-- ---------------------------------------------------------------------++-- ----------------------------------------------------------------------+-- General+-- ----------------------------------------------------------------------++-- * :leftwards_arrow_with_hook: [initialize](#initialize)++fmClientInitializeRequest :: J.LspId -> J.InitializeParams -> J.InitializeRequest+fmClientInitializeRequest rid params+ = J.RequestMessage "2.0" rid J.Initialize params++-- ----------------------------------------------------------------------+-- * **New** :arrow_right: [initialized](#initialized)++-- | From 3.0+fmClientInitializedNotification :: J.InitializedNotification+fmClientInitializedNotification = J.NotificationMessage "2.0" J.Initialized Nothing++-- ----------------------------------------------------------------------+-- * :leftwards_arrow_with_hook: [shutdown](#shutdown)++fmClientShutdownRequest :: J.LspId -> Maybe J.Value -> J.ShutdownRequest+fmClientShutdownRequest rid params+ = J.RequestMessage "2.0" rid J.Shutdown params++-- ----------------------------------------------------------------------+-- * :arrow_right: [exit](#exit)++fmClientExitNotification :: J.ExitNotification+fmClientExitNotification = J.NotificationMessage "2.0" J.Exit Nothing++-- ----------------------------------------------------------------------+-- * :arrow_right: [$/cancelRequest](#cancelRequest)++fmClientCancelNotification :: J.LspId -> J.CancelNotification+fmClientCancelNotification idToCancel+ = J.NotificationMessage "2.0" J.CancelRequest (J.CancelParams idToCancel)++-- ----------------------------------------------------------------------+-- Window+-- ----------------------------------------------------------------------++-- * :arrow_left: [window/showMessage](#window_showMessage)++fmServerShowMessageNotification :: J.MessageType -> Text -> J.ShowMessageNotification+fmServerShowMessageNotification mt msg+ = J.NotificationMessage "2.0" J.WindowShowMessage (J.ShowMessageParams mt msg)++-- ----------------------------------------------------------------------+-- * :arrow_right_hook: [window/showMessageRequest](#window_showMessageRequest)++fmServerShowMessageRequest :: J.LspId -> J.ShowMessageRequestParams -> J.ShowMessageRequest+fmServerShowMessageRequest rid params+ = J.RequestMessage "2.0" rid J.WindowShowMessageRequest params++-- ----------------------------------------------------------------------+-- * :arrow_left: [window/logMessage](#window_logMessage)++fmServerLogMessageNotification :: J.MessageType -> Text -> J.LogMessageNotification+fmServerLogMessageNotification mt msg+ = J.NotificationMessage "2.0" J.WindowLogMessage (J.LogMessageParams mt msg)++-- ----------------------------------------------------------------------+-- * :arrow_left: [telemetry/event](#telemetry_event)++fmServerTelemetryNotification :: J.Value -> J.TelemetryNotification+fmServerTelemetryNotification params+ = J.NotificationMessage "2.0" J.TelemetryEvent params++-- ----------------------------------------------------------------------+-- Client+-- ----------------------------------------------------------------------++-- * :arrow_right_hook: [client/registerCapability](#client_registerCapability)+-- | from 3.0+fmServerRegisterCapabilityRequest :: J.LspId -> J.RegistrationParams -> J.RegisterCapabilityRequest+fmServerRegisterCapabilityRequest rid params+ = J.RequestMessage "2.0" rid J.ClientRegisterCapability params++-- * :arrow_right_hook: [client/unregisterCapability](#client_unregisterCapability)+-- | from 3.0+fmServerUnregisterCapabilityRequest :: J.LspId -> J.UnregistrationParams -> J.UnregisterCapabilityRequest+fmServerUnregisterCapabilityRequest rid params+ = J.RequestMessage "2.0" rid J.ClientUnregisterCapability params++-- ----------------------------------------------------------------------+-- Workspace+-- ----------------------------------------------------------------------++-- * :arrow_right: [workspace/didChangeConfiguration](#workspace_didChangeConfiguration)+fmClientDidChangeConfigurationNotification :: J.DidChangeConfigurationParams -> J.DidChangeConfigurationNotification+fmClientDidChangeConfigurationNotification params+ = J.NotificationMessage "2.0" J.WorkspaceDidChangeConfiguration params++-- * :arrow_right: [workspace/didChangeWatchedFiles](#workspace_didChangeWatchedFiles)+fmClientDidChangeWatchedFilesNotification :: J.DidChangeWatchedFilesParams -> J.DidChangeWatchedFilesNotification+fmClientDidChangeWatchedFilesNotification params+ = J.NotificationMessage "2.0" J.WorkspaceDidChangeWatchedFiles params++-- * :leftwards_arrow_with_hook: [workspace/symbol](#workspace_symbol)+fmClientWorkspaceSymbolRequest :: J.LspId -> J.WorkspaceSymbolParams -> J.WorkspaceSymbolRequest+fmClientWorkspaceSymbolRequest rid params+ = J.RequestMessage "2.0" rid J.WorkspaceSymbol params++-- * **New** :leftwards_arrow_with_hook: [workspace/executeCommand](#workspace_executeCommand)+-- | From 3.0+fmClientExecuteCommandRequest :: J.LspId -> J.ExecuteCommandParams -> J.ExecuteCommandRequest+fmClientExecuteCommandRequest rid params+ = J.RequestMessage "2.0" rid J.WorkspaceExecuteCommand params++-- * **New** :arrow_right_hook: [workspace/applyEdit](#workspace_applyEdit)+-- | From 3.0+fmServerApplyWorkspaceEditRequest :: J.LspId -> J.ApplyWorkspaceEditParams -> J.ApplyWorkspaceEditRequest+fmServerApplyWorkspaceEditRequest rid params+ = J.RequestMessage "2.0" rid J.WorkspaceApplyEdit params++-- ----------------------------------------------------------------------+ -- Document+-- ----------------------------------------------------------------------++-- * :arrow_left: [textDocument/publishDiagnostics](#textDocument_publishDiagnostics)+fmServerPublishDiagnosticsNotification :: J.PublishDiagnosticsParams -> J.PublishDiagnosticsNotification+fmServerPublishDiagnosticsNotification params+ = J.NotificationMessage "2.0" J.TextDocumentPublishDiagnostics params++-- * :arrow_right: [textDocument/didOpen](#textDocument_didOpen)+fmClientDidOpenTextDocumentNotification :: J.DidOpenTextDocumentParams -> J.DidOpenTextDocumentNotification+fmClientDidOpenTextDocumentNotification params+ = J.NotificationMessage "2.0" J.TextDocumentDidOpen params++-- * :arrow_right: [textDocument/didChange](#textDocument_didChange)+fmClientDidChangeTextDocumentNotification :: J.DidChangeTextDocumentParams -> J.DidChangeTextDocumentNotification+fmClientDidChangeTextDocumentNotification params+ = J.NotificationMessage "2.0" J.TextDocumentDidChange params++-- * :arrow_right: [textDocument/willSave](#textDocument_willSave)+fmClientWillSaveTextDocumentNotification :: J.WillSaveTextDocumentParams -> J.WillSaveTextDocumentNotification+fmClientWillSaveTextDocumentNotification params+ = J.NotificationMessage "2.0" J.TextDocumentWillSave params++-- * **New** :leftwards_arrow_with_hook: [textDocument/willSaveWaitUntil](#textDocument_willSaveWaitUntil)+-- | From 3.0+fmClientWillSaveWaitUntilRequest :: J.LspId -> J.WillSaveTextDocumentParams -> J.WillSaveWaitUntilTextDocumentRequest+fmClientWillSaveWaitUntilRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentWillSaveWaitUntil params++-- * **New** :arrow_right: [textDocument/didSave](#textDocument_didSave)+-- | 3.0+fmClientDidSaveTextDocumentNotification :: J.DidSaveTextDocumentParams -> J.DidSaveTextDocumentNotification+fmClientDidSaveTextDocumentNotification params+ = J.NotificationMessage "2.0" J.TextDocumentDidSave params++-- * :arrow_right: [textDocument/didClose](#textDocument_didClose)+fmClientDidCloseTextDocumentNotification :: J.DidCloseTextDocumentParams -> J.DidCloseTextDocumentNotification+fmClientDidCloseTextDocumentNotification params+ = J.NotificationMessage "2.0" J.TextDocumentDidClose params++-- * :leftwards_arrow_with_hook: [textDocument/completion](#textDocument_completion)+fmClientCompletionRequest :: J.LspId -> J.TextDocumentPositionParams -> J.CompletionRequest+fmClientCompletionRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentCompletion params++-- * :leftwards_arrow_with_hook: [completionItem/resolve](#completionItem_resolve)+fmClientCompletionItemResolveRequest :: J.LspId -> J.CompletionItem -> J.CompletionItemResolveRequest+fmClientCompletionItemResolveRequest rid params+ = J.RequestMessage "2.0" rid J.CompletionItemResolve params++-- * :leftwards_arrow_with_hook: [textDocument/hover](#textDocument_hover)+fmClientHoverRequest :: J.LspId -> J.TextDocumentPositionParams -> J.HoverRequest+fmClientHoverRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentHover params++-- * :leftwards_arrow_with_hook: [textDocument/signatureHelp](#textDocument_signatureHelp)+fmClientSignatureHelpRequest :: J.LspId -> J.TextDocumentPositionParams -> J.SignatureHelpRequest+fmClientSignatureHelpRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentSignatureHelp params++-- * :leftwards_arrow_with_hook: [textDocument/references](#textDocument_references)+fmClientReferencesRequest :: J.LspId -> J.ReferenceParams -> J.ReferencesRequest+fmClientReferencesRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentReferences params++-- * :leftwards_arrow_with_hook: [textDocument/documentHighlight](#textDocument_documentHighlight)+fmClientDocumentHighlightRequest :: J.LspId -> J.TextDocumentPositionParams -> J.DocumentHighlightRequest+fmClientDocumentHighlightRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentDocumentHighlight params++-- * :leftwards_arrow_with_hook: [textDocument/documentSymbol](#textDocument_documentSymbol)+fmClientDocumentSymbolRequest :: J.LspId -> J.DocumentSymbolParams -> J.DocumentSymbolRequest+fmClientDocumentSymbolRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentDocumentSymbol params++-- * :leftwards_arrow_with_hook: [textDocument/formatting](#textDocument_formatting)+fmClientDocumentFormattingRequest :: J.LspId -> J.DocumentFormattingParams -> J.DocumentFormattingRequest+fmClientDocumentFormattingRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentFormatting params++-- * :leftwards_arrow_with_hook: [textDocument/rangeFormatting](#textDocument_rangeFormatting)+fmClientDocumentRangeFormattingRequest :: J.LspId -> J.DocumentRangeFormattingParams -> J.DocumentRangeFormattingRequest+fmClientDocumentRangeFormattingRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentRangeFormatting params++-- * :leftwards_arrow_with_hook: [textDocument/onTypeFormatting](#textDocument_onTypeFormatting)+fmClientDocumentOnTypeFormattingRequest :: J.LspId -> J.DocumentOnTypeFormattingParams -> J.DocumentOnTypeFormattingRequest+fmClientDocumentOnTypeFormattingRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentOnTypeFormatting params++-- * :leftwards_arrow_with_hook: [textDocument/definition](#textDocument_definition)+fmClientDefinitionRequest :: J.LspId -> J.TextDocumentPositionParams -> J.DefinitionRequest+fmClientDefinitionRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentDefinition params++-- * :leftwards_arrow_with_hook: [textDocument/codeAction](#textDocument_codeAction)+fmClientCodeActionRequest :: J.LspId -> J.CodeActionParams -> J.CodeActionRequest+fmClientCodeActionRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentCodeAction params++-- * :leftwards_arrow_with_hook: [textDocument/codeLens](#textDocument_codeLens)+fmClientCodeLensRequest :: J.LspId -> J.CodeLensParams -> J.CodeLensRequest+fmClientCodeLensRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentCodeLens params++-- * :leftwards_arrow_with_hook: [codeLens/resolve](#codeLens_resolve)+fmClientCodeLensResolveRequest :: J.LspId -> J.CodeLens -> J.CodeLensResolveRequest+fmClientCodeLensResolveRequest rid params+ = J.RequestMessage "2.0" rid J.CodeLensResolve params++-- * :leftwards_arrow_with_hook: [textDocument/documentLink](#textDocument_documentLink)+fmClientDocumentLinkRequest :: J.LspId -> J.DocumentLinkParams -> J.DocumentLinkRequest+fmClientDocumentLinkRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentDocumentLink params++-- * :leftwards_arrow_with_hook: [documentLink/resolve](#documentLink_resolve)+fmClientDocumentLinkResolveRequest :: J.LspId -> J.DocumentLink -> J.DocumentLinkResolveRequest+fmClientDocumentLinkResolveRequest rid params+ = J.RequestMessage "2.0" rid J.DocumentLinkResolve params++-- * :leftwards_arrow_with_hook: [textDocument/rename](#textDocument_rename)+fmClientRenameRequest :: J.LspId -> J.RenameParams -> J.RenameRequest+fmClientRenameRequest rid params+ = J.RequestMessage "2.0" rid J.TextDocumentRename params+
+ src/Language/Haskell/LSP/TH/Utils.hs view
@@ -0,0 +1,6 @@+module Language.Haskell.LSP.TH.Utils where++-- ---------------------------------------------------------------------++rdrop :: Int -> [a] -> [a]+rdrop cnt = reverse . drop cnt . reverse