X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest%2FParsing.hs;h=9e6bdd5c5739f07b9b8590598fe2a1c08cfcae86;hp=693c62e9aab0670e83001003803d72798cb2ec1f;hb=0f8b9d328f4d950ff0a2e1c3b5aed593b21c2d3a;hpb=ea5db1975df3a208798ce2c44dc71fb8123fabd3 diff --git a/src/Language/Haskell/LSP/Test/Parsing.hs b/src/Language/Haskell/LSP/Test/Parsing.hs index 693c62e..9e6bdd5 100644 --- a/src/Language/Haskell/LSP/Test/Parsing.hs +++ b/src/Language/Haskell/LSP/Test/Parsing.hs @@ -5,39 +5,56 @@ module Language.Haskell.LSP.Test.Parsing where import Control.Applicative +import Control.Concurrent +import Control.Monad.IO.Class +import Control.Monad.Trans.Class import Data.Aeson import qualified Data.ByteString.Lazy.Char8 as B import Data.Conduit.Parser import Data.Maybe import Language.Haskell.LSP.Messages import Language.Haskell.LSP.Types hiding (error) +import Language.Haskell.LSP.Test.Exceptions import Language.Haskell.LSP.Test.Messages +import Language.Haskell.LSP.Test.Session + +satisfy :: (MonadIO m, MonadSessionConfig m) => (a -> Bool) -> ConduitParser a m a +satisfy pred = do + timeout <- timeout <$> lift sessionConfig + tId <- liftIO myThreadId + liftIO $ forkIO $ do + threadDelay (timeout * 1000000) + throwTo tId TimeoutException + x <- await + if pred x + then return x + else empty -- | Matches if the message is a notification. -anyNotification :: Monad m => ConduitParser FromServerMessage m FromServerMessage +anyNotification :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m FromServerMessage anyNotification = satisfy isServerNotification -notification :: forall m a. (Monad m, FromJSON a) => ConduitParser FromServerMessage m (NotificationMessage ServerMethod a) +notification :: forall m a. (MonadIO m, MonadSessionConfig m, FromJSON a) => ConduitParser FromServerMessage m (NotificationMessage ServerMethod a) notification = do let parser = decode . encodeMsg :: FromServerMessage -> Maybe (NotificationMessage ServerMethod a) x <- satisfy (isJust . parser) return $ decodeMsg $ encodeMsg x -- | Matches if the message is a request. -anyRequest :: Monad m => ConduitParser FromServerMessage m FromServerMessage +anyRequest :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m FromServerMessage anyRequest = satisfy isServerRequest -request :: forall m a b. (Monad m, FromJSON a, FromJSON b) => ConduitParser FromServerMessage m (RequestMessage ServerMethod a b) +request :: forall m a b. (MonadIO m, MonadSessionConfig m, FromJSON a, FromJSON b) => ConduitParser FromServerMessage m (RequestMessage ServerMethod a b) request = do let parser = decode . encodeMsg :: FromServerMessage -> Maybe (RequestMessage ServerMethod a b) x <- satisfy (isJust . parser) return $ decodeMsg $ encodeMsg x -- | Matches if the message is a response. -anyResponse :: Monad m => ConduitParser FromServerMessage m FromServerMessage +anyResponse :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m FromServerMessage anyResponse = satisfy isServerResponse -response :: forall m a. (Monad m, FromJSON a) => ConduitParser FromServerMessage m (ResponseMessage a) +response :: forall m a. (MonadIO m, MonadSessionConfig m, FromJSON a) => ConduitParser FromServerMessage m (ResponseMessage a) response = do let parser = decode . encodeMsg :: FromServerMessage -> Maybe (ResponseMessage a) x <- satisfy (isJust . parser) @@ -53,7 +70,7 @@ decodeMsg x = fromMaybe (error $ "Unexpected message type\nGot:\n " ++ show x) (decode x) -- | Matches if the message is a log message notification or a show message notification/request. -loggingNotification :: Monad m => ConduitParser FromServerMessage m FromServerMessage +loggingNotification :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m FromServerMessage loggingNotification = satisfy shouldSkip where shouldSkip (NotLogMessage _) = True @@ -61,17 +78,9 @@ loggingNotification = satisfy shouldSkip shouldSkip (ReqShowMessage _) = True shouldSkip _ = False -publishDiagnosticsNotification :: Monad m => ConduitParser FromServerMessage m PublishDiagnosticsNotification +publishDiagnosticsNotification :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m PublishDiagnosticsNotification publishDiagnosticsNotification = do NotPublishDiagnostics diags <- satisfy test return diags where test (NotPublishDiagnostics _) = True test _ = False \ No newline at end of file - -satisfy :: Monad m => (a -> Bool) -> ConduitParser a m a -satisfy pred = do - x <- await - if pred x - then return x - else empty -