X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest.hs;h=64100a4ced2d3f606857374e57a2735fc7770158;hb=a4c1143848809be8aed55403dc3187a256dcbe9b;hp=2a6db1fd459e711be61ebe67764d10543c2ef342;hpb=d8e460543b7cbc32550bed20d20ef4b13d6705a5;p=lsp-test.git diff --git a/src/Language/Haskell/LSP/Test.hs b/src/Language/Haskell/LSP/Test.hs index 2a6db1f..64100a4 100644 --- a/src/Language/Haskell/LSP/Test.hs +++ b/src/Language/Haskell/LSP/Test.hs @@ -22,6 +22,7 @@ module Language.Haskell.LSP.Test , MonadSessionConfig(..) , SessionException(..) , anySessionException + , withTimeout -- * Sending , sendRequest , sendRequest_ @@ -31,12 +32,10 @@ module Language.Haskell.LSP.Test , sendNotification' , sendResponse -- * Receving + , message , anyRequest - , request , anyResponse - , response , anyNotification - , notification , anyMessage , loggingNotification , publishDiagnosticsNotification @@ -63,14 +62,21 @@ module Language.Haskell.LSP.Test , satisfy -- * Utilities , initializeResponse + -- ** Documents , openDoc , documentContents , getDocumentEdit , getDocUri - , noDiagnostics + -- ** Symbols , getDocumentSymbols + -- ** Diagnostics , waitForDiagnostics + , noDiagnostics + -- ** Commands + , executeCommand + -- ** Code Actions , getAllCodeActions + , executeCodeAction ) where import Control.Applicative @@ -83,13 +89,13 @@ import Control.Lens hiding ((.=), List) import qualified Data.Text as T import qualified Data.Text.IO as T import Data.Aeson -import qualified Data.ByteString.Lazy.Char8 as B import Data.Default import qualified Data.HashMap.Strict as HashMap import qualified Data.Map as Map import Data.Maybe -import Language.Haskell.LSP.Types hiding (id, capabilities) +import Language.Haskell.LSP.Types hiding (id, capabilities, message) import qualified Language.Haskell.LSP.Types as LSP +import Language.Haskell.LSP.Messages import Language.Haskell.LSP.VFS import Language.Haskell.LSP.Test.Compat import Language.Haskell.LSP.Test.Decoding @@ -97,7 +103,6 @@ import Language.Haskell.LSP.Test.Exceptions import Language.Haskell.LSP.Test.Parsing import Language.Haskell.LSP.Test.Session import Language.Haskell.LSP.Test.Server -import System.Console.ANSI import System.IO import System.Directory import System.FilePath @@ -145,20 +150,19 @@ runSessionWithConfig config serverExe rootDir session = do sendNotification Exit ExitParams return result - + where -- | Listens to the server output, makes sure it matches the record and -- signals any semaphores -listenServer :: Handle -> Session () -listenServer serverOut = do - msgBytes <- liftIO $ getNextMessage serverOut + listenServer :: Handle -> SessionContext -> IO () + listenServer serverOut context = do + msgBytes <- getNextMessage serverOut - context <- ask - reqMap <- liftIO $ readMVar $ requestMap context + reqMap <- readMVar $ requestMap context let msg = decodeFromServerMsg reqMap msgBytes - liftIO $ writeChan (messageChan context) msg + writeChan (messageChan context) (ServerMessage msg) - listenServer serverOut + listenServer serverOut context -- | The current text contents of a document. documentContents :: TextDocumentIdentifier -> Session T.Text @@ -171,7 +175,7 @@ documentContents doc = do -- and returns the new content getDocumentEdit :: TextDocumentIdentifier -> Session T.Text getDocumentEdit doc = do - req <- request :: Session ApplyWorkspaceEditRequest + req <- message :: Session ApplyWorkspaceEditRequest unless (checkDocumentChanges req || checkChanges req) $ liftIO $ throw (IncorrectApplyEditRequestException (show req)) @@ -280,20 +284,6 @@ sendNotification' = sendMessage sendResponse :: ToJSON a => ResponseMessage a -> Session () sendResponse = sendMessage -sendMessage :: ToJSON a => a -> Session () -sendMessage msg = do - h <- serverIn <$> ask - let encoded = encode msg - liftIO $ do - - setSGR [SetColor Foreground Vivid Cyan] - putStrLn $ "--> " ++ B.unpack encoded - setSGR [Reset] - - B.hPut h (addHeader encoded) - - - -- | Returns the initialize response that was received from the server. -- The initialize requests and responses are not included the session, -- so if you need to test it use this. @@ -326,7 +316,7 @@ getDocUri file = do waitForDiagnostics :: Session [Diagnostic] waitForDiagnostics = do - diagsNot <- skipManyTill anyMessage notification :: Session PublishDiagnosticsNotification + diagsNot <- skipManyTill anyMessage message :: Session PublishDiagnosticsNotification let (List diags) = diagsNot ^. params . LSP.diagnostics return diags @@ -335,7 +325,7 @@ waitForDiagnostics = do -- returned. noDiagnostics :: Session () noDiagnostics = do - diagsNot <- notification :: Session PublishDiagnosticsNotification + diagsNot <- message :: Session PublishDiagnosticsNotification when (diagsNot ^. params . LSP.diagnostics /= List []) $ liftIO $ throw UnexpectedDiagnosticsException -- | Returns the symbols in a document. @@ -363,3 +353,19 @@ getAllCodeActions doc = do Nothing -> let Just (List cmdOrCAs) = mRes in return (acc ++ cmdOrCAs) + +executeCommand :: Command -> Session () +executeCommand cmd = do + let args = decode $ encode $ fromJust $ cmd ^. arguments + execParams = ExecuteCommandParams (cmd ^. command) args + sendRequest_ WorkspaceExecuteCommand execParams + +executeCodeAction :: CodeAction -> Session () +executeCodeAction action = do + maybe (return ()) handleEdit $ action ^. edit + maybe (return ()) executeCommand $ action ^. command + + where handleEdit :: WorkspaceEdit -> Session () + handleEdit e = + let req = RequestMessage "" (IdInt 0) WorkspaceApplyEdit (ApplyWorkspaceEditParams e) + in updateState (ReqApplyWorkspaceEdit req)