X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest.hs;h=60f13b1be25bdfe867e1d815fdb7668ae5a65630;hb=776b8e1a475e2150797d432f0c13ccf685b1cd4b;hp=d4c63110890707bcbb40a2457ffb2ac68b844590;hpb=9b78d100e96d3ea4c059edbc45d3d084dddcab0a;p=lsp-test.git diff --git a/src/Language/Haskell/LSP/Test.hs b/src/Language/Haskell/LSP/Test.hs index d4c6311..60f13b1 100644 --- a/src/Language/Haskell/LSP/Test.hs +++ b/src/Language/Haskell/LSP/Test.hs @@ -46,6 +46,7 @@ module Language.Haskell.LSP.Test , initializeResponse -- ** Documents , openDoc + , closeDoc , documentContents , getDocumentEdit , getDocUri @@ -69,6 +70,13 @@ module Language.Haskell.LSP.Test , getDefinitions -- ** Renaming , rename + -- ** Hover + , getHover + -- ** Highlights + , getHighlights + -- ** Formatting + , formatDoc + , formatRange -- ** Edits , applyEdit ) where @@ -301,6 +309,17 @@ openDoc file languageId = do contents <- liftIO $ T.readFile fp return $ TextDocumentItem (filePathToUri fp) (T.pack languageId) 0 contents +-- | Closes a text document and sends a notification to the client. +closeDoc :: TextDocumentIdentifier -> Session () +closeDoc docId = do + let params = DidCloseTextDocumentParams (TextDocumentIdentifier (docId ^. uri)) + sendNotification TextDocumentDidClose params + + oldVfs <- vfs <$> get + let notif = NotificationMessage "" TextDocumentDidClose params + newVfs <- liftIO $ closeVFS oldVfs notif + modify $ \s -> s { vfs = newVfs } + -- | Gets the Uri for the file corrected to the session directory. getDocUri :: FilePath -> Session Uri getDocUri file = do @@ -459,6 +478,18 @@ rename doc pos newName = do req = RequestMessage "" (IdInt 0) WorkspaceApplyEdit (ApplyWorkspaceEditParams wEdit) updateState (ReqApplyWorkspaceEdit req) +-- | Returns the hover information at the specified position. +getHover :: TextDocumentIdentifier -> Position -> Session (Maybe Hover) +getHover doc pos = + let params = TextDocumentPositionParams doc pos + in getResponseResult <$> sendRequest TextDocumentHover params + +-- | Returns the highlighted occurences of the term at the specified position +getHighlights :: TextDocumentIdentifier -> Position -> Session [DocumentHighlight] +getHighlights doc pos = + let params = TextDocumentPositionParams doc pos + in getResponseResult <$> sendRequest TextDocumentDocumentHighlight params + -- | Checks the response for errors and throws an exception if needed. -- Returns the result if successful. getResponseResult :: ResponseMessage a -> a @@ -466,3 +497,23 @@ getResponseResult rsp = fromMaybe exc (rsp ^. result) where exc = throw $ UnexpectedResponseError (rsp ^. LSP.id) (fromJust $ rsp ^. LSP.error) +-- | Applies formatting to the specified document. +formatDoc :: TextDocumentIdentifier -> FormattingOptions -> Session () +formatDoc doc opts = do + let params = DocumentFormattingParams doc opts + edits <- getResponseResult <$> sendRequest TextDocumentFormatting params + applyTextEdits doc edits + +-- | Applies formatting to the specified range in a document. +formatRange :: TextDocumentIdentifier -> FormattingOptions -> Range -> Session () +formatRange doc opts range = do + let params = DocumentRangeFormattingParams doc range opts + edits <- getResponseResult <$> sendRequest TextDocumentRangeFormatting params + applyTextEdits doc edits + +applyTextEdits :: TextDocumentIdentifier -> List TextEdit -> Session () +applyTextEdits doc edits = + let wEdit = WorkspaceEdit (Just (HashMap.singleton (doc ^. uri) edits)) Nothing + req = RequestMessage "" (IdInt 0) WorkspaceApplyEdit (ApplyWorkspaceEditParams wEdit) + in updateState (ReqApplyWorkspaceEdit req) +