X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest%2FServer.hs;h=bd5bdb959f670652a5e910d5d0942b43fcb0c494;hb=5732d9891b7515251ba3fd66269c21d63ed12c79;hp=473f2c76e1c39c46252e0f1b0a0933a05db60185;hpb=f6e14409afddc74ea8ffb1d852c316a5374caf2c;p=opengl.git diff --git a/src/Language/Haskell/LSP/Test/Server.hs b/src/Language/Haskell/LSP/Test/Server.hs index 473f2c7..bd5bdb9 100644 --- a/src/Language/Haskell/LSP/Test/Server.hs +++ b/src/Language/Haskell/LSP/Test/Server.hs @@ -1,13 +1,14 @@ module Language.Haskell.LSP.Test.Server (withServer) where import Control.Concurrent +import Control.Exception import Control.Monad -import Data.Maybe +import Language.Haskell.LSP.Test.Compat import System.IO import System.Process -withServer :: String -> (Handle -> Handle -> Int -> IO a) -> IO a -withServer serverExe f = do +withServer :: String -> Bool -> (Handle -> Handle -> Int -> IO a) -> IO a +withServer serverExe logStdErr f = do -- TODO Probably should just change runServer to accept -- separate command and arguments let cmd:args = words serverExe @@ -17,12 +18,10 @@ withServer serverExe f = do -- Need to continuously consume to stderr else it gets blocked -- Can't pass NoStream either to std_err hSetBuffering serverErr NoBuffering - errSinkThread <- forkIO $ forever $ hGetLine serverErr + errSinkThread <- forkIO $ forever $ hGetLine serverErr >>= when logStdErr . putStrLn - pid <- fromIntegral . fromJust <$> getPid serverProc - - result <- f serverIn serverOut pid + pid <- getProcessID serverProc + finally (f serverIn serverOut pid) $ do killThread errSinkThread terminateProcess serverProc - return result