@@ -17,8 +17,10 @@ import qualified Language.Haskell.LSP.Core as LSP
1717import Control.Concurrent.Chan
1818import Control.Concurrent.Extra
1919import Control.Concurrent.Async
20+import Control.Exception.Safe
2021import Data.Default
2122import Data.Maybe
23+import qualified Data.Text as T
2224import GHC.IO.Handle (hDuplicate, hDuplicateTo)
2325import System.IO
2426import Control.Monad.Extra
@@ -27,6 +29,7 @@ import Development.IDE.LSP.Definition
2729import Development.IDE.LSP.Hover
2830import Development.IDE.LSP.Notifications
2931import Development.IDE.Core.Service
32+import Development.IDE.Types.Logger
3033import Development.IDE.Core.FileStore
3134import Language.Haskell.LSP.Core (LspFuncs(..))
3235import Language.Haskell.LSP.Messages
@@ -89,10 +92,23 @@ runLanguageServer options userHandlers getIdeState = do
8992 _ <- flip forkFinally (const exitClientMsg) $ forever $ do
9093 msg <- readChan clientMsgChan
9194 case msg of
92− Notification NotificationMessage{_params} act -> act ide _params
93− Response RequestMessage{_id, _params} wrap act -> do
94− res <- act ide _params
95− sendFunc $ wrap $ ResponseMessage "2.0" (responseId _id) (Just res) Nothing
95+ Notification x@NotificationMessage{_params} act -> do
96+ catch (act ide _params) $ \(e :: SomeException) ->
97+ logError (ideLogger ide) $ T.pack $
98+ "Unexpected exception on notification, please report!\n" ++
99+ "Message: " ++ show x ++ "\n" ++
100+ "Exception: " ++ show e
101+ Response x@RequestMessage{_id, _params} wrap act ->
102+ catch (do
103+ res <- act ide _params
104+ sendFunc $ wrap $ ResponseMessage "2.0" (responseId _id) (Just res) Nothing
105+ ) $ \(e :: SomeException) -> do
106+ logError (ideLogger ide) $ T.pack $
107+ "Unexpected exception on request, please report!\n" ++
108+ "Message: " ++ show x ++ "\n" ++
109+ "Exception: " ++ show e
110+ sendFunc $ wrap $ ResponseMessage "2.0" (responseId _id) Nothing $
111+ Just $ ResponseError InternalError (T.pack $ show e) Nothing
96112 pure Nothing
97113
98114
@@ -109,8 +125,8 @@ setHandlersIgnore = PartialHandlers $ \_ x -> return x
109125-- | A message that we need to deal with - the pieces are split up with existentials to gain additional type safety
110126-- and defer precise processing until later (allows us to keep at a higher level of abstraction slightly longer)
111127data Message
112− = forall m req resp . Response (RequestMessage m req resp) (ResponseMessage resp -> FromServerMessage) (IdeState -> req -> IO resp)
113− | forall m req . Notification (NotificationMessage m req) (IdeState -> req -> IO ())
128+ = forall m req resp . (Show m, Show req) => Response (RequestMessage m req resp) (ResponseMessage resp -> FromServerMessage) (IdeState -> req -> IO resp)
129+ | forall m req . (Show m, Show req) => Notification (NotificationMessage m req) (IdeState -> req -> IO ())
114130
115131
116132modifyOptions :: LSP.Options -> LSP.Options