X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest.hs;h=b648078b8c1fe14ece70330755867b25a6bb63c8;hb=35ce787a5458ffdce71923e40464448d6ea71801;hp=c5090f939c8c669f44e65a5d04d698d2bb7a6350;hpb=b39cc258cdffae26e2a783470995df73e4099070;p=lsp-test.git diff --git a/src/Language/Haskell/LSP/Test.hs b/src/Language/Haskell/LSP/Test.hs index c5090f9..b648078 100644 --- a/src/Language/Haskell/LSP/Test.hs +++ b/src/Language/Haskell/LSP/Test.hs @@ -9,7 +9,9 @@ -- Maintainer : luke_lau@icloud.com -- Stability : experimental -- --- A framework for testing at the JSON level. +-- A framework for testing +-- +-- functionally. module Language.Haskell.LSP.Test ( @@ -63,8 +65,17 @@ module Language.Haskell.LSP.Test , getCompletions -- ** References , getReferences + -- ** Definitions + , getDefinitions -- ** Renaming , rename + -- ** Hover + , getHover + -- ** Highlights + , getHighlights + -- ** Formatting + , formatDoc + , formatRange -- ** Edits , applyEdit ) where @@ -436,7 +447,15 @@ getReferences :: TextDocumentIdentifier -- ^ The document to lookup in. getReferences doc pos inclDecl = let ctx = ReferenceContext inclDecl params = ReferenceParams doc pos ctx - in fromMaybe [] . (^. result) <$> sendRequest TextDocumentReferences params + in getResponseResult <$> sendRequest TextDocumentReferences params + +-- | Returns the definition(s) for the term at the specified position. +getDefinitions :: TextDocumentIdentifier -- ^ The document the term is in. + -> Position -- ^ The position the term is at. + -> Session [Location] -- ^ The location(s) of the definitions +getDefinitions doc pos = + let params = TextDocumentPositionParams doc pos + in getResponseResult <$> sendRequest TextDocumentDefinition params -- ^ Renames the term at the specified position. rename :: TextDocumentIdentifier -> Position -> String -> Session () @@ -447,6 +466,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 @@ -454,3 +485,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) +