haskell-lsp-client-1.0.0.1: A haskell package to build your own Language Server client.

Copyright(c) Jaro Reinders 2017
LicenseGPL-2
Maintainerjaro.reinders@gmail.com
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

LSP.Client

Contents

Description

This module contains an implementation of a client for the Language Server Protocol. It uses the same data types as the haskell-lsp library.

This client is intended to be used by text editors written in haskell to provide the user with IDE-like features.

This module is intended to be imported qualified:

import qualified LSP.Client as Client

In the examples in this module it is assumed that the following modules are imported:

import qualified Language.Haskell.LSP.TH.DataTypesJSON as LSP

A complete example can be found in the github repository.

TODO:

  • Implement proper exception handling.

Synopsis

Initialization

start :: Config -> IO (MVar ClientMessage) Source #

Start the language server.

Example:

reqVar <- Client.start myConfig

Where inp and out are the Handles of the lsp client and testHandleNotification and testHandleRequestMessage are NotificationMessageHandler and RequestMessageHandler respectively. reqVar can be passed to the sendClientRequest and sendClientNotification functions.

data Config Source #

The configuration of the Language Server Protocol client. toServer and fromServer are the Handles which can be used to send messages to and receive messages from the server.

Create this configuration and pass it to the start function.

Example:

(Just inp, Just out, _, _) <- createProcess (proc "hie" ["--lsp"])
  {std_in = CreatePipe, std_out = CreatePipe, std_err = CreatePipe}
let myConfig = Config inp out testHandleNotificationMessage testHandleRequestMessage

This example will run hie --lsp and combine the inp and out Handles with the testHandleNotificationMessage and testHandleRequestMessage handlers to form the configuration of the client.

Receiving

data RequestMessageHandler Source #

The handlers for request messages from the server. Define these once and pass them via the Config data type to the start function.

Example:

testRequestMessageHandler :: Client.RequestMessageHandler
testRequestMessageHandler = Client.RequestMessageHandler
  (m -> emptyResponse m <$ print m)
  (m -> emptyResponse m <$ print m)
  (m -> emptyResponse m <$ print m)
  (m -> emptyResponse m <$ print m)
  where
    toRspId (LSP.IdInt i) = LSP.IdRspInt i
    toRspId (LSP.IdString t) = LSP.IdRspString t

    emptyResponse :: LSP.RequestMessage m req resp -> LSP.ResponseMessage a
    emptyResponse m = LSP.ResponseMessage (m ^. LSP.jsonrpc) (toRspId (m ^. LSP.id)) Nothing Nothing

This example will print all request messages to and send back an empty response message.

data NotificationMessageHandler Source #

The handlers for notification messages from the server. Define these once and pass them via the Config data type to the start function.

Example:

testNotificationMessageHandler :: Client.NotificationMessageHandler
testNotificationMessageHandler = Client.NotificationMessageHandler
  (T.putStrLn . view (LSP.params . LSP.message))
  (T.putStrLn . view (LSP.params . LSP.message))
  (print . view LSP.params)
  (mapM_ T.putStrLn . (^.. LSP.params . LSP.diagnostics . traverse . LSP.message))

This example will print the message content of each notification.

Sending

sendClientRequest :: forall params resp. (ToJSON params, ToJSON resp, FromJSON resp) => Proxy (RequestMessage ClientMethod params resp) -> MVar ClientMessage -> ClientMethod -> params -> IO (Maybe (Either ResponseError resp)) Source #

Send a request message to the Language Server and wait for its response.

Example:

Client.sendClientRequest (Proxy :: Proxy LSP.InitializeRequest)
                         reqVar
                         LSP.Initialize
                         initializeParams

Where reqVar is the MVar generated by the start function and initializeParams are the parameters to the initialize request as specified in the Language Server Protocol and the haskell-lsp package. Note that in this case the result is ignored.

sendClientNotification :: forall params. ToJSON params => MVar ClientMessage -> ClientMethod -> params -> IO () Source #

Send a notification message to the Language Server.

Example:

Client.sendClientNotification reqVar LSP.Initialized (Just LSP.InitializedParams)

Where reqVar is the MVar generated by the start function.