Bubble up exceptions thrown on server listener thread
authorLuke Lau <luke_lau@icloud.com>
Wed, 5 Dec 2018 23:57:29 +0000 (23:57 +0000)
committerLuke Lau <luke_lau@icloud.com>
Wed, 5 Dec 2018 23:57:29 +0000 (23:57 +0000)
src/Language/Haskell/LSP/Test/Decoding.hs
src/Language/Haskell/LSP/Test/Exceptions.hs
src/Language/Haskell/LSP/Test/Session.hs

index b3929abbf4da57d983015597b929707213cd97c4..77567349053e86cce1b52e873032b8a7f3028022 100644 (file)
@@ -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
index e1e281fa435486e6bdd4bd4c9b9dfbcc2c1134d9..b1e0635e31b435b6a8e480e19b83b43fdab6802b 100644 (file)
@@ -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
index a153cba988890e08b5fe6f54e40d3a8cdfcbb377..700d9ccc84c233314f9c581bfd6bf8f810c8c1d5 100644 (file)
@@ -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
+