Shutdown the server before kill its thread
[lsp-test.git] / src / Language / Haskell / LSP / Test / Session.hs
index 46155f0607cfa1b752b541b755a761b1551b4b30..415402a7ce261f98c0eb5b4ad707aad65288f54b 100644 (file)
@@ -212,9 +212,11 @@ runSessionWithHandles serverIn serverOut serverHandler config caps rootDir sessi
       initState = SessionState (IdInt 0) mempty mempty 0 False Nothing
       launchServerHandler = forkIO $ catch (serverHandler serverOut context)
                                            (throwTo mainThreadId :: SessionException -> IO())
-  (result, _) <- bracket launchServerHandler killThread $
-    const $ runSession context initState session
-
+  (result, _) <- bracket
+                   launchServerHandler
+                   (\tid -> do runSession context initState sendExitMessage
+                               killThread tid)
+                   (const $ runSession context initState session)
   return result
 
 updateStateC :: ConduitM FromServerMessage FromServerMessage (StateT SessionState (ReaderT SessionContext IO)) ()
@@ -301,6 +303,9 @@ sendMessage msg = do
   logMsg LogClient msg
   liftIO $ B.hPut h (addHeader $ encode msg)
 
+sendExitMessage :: (MonadIO m, HasReader SessionContext m) => m ()
+sendExitMessage = sendMessage (NotificationMessage "2.0" Exit ExitParams)
+
 -- | Execute a block f that will throw a 'Timeout' exception
 -- after duration seconds. This will override the global timeout
 -- for waiting for messages to arrive defined in 'SessionConfig'.