Add rename
authorLuke Lau <luke_lau@icloud.com>
Thu, 12 Jul 2018 14:30:10 +0000 (15:30 +0100)
committerLuke Lau <luke_lau@icloud.com>
Thu, 12 Jul 2018 14:30:10 +0000 (15:30 +0100)
src/Language/Haskell/LSP/Test.hs
test/Test.hs
test/data/Error.hs [moved from test/data/error/Error.hs with 100% similarity]
test/data/Rename.hs [new file with mode: 0644]

index 3def44000291d1e495cdc3924be80da94a4762b8..c5090f939c8c669f44e65a5d04d698d2bb7a6350 100644 (file)
@@ -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)
+
index eedc887b580094afacc611c0888dac6eae348756..6353e09b99ca5b59503bdad8d65bca5e2ee7ecec 100644 (file)
@@ -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
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 (file)
index 0000000..13e4d96
--- /dev/null
@@ -0,0 +1,2 @@
+main = foo
+foo = return 42