X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest%2FReplay.hs;h=73151d75cd8711a0107c65cadff95483014d1d5a;hb=cdb1ba7038c32bac71a3bc783effc1e07049a985;hp=ad26858ee39632d4a5e8260a83576ef0a65a93b6;hpb=bd6901688e6c9d8332fea161260d32666885f9ed;p=opengl.git diff --git a/src/Language/Haskell/LSP/Test/Replay.hs b/src/Language/Haskell/LSP/Test/Replay.hs index ad26858..73151d7 100644 --- a/src/Language/Haskell/LSP/Test/Replay.hs +++ b/src/Language/Haskell/LSP/Test/Replay.hs @@ -19,13 +19,13 @@ import Data.List import Data.Maybe import Control.Lens hiding (List) import Control.Monad -import System.IO import System.FilePath import Language.Haskell.LSP.Test import Language.Haskell.LSP.Test.Files import Language.Haskell.LSP.Test.Decoding import Language.Haskell.LSP.Test.Messages import Language.Haskell.LSP.Test.Server +import Language.Haskell.LSP.Test.Session -- | Replays a captured client output and @@ -42,7 +42,7 @@ replaySession serverExe sessionDir = do -- decode session let unswappedEvents = map (fromJust . decode) entries - withServer serverExe $ \serverIn serverOut pid -> do + withServer serverExe False $ \serverIn serverOut pid -> do events <- swapCommands pid <$> swapFiles sessionDir unswappedEvents @@ -62,6 +62,7 @@ replaySession serverExe sessionDir = do serverOut (listenServer serverMsgs requestMap reqSema rspSema passSema mainThread) def + fullCaps sessionDir (sendMessages clientMsgs reqSema rspSema) takeMVar passSema @@ -95,7 +96,7 @@ sendMessages (nextMsg:remainingMsgs) reqSema rspSema = sendMessages remainingMsgs reqSema rspSema request msg@(RequestMessage _ id m _) = do - sendRequest' msg + sendRequestMessage msg liftIO $ putStrLn $ "Sent a request id " ++ show id ++ ": " ++ show m ++ "\nWaiting for a response" rsp <- liftIO $ takeMVar rspSema @@ -123,44 +124,51 @@ isNotification (NotShowMessage _) = True isNotification (NotCancelRequestFromServer _) = True isNotification _ = False -listenServer :: [FromServerMessage] -> RequestMap -> MVar LspId -> MVar LspIdRsp -> MVar () -> ThreadId -> Handle -> Session () -listenServer [] _ _ _ passSema _ _ = liftIO $ putMVar passSema () -listenServer expectedMsgs reqMap reqSema rspSema passSema mainThreadId serverOut = do - - msgBytes <- liftIO $ getNextMessage serverOut +-- listenServer :: [FromServerMessage] +-- -> RequestMap +-- -> MVar LspId +-- -> MVar LspIdRsp +-- -> MVar () +-- -> ThreadId +-- -> Handle +-- -> SessionContext +-- -> IO () +listenServer [] _ _ _ passSema _ _ _ = putMVar passSema () +listenServer expectedMsgs reqMap reqSema rspSema passSema mainThreadId serverOut ctx = do + + msgBytes <- getNextMessage serverOut let msg = decodeFromServerMsg reqMap msgBytes handleServerMessage request response notification msg if shouldSkip msg - then listenServer expectedMsgs reqMap reqSema rspSema passSema mainThreadId serverOut + then listenServer expectedMsgs reqMap reqSema rspSema passSema mainThreadId serverOut ctx else if inRightOrder msg expectedMsgs - then listenServer (delete msg expectedMsgs) reqMap reqSema rspSema passSema mainThreadId serverOut - else let expectedMsgs = takeWhile (not . isNotification) expectedMsgs + then listenServer (delete msg expectedMsgs) reqMap reqSema rspSema passSema mainThreadId serverOut ctx + else let remainingMsgs = takeWhile (not . isNotification) expectedMsgs ++ [head $ dropWhile isNotification expectedMsgs] - exc = ReplayOutOfOrderException msg expectedMsgs + exc = ReplayOutOfOrder msg remainingMsgs in liftIO $ throwTo mainThreadId exc where - response :: ResponseMessage a -> Session () + response :: ResponseMessage a -> IO () response res = do - liftIO $ putStrLn $ "Got response for id " ++ show (res ^. id) + putStrLn $ "Got response for id " ++ show (res ^. id) - liftIO $ putMVar rspSema (res ^. id) -- unblock the handler waiting to send a request + putMVar rspSema (res ^. id) -- unblock the handler waiting to send a request - request :: RequestMessage ServerMethod a b -> Session () + request :: RequestMessage ServerMethod a b -> IO () request req = do - liftIO - $ putStrLn + putStrLn $ "Got request for id " ++ show (req ^. id) ++ " " ++ show (req ^. method) - liftIO $ putMVar reqSema (req ^. id) -- unblock the handler waiting for a response + putMVar reqSema (req ^. id) -- unblock the handler waiting for a response - notification :: NotificationMessage ServerMethod a -> Session () - notification n = liftIO $ putStrLn $ "Got notification " ++ show (n ^. method) + notification :: NotificationMessage ServerMethod a -> IO () + notification n = putStrLn $ "Got notification " ++ show (n ^. method)