X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest.hs;h=8e5f21f445e5ae1a4ce8f1f42f2b7909324e57c6;hp=3331c096a7a71e9a84e6cd76348f04faff6aad36;hb=22df37c703e39fa5ebeb130be5785b3a9713c520;hpb=502c8dc3ff63383487536922176330a3f459a462 diff --git a/src/Language/Haskell/LSP/Test.hs b/src/Language/Haskell/LSP/Test.hs index 3331c09..8e5f21f 100644 --- a/src/Language/Haskell/LSP/Test.hs +++ b/src/Language/Haskell/LSP/Test.hs @@ -59,23 +59,29 @@ module Language.Haskell.LSP.Test , (<|>) , satisfy -- * Utilities - , getInitializeResponse + , initializeResponse , openDoc - , getDocItem , documentContents + , documentEdit , getDocUri + , noDiagnostics + , documentSymbols + , ) where import Control.Applicative import Control.Applicative.Combinators -import Control.Monad.IO.Class import Control.Concurrent +import Control.Monad +import Control.Monad.IO.Class +import Control.Exception 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) @@ -158,6 +164,29 @@ documentContents doc = do let file = vfs Map.! (doc ^. uri) return $ Rope.toText $ Language.Haskell.LSP.VFS._text file +-- | Parses an ApplyEditRequest, checks that it is for the passed document +-- and returns the new content +documentEdit :: TextDocumentIdentifier -> Session T.Text +documentEdit doc = do + req <- request :: Session ApplyWorkspaceEditRequest + + unless (checkDocumentChanges req || checkChanges req) $ + liftIO $ throw (IncorrectApplyEditRequestException (show req)) + + documentContents doc + where + checkDocumentChanges :: ApplyWorkspaceEditRequest -> Bool + checkDocumentChanges req = + let changes = req ^. params . edit . documentChanges + maybeDocs = fmap (fmap (^. textDocument . uri)) changes + in case maybeDocs of + Just docs -> (doc ^. uri) `elem` docs + Nothing -> False + checkChanges :: ApplyWorkspaceEditRequest -> Bool + checkChanges req = + let mMap = req ^. params . edit . changes + in maybe False (HashMap.member (doc ^. uri)) mMap + -- | Sends a request to the server. -- -- @ @@ -250,8 +279,8 @@ sendMessage msg = do -- | 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. -getInitializeResponse :: Session InitializeResponse -getInitializeResponse = initRsp <$> ask >>= (liftIO . readMVar) +initializeResponse :: Session InitializeResponse +initializeResponse = initRsp <$> ask >>= (liftIO . readMVar) -- | Opens a text document and sends a notification to the client. openDoc :: FilePath -> String -> Session TextDocumentIdentifier @@ -259,7 +288,7 @@ openDoc file languageId = do item <- getDocItem file languageId sendNotification TextDocumentDidOpen (DidOpenTextDocumentParams item) TextDocumentIdentifier <$> getDocUri file - + where -- | Reads in a text document as the first version. getDocItem :: FilePath -- ^ The path to the text document to read in. -> String -- ^ The language ID, e.g "haskell" for .hs files. @@ -277,3 +306,16 @@ getDocUri file = do let fp = rootDir context file return $ filePathToUri fp +-- | Expects a 'PublishDiagnosticsNotification' and throws an +-- 'UnexpectedDiagnosticsException' if there are any diagnostics +-- returned. +noDiagnostics :: Session () +noDiagnostics = do + diagsNot <- notification :: Session PublishDiagnosticsNotification + when (diagsNot ^. params . diagnostics /= List []) $ liftIO $ throw UnexpectedDiagnosticsException + +-- | Returns the symbols in a document. +documentSymbols :: TextDocumentIdentifier -> Session DocumentSymbolsResponse +documentSymbols doc = do + sendRequest TextDocumentDocumentSymbol (DocumentSymbolParams doc) + response \ No newline at end of file