Add getCodeActions, getCurrentDiagnostics, bump
authorLuke Lau <luke_lau@icloud.com>
Tue, 14 Aug 2018 21:34:34 +0000 (22:34 +0100)
committerLuke Lau <luke_lau@icloud.com>
Tue, 14 Aug 2018 21:34:34 +0000 (22:34 +0100)
ChangeLog.md
lsp-test.cabal
src/Language/Haskell/LSP/Test.hs
test/Test.hs

index ca5db5f1d8d8196dc99ce2df5926be64c5c45202..5a87f0d3dc2a79d5d0f404264f68aede25ee5104 100644 (file)
@@ -1,5 +1,10 @@
 # Revision history for lsp-test
 
+## 0.2.1.0 -- 2018-08-14
+
+* Add getCodeActions
+* Add getCurrentDiagnostics
+
 ## 0.2.0.0 -- 2018-08-06
 
 * Update to haskell-lsp 0.6.0.0
index b191b6ca24769cac20ddb7f27bb6adfbf28834f1..85ade4ce95df79fcc679c4b6062980b9bc00e8bf 100644 (file)
@@ -1,5 +1,5 @@
 name:                lsp-test
-version:             0.2.0.0
+version:             0.2.1.0
 synopsis:            Functional test framework for LSP servers.
 description:
   A test framework for writing tests against 
index 04fcc21a7f9510a10f4acc0c0eb012a24321db21..ec290ff9833b0d79af1e861f825d7850a407caf3 100644 (file)
@@ -52,9 +52,11 @@ module Language.Haskell.LSP.Test
   , waitForDiagnostics
   , waitForDiagnosticsSource
   , noDiagnostics
+  , getCurrentDiagnostics
   -- ** Commands
   , executeCommand
   -- ** Code Actions
+  , getCodeActions
   , getAllCodeActions
   , executeCodeAction
   -- ** Completions
@@ -358,15 +360,24 @@ getDocumentSymbols doc = do
     Just (DSSymbolInformation (List xs)) -> return (Right xs)
     Nothing -> Prelude.error "No result and no error in DocumentSymbolsResponse"
 
+-- | Returns the code actions in the specified range.
+getCodeActions :: TextDocumentIdentifier -> Range -> Session [CAResult]
+getCodeActions doc range = do
+  ctx <- getCodeActionContext doc
+  rsp <- request TextDocumentCodeAction (CodeActionParams doc range ctx)
+
+  case rsp ^. result of
+    Just (List xs) -> return xs
+    _ -> throw (UnexpectedResponseError (rsp ^. LSP.id) (fromJust $ rsp ^. LSP.error))
+
 -- | Returns all the code actions in a document by 
 -- querying the code actions at each of the current 
 -- diagnostics' positions.
 getAllCodeActions :: TextDocumentIdentifier -> Session [CAResult]
 getAllCodeActions doc = do
-  curDiags <- fromMaybe [] . Map.lookup (doc ^. uri) . curDiagnostics <$> get
-  let ctx = CodeActionContext (List curDiags) Nothing
+  ctx <- getCodeActionContext doc
 
-  foldM (go ctx) [] curDiags
+  foldM (go ctx) [] =<< getCurrentDiagnostics doc
 
   where
     go :: CodeActionContext -> [CAResult] -> Diagnostic -> Session [CAResult]
@@ -379,6 +390,16 @@ getAllCodeActions doc = do
           let Just (List cmdOrCAs) = mRes
             in return (acc ++ cmdOrCAs)
 
+getCodeActionContext :: TextDocumentIdentifier -> Session CodeActionContext
+getCodeActionContext doc = do
+  curDiags <- getCurrentDiagnostics doc
+  return $ CodeActionContext (List curDiags) Nothing
+
+-- | Returns the current diagnostics that have been sent to the client.
+-- Note that this does not wait for more to come in.
+getCurrentDiagnostics :: TextDocumentIdentifier -> Session [Diagnostic]
+getCurrentDiagnostics doc = fromMaybe [] . Map.lookup (doc ^. uri) . curDiagnostics <$> get
+
 -- | Executes a command.
 executeCommand :: Command -> Session ()
 executeCommand cmd = do
index d524ee4ffe15c666c8feaabdd5c518e804782a58..88c6852eadd43d885bc5cef1217bee08cffe18e8 100644 (file)
@@ -176,6 +176,13 @@ main = hspec $ do
         liftIO $ contents `shouldBe` "main :: IO Int\nmain = return 42\n"
         noDiagnostics
 
+  describe "getCodeActions" $
+    it "works" $ runSession "hie" fullCaps "test/data/refactor" $ do
+      doc <- openDoc "Main.hs" "haskell"
+      waitForDiagnostics
+      [CACodeAction action] <- getCodeActions doc (Range (Position 1 14) (Position 1 18))
+      liftIO $ action ^. title `shouldBe` "Apply hint:Redundant bracket"
+
   describe "getAllCodeActions" $
     it "works" $ runSession "hie --lsp" fullCaps "test/data/refactor" $ do
       doc <- openDoc "Main.hs" "haskell"