import qualified Control.Monad.Trans.State as State (get, put)
import qualified Data.ByteString.Lazy.Char8 as B
import Data.Aeson
+import Data.Aeson.Encode.Pretty
import Data.Conduit as Conduit
import Data.Conduit.Parser as Parser
import Data.Default
-- | Stuff you can configure for a 'Session'.
data SessionConfig = SessionConfig
{
- capabilities :: ClientCapabilities -- ^ Specific capabilities the client should advertise. Default is yes to everything.
- , messageTimeout :: Int -- ^ Maximum time to wait for a message in seconds. Defaults to 60.
- , logStdErr :: Bool -- ^ When True redirects the servers stderr output to haskell-lsp-test's stdout. Defaults to False
+ messageTimeout :: Int -- ^ Maximum time to wait for a message in seconds. Defaults to 60.
+ , logStdErr :: Bool -- ^ When True redirects the servers stderr output to haskell-lsp-test's stdout. Defaults to False.
+ , logMessages :: Bool -- ^ When True traces the communication between client and server to stdout. Defaults to True.
}
instance Default SessionConfig where
- def = SessionConfig def 60 False
+ def = SessionConfig 60 False True
data SessionMessage = ServerMessage FromServerMessage
| TimeoutMessage Int
, requestMap :: MVar RequestMap
, initRsp :: MVar InitializeResponse
, config :: SessionConfig
+ , sessionCapabilities :: ClientCapabilities
}
class Monad m => HasReader r m where
-> Handle -- ^ Server out
-> (Handle -> SessionContext -> IO ()) -- ^ Server listener
-> SessionConfig
- -> FilePath
+ -> ClientCapabilities
+ -> FilePath -- ^ Root directory
-> Session a
-> IO a
-runSessionWithHandles serverIn serverOut serverHandler config rootDir session = do
+runSessionWithHandles serverIn serverOut serverHandler config caps rootDir session = do
absRootDir <- canonicalizePath rootDir
hSetBuffering serverIn NoBuffering
messageChan <- newChan
initRsp <- newEmptyMVar
- let context = SessionContext serverIn absRootDir messageChan reqMap initRsp config
+ let context = SessionContext serverIn absRootDir messageChan reqMap initRsp config caps
initState = SessionState (IdInt 0) mempty mempty 0 False Nothing
threadId <- forkIO $ void $ serverHandler serverOut context
updateState (ReqApplyWorkspaceEdit r) = do
-
allChangeParams <- case r ^. params . edit . documentChanges of
Just (List cs) -> do
mapM_ (checkIfNeedsOpened . (^. textDocument . uri)) cs
sendMessage :: (MonadIO m, HasReader SessionContext m, ToJSON a) => a -> m ()
sendMessage msg = do
h <- serverIn <$> ask
- let encoded = encode msg
- liftIO $ do
+ let encoded = encodePretty msg
+
+ shouldLog <- asks $ logMessages . config
+ liftIO $ when shouldLog $ do
- setSGR [SetColor Foreground Vivid Cyan]
+ setSGR [SetColor Foreground Dull Cyan]
putStrLn $ "--> " ++ B.unpack encoded
setSGR [Reset]