X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest%2FParsing.hs;h=fdc2e958bafc45eae1e02deceba80ba4e03657b4;hp=9e6bdd5c5739f07b9b8590598fe2a1c08cfcae86;hb=493d20ada6e48a8987e00a5ec92a1b31fe3c9b8c;hpb=0f8b9d328f4d950ff0a2e1c3b5aed593b21c2d3a diff --git a/src/Language/Haskell/LSP/Test/Parsing.hs b/src/Language/Haskell/LSP/Test/Parsing.hs index 9e6bdd5..fdc2e95 100644 --- a/src/Language/Haskell/LSP/Test/Parsing.hs +++ b/src/Language/Haskell/LSP/Test/Parsing.hs @@ -1,7 +1,7 @@ {-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE RankNTypes #-} +{-# LANGUAGE OverloadedStrings #-} module Language.Haskell.LSP.Test.Parsing where import Control.Applicative @@ -22,56 +22,57 @@ satisfy :: (MonadIO m, MonadSessionConfig m) => (a -> Bool) -> ConduitParser a m satisfy pred = do timeout <- timeout <$> lift sessionConfig tId <- liftIO myThreadId - liftIO $ forkIO $ do + timeoutThread <- liftIO $ forkIO $ do threadDelay (timeout * 1000000) throwTo tId TimeoutException x <- await + liftIO $ killThread timeoutThread if pred x then return x else empty -- | Matches if the message is a notification. anyNotification :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m FromServerMessage -anyNotification = satisfy isServerNotification +anyNotification = named "Any notification" $ satisfy isServerNotification notification :: forall m a. (MonadIO m, MonadSessionConfig m, FromJSON a) => ConduitParser FromServerMessage m (NotificationMessage ServerMethod a) -notification = do +notification = named "Notification" $ do let parser = decode . encodeMsg :: FromServerMessage -> Maybe (NotificationMessage ServerMethod a) x <- satisfy (isJust . parser) - return $ decodeMsg $ encodeMsg x + return $ castMsg x -- | Matches if the message is a request. anyRequest :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m FromServerMessage -anyRequest = satisfy isServerRequest +anyRequest = named "Any request" $ satisfy isServerRequest request :: forall m a b. (MonadIO m, MonadSessionConfig m, FromJSON a, FromJSON b) => ConduitParser FromServerMessage m (RequestMessage ServerMethod a b) -request = do +request = named "Request" $ do let parser = decode . encodeMsg :: FromServerMessage -> Maybe (RequestMessage ServerMethod a b) x <- satisfy (isJust . parser) - return $ decodeMsg $ encodeMsg x + return $ castMsg x -- | Matches if the message is a response. anyResponse :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m FromServerMessage -anyResponse = satisfy isServerResponse +anyResponse = named "Any response" $ satisfy isServerResponse response :: forall m a. (MonadIO m, MonadSessionConfig m, FromJSON a) => ConduitParser FromServerMessage m (ResponseMessage a) -response = do +response = named "Response" $ do let parser = decode . encodeMsg :: FromServerMessage -> Maybe (ResponseMessage a) x <- satisfy (isJust . parser) - return $ decodeMsg $ encodeMsg x + return $ castMsg x + +-- | A stupid method for getting out the inner message. +castMsg :: FromJSON a => FromServerMessage -> a +castMsg = fromMaybe (error "Failed casting a message") . decode . encodeMsg -- | A version of encode that encodes FromServerMessages as if they -- weren't wrapped. encodeMsg :: FromServerMessage -> B.ByteString encodeMsg = encode . genericToJSON (defaultOptions { sumEncoding = UntaggedValue }) -decodeMsg :: FromJSON a => B.ByteString -> a -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 :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m FromServerMessage -loggingNotification = satisfy shouldSkip +loggingNotification = named "Logging notification" $ satisfy shouldSkip where shouldSkip (NotLogMessage _) = True shouldSkip (NotShowMessage _) = True @@ -79,7 +80,7 @@ loggingNotification = satisfy shouldSkip shouldSkip _ = False publishDiagnosticsNotification :: (MonadIO m, MonadSessionConfig m) => ConduitParser FromServerMessage m PublishDiagnosticsNotification -publishDiagnosticsNotification = do +publishDiagnosticsNotification = named "Publish diagnostics notification" $ do NotPublishDiagnostics diags <- satisfy test return diags where test (NotPublishDiagnostics _) = True