From: Luke Lau Date: Wed, 5 Dec 2018 01:01:41 +0000 (+0000) Subject: Properly terminate server handler thread on exceptions X-Git-Tag: 0.5.0.2~2 X-Git-Url: http://git.lukelau.me/?p=lsp-test.git;a=commitdiff_plain;h=107d162a748586f20a49d3513a6c130196c8f61a Properly terminate server handler thread on exceptions --- diff --git a/src/Language/Haskell/LSP/Test/Decoding.hs b/src/Language/Haskell/LSP/Test/Decoding.hs index 059ab34..b3929ab 100644 --- a/src/Language/Haskell/LSP/Test/Decoding.hs +++ b/src/Language/Haskell/LSP/Test/Decoding.hs @@ -3,12 +3,15 @@ module Language.Haskell.LSP.Test.Decoding where import Prelude hiding ( id ) import Data.Aeson +import Control.Exception import Control.Lens import qualified Data.ByteString.Lazy.Char8 as B import Data.Maybe import System.IO +import System.IO.Error import Language.Haskell.LSP.Types -import Language.Haskell.LSP.Types.Lens hiding (error) +import Language.Haskell.LSP.Types.Lens + hiding ( error ) import Language.Haskell.LSP.Messages import qualified Data.HashMap.Strict as HM @@ -42,9 +45,12 @@ addHeader content = B.concat getHeaders :: Handle -> IO [(String, String)] getHeaders h = do - l <- hGetLine h + l <- catch (hGetLine h) eofHandler 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" + | otherwise = throw e type RequestMap = HM.HashMap LspId ClientMethod diff --git a/src/Language/Haskell/LSP/Test/Session.hs b/src/Language/Haskell/LSP/Test/Session.hs index 9af3a67..a153cba 100644 --- a/src/Language/Haskell/LSP/Test/Session.hs +++ b/src/Language/Haskell/LSP/Test/Session.hs @@ -203,11 +203,9 @@ runSessionWithHandles serverIn serverOut serverHandler config caps rootDir sessi 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 - (result, _) <- runSession context initState session - - killThread threadId + launchServerHandler = forkIO $ void $ serverHandler serverOut context + (result, _) <- bracket launchServerHandler killThread $ + const $ runSession context initState session return result diff --git a/stack.yaml b/stack.yaml index 2c97f95..0c1d999 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,4 +1,4 @@ -resolver: lts-12.17 +resolver: nightly-2018-12-01 packages: - . diff --git a/test/Test.hs b/test/Test.hs index 9319a77..e4aae55 100644 --- a/test/Test.hs +++ b/test/Test.hs @@ -30,7 +30,7 @@ import System.Timeout main = hspec $ do describe "Session" $ do it "fails a test" $ - -- TODO: Catch the exception in haskell-lsp-test and provide nicer output + -- TODO: Catch the exception in lsp-test and provide nicer output let session = runSession "hie" fullCaps "test/data/renamePass" $ do openDoc "Desktop/simple.hs" "haskell" skipMany loggingNotification