X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest.hs;h=4f3094f87d58034d5fc2b0d11c87973464ddd7d4;hb=bf93e74482200ee189ca0be09970b9a34bb1511c;hp=17a39c5a9702a9e2146514c65165220270ff516f;hpb=edee40c4aba2607c652cace2da780c373612665f;p=opengl.git diff --git a/src/Language/Haskell/LSP/Test.hs b/src/Language/Haskell/LSP/Test.hs index 17a39c5..4f3094f 100644 --- a/src/Language/Haskell/LSP/Test.hs +++ b/src/Language/Haskell/LSP/Test.hs @@ -54,6 +54,7 @@ module Language.Haskell.LSP.Test , (<|>) , satisfy -- * Utilities + , getInitializeResponse , openDoc , getDocItem , getDocUri @@ -84,7 +85,7 @@ import Language.Haskell.LSP.Test.Parsing runSession :: String -- ^ The command to run the server. -> FilePath -- ^ The filepath to the root directory for the session. -> Session a -- ^ The session to run. - -> IO () + -> IO a runSession serverExe rootDir session = do pid <- getProcessID absRootDir <- canonicalizePath rootDir @@ -100,16 +101,23 @@ runSession serverExe rootDir session = do -- Wrap the session around initialize and shutdown calls sendRequest Initialize initializeParams - initRsp <- response :: Session InitializeResponse - liftIO $ maybe (return ()) (putStrLn . ("Error while initializing: " ++) . show ) (initRsp ^. LSP.error) + initRspMsg <- response :: Session InitializeResponse + + liftIO $ maybe (return ()) (putStrLn . ("Error while initializing: " ++) . show ) (initRspMsg ^. LSP.error) + + initRspVar <- initRsp <$> ask + liftIO $ putMVar initRspVar initRspMsg + sendNotification Initialized InitializedParams -- Run the actual test - session + result <- session sendNotification Exit ExitParams + return result + -- | An internal version of 'runSession' that allows for a custom handler to listen to the server. -- It also does not automatically send initialize and exit messages. runSessionWithHandler :: (Handle -> Session ()) @@ -129,8 +137,9 @@ runSessionWithHandler serverHandler serverExe rootDir session = do reqMap <- newMVar newRequestMap messageChan <- newChan meaninglessChan <- newChan + initRsp <- newEmptyMVar - let context = SessionContext serverIn absRootDir messageChan reqMap + let context = SessionContext serverIn absRootDir messageChan reqMap initRsp initState = SessionState (IdInt 9) threadId <- forkIO $ void $ runSession' meaninglessChan context initState (serverHandler serverOut) @@ -224,6 +233,12 @@ sendMessage msg = do h <- serverIn <$> ask liftIO $ B.hPut h $ addHeader (encode msg) +-- | Returns the initialize response that was received from the server. +-- The initialize requests and responses are not included the session, +-- so if you need to test it use this. +getInitializeResponse :: Session InitializeResponse +getInitializeResponse = initRsp <$> ask >>= (liftIO . readMVar) + -- | Opens a text document and sends a notification to the client. openDoc :: FilePath -> String -> Session TextDocumentIdentifier openDoc file languageId = do