From: Luke Lau Date: Thu, 12 Jul 2018 14:30:10 +0000 (+0100) Subject: Add rename X-Git-Url: http://git.lukelau.me/?p=opengl.git;a=commitdiff_plain;h=b39cc258cdffae26e2a783470995df73e4099070 Add rename --- diff --git a/src/Language/Haskell/LSP/Test.hs b/src/Language/Haskell/LSP/Test.hs index 3def440..c5090f9 100644 --- a/src/Language/Haskell/LSP/Test.hs +++ b/src/Language/Haskell/LSP/Test.hs @@ -63,6 +63,8 @@ module Language.Haskell.LSP.Test , getCompletions -- ** References , getReferences + -- ** Renaming + , rename -- ** Edits , applyEdit ) where @@ -422,15 +424,33 @@ getCompletions :: TextDocumentIdentifier -> Position -> Session [CompletionItem] getCompletions doc pos = do rsp <- sendRequest TextDocumentCompletion (TextDocumentPositionParams doc pos) - let exc = throw $ UnexpectedResponseError (rsp ^. LSP.id) - (fromJust $ rsp ^. LSP.error) - res = fromMaybe exc (rsp ^. result) - case res of + case getResponseResult rsp of Completions (List items) -> return items CompletionList (CompletionListType _ (List items)) -> return items -getReferences :: TextDocumentIdentifier -> Position -> Bool -> Session [Location] +-- | Returns the references for the position in the document. +getReferences :: TextDocumentIdentifier -- ^ The document to lookup in. + -> Position -- ^ The position to lookup. + -> Bool -- ^ Whether to include declarations as references. + -> Session [Location] -- ^ The locations of the references. getReferences doc pos inclDecl = let ctx = ReferenceContext inclDecl params = ReferenceParams doc pos ctx in fromMaybe [] . (^. result) <$> sendRequest TextDocumentReferences params + +-- ^ Renames the term at the specified position. +rename :: TextDocumentIdentifier -> Position -> String -> Session () +rename doc pos newName = do + let params = RenameParams doc pos (T.pack newName) + rsp <- sendRequest TextDocumentRename params :: Session RenameResponse + let wEdit = getResponseResult rsp + req = RequestMessage "" (IdInt 0) WorkspaceApplyEdit (ApplyWorkspaceEditParams wEdit) + updateState (ReqApplyWorkspaceEdit req) + +-- | Checks the response for errors and throws an exception if needed. +-- Returns the result if successful. +getResponseResult :: ResponseMessage a -> a +getResponseResult rsp = fromMaybe exc (rsp ^. result) + where exc = throw $ UnexpectedResponseError (rsp ^. LSP.id) + (fromJust $ rsp ^. LSP.error) + diff --git a/test/Test.hs b/test/Test.hs index eedc887..6353e09 100644 --- a/test/Test.hs +++ b/test/Test.hs @@ -239,13 +239,19 @@ main = hspec $ do ] describe "waitForDiagnosticsSource" $ - it "works" $ runSession "hie --lsp" "test/data/error" $ do + it "works" $ runSession "hie --lsp" "test/data" $ do openDoc "Error.hs" "haskell" [diag] <- waitForDiagnosticsSource "ghcmod" liftIO $ do diag ^. severity `shouldBe` Just DsError diag ^. source `shouldBe` Just "ghcmod" + describe "rename" $ + it "works" $ runSession "hie --lsp" "test/data" $ do + doc <- openDoc "Rename.hs" "haskell" + rename doc (Position 1 0) "bar" + documentContents doc >>= liftIO . shouldBe "main = bar\nbar = return 42\n" + mkRange sl sc el ec = Range (Position sl sc) (Position el ec) didChangeCaps :: ClientCapabilities diff --git a/test/data/error/Error.hs b/test/data/Error.hs similarity index 100% rename from test/data/error/Error.hs rename to test/data/Error.hs diff --git a/test/data/Rename.hs b/test/data/Rename.hs new file mode 100644 index 0000000..13e4d96 --- /dev/null +++ b/test/data/Rename.hs @@ -0,0 +1,2 @@ +main = foo +foo = return 42