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]
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
| UnexpectedDiagnostics
| IncorrectApplyEditRequest String
| UnexpectedResponseError LspIdRsp ResponseError
+ | UnexpectedServerTermination
deriving Eq
instance Exception SessionException
++ 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
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
| otherwise = Cyan
showPretty = B.unpack . encodePretty
+