From 76034cba7ecf34ce9098d46f7e7bccea2b66c81f Mon Sep 17 00:00:00 2001 From: Luke Lau Date: Wed, 5 Dec 2018 23:57:29 +0000 Subject: [PATCH] Bubble up exceptions thrown on server listener thread --- src/Language/Haskell/LSP/Test/Decoding.hs | 3 ++- src/Language/Haskell/LSP/Test/Exceptions.hs | 2 ++ src/Language/Haskell/LSP/Test/Session.hs | 6 +++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/Language/Haskell/LSP/Test/Decoding.hs b/src/Language/Haskell/LSP/Test/Decoding.hs index b3929ab..7756734 100644 --- a/src/Language/Haskell/LSP/Test/Decoding.hs +++ b/src/Language/Haskell/LSP/Test/Decoding.hs @@ -13,6 +13,7 @@ import Language.Haskell.LSP.Types import Language.Haskell.LSP.Types.Lens hiding ( error ) import Language.Haskell.LSP.Messages +import Language.Haskell.LSP.Test.Exceptions import qualified Data.HashMap.Strict as HM getAllMessages :: Handle -> IO [B.ByteString] @@ -49,7 +50,7 @@ getHeaders h = do let (name, val) = span (/= ':') l if null val then return [] else ((name, drop 2 val) :) <$> getHeaders h where eofHandler e - | isEOFError e = error "Language Server unexpectedly terminated" + | isEOFError e = throw UnexpectedServerTermination | otherwise = throw e type RequestMap = HM.HashMap LspId ClientMethod diff --git a/src/Language/Haskell/LSP/Test/Exceptions.hs b/src/Language/Haskell/LSP/Test/Exceptions.hs index e1e281f..b1e0635 100644 --- a/src/Language/Haskell/LSP/Test/Exceptions.hs +++ b/src/Language/Haskell/LSP/Test/Exceptions.hs @@ -17,6 +17,7 @@ data SessionException = Timeout | UnexpectedDiagnostics | IncorrectApplyEditRequest String | UnexpectedResponseError LspIdRsp ResponseError + | UnexpectedServerTermination deriving Eq instance Exception SessionException @@ -42,6 +43,7 @@ instance Show SessionException where ++ msgStr show (UnexpectedResponseError lid e) = "Received an exepected error in a response for id " ++ show lid ++ ":\n" ++ show e + show UnexpectedServerTermination = "Language server unexpectedly terminated" -- | A predicate that matches on any 'SessionException' anySessionException :: SessionException -> Bool diff --git a/src/Language/Haskell/LSP/Test/Session.hs b/src/Language/Haskell/LSP/Test/Session.hs index a153cba..700d9cc 100644 --- a/src/Language/Haskell/LSP/Test/Session.hs +++ b/src/Language/Haskell/LSP/Test/Session.hs @@ -201,9 +201,12 @@ runSessionWithHandles serverIn serverOut serverHandler config caps rootDir sessi messageChan <- newChan initRsp <- newEmptyMVar + mainThreadId <- myThreadId + let context = SessionContext serverIn absRootDir messageChan reqMap initRsp config caps initState = SessionState (IdInt 0) mempty mempty 0 False Nothing - launchServerHandler = forkIO $ void $ serverHandler serverOut context + launchServerHandler = forkIO $ catch (serverHandler serverOut context) + (throwTo mainThreadId :: SessionException -> IO ()) (result, _) <- bracket launchServerHandler killThread $ const $ runSession context initState session @@ -332,3 +335,4 @@ logMsg t msg = do | otherwise = Cyan showPretty = B.unpack . encodePretty + -- 2.30.2