1 {-# LANGUAGE OverloadedStrings #-}
2 {-# LANGUAGE MultiParamTypeClasses #-}
3 {-# LANGUAGE FlexibleInstances #-}
4 module Language.Haskell.LSP.Test.Parsing where
6 import Language.Haskell.LSP.Messages
7 import Language.Haskell.LSP.Types
8 import Language.Haskell.LSP.Test.Messages
9 import Control.Concurrent
10 import Text.Parsec hiding (satisfy)
13 data MessageParserState = MessageParserState
15 type MessageParser = ParsecT (Chan FromServerMessage) MessageParserState IO
17 notification :: MessageParser FromServerMessage
18 notification = satisfy isServerNotification
20 request :: MessageParser FromServerMessage
21 request = satisfy isServerRequest
23 response :: MessageParser FromServerMessage
24 response = satisfy isServerResponse
26 satisfy :: (Stream s m a, Eq a, Show a) => (a -> Bool) -> ParsecT s u m a
27 satisfy pred = tokenPrim show nextPos test
28 where nextPos x _ _ = x
29 test x = if pred x then Just x else Nothing
31 testLog = NotLogMessage (NotificationMessage "2.0" WindowLogMessage (LogMessageParams MtLog "Hello world"))
33 testSymbols = RspDocumentSymbols (ResponseMessage "2.0" (IdRspInt 0) (Just (List [])) Nothing)
35 instance Stream (Chan a) IO a where
44 n <- count 2 notification
47 forkIO $ forM_ [testLog, testLog, testSymbols] $ \x -> do
50 x <- runParserT parser MessageParserState "" chan