X-Git-Url: http://git.lukelau.me/?a=blobdiff_plain;f=src%2FLanguage%2FHaskell%2FLSP%2FTest.hs;h=ec290ff9833b0d79af1e861f825d7850a407caf3;hb=70093bf4d0c35a5639a37f1c7946bba44ac76ca6;hp=137cbb7a329e93761f6eb792f9043954d145437d;hpb=eb0bcf9d96d80c05eab5e8bf01e376bfb5df85d8;p=opengl.git diff --git a/src/Language/Haskell/LSP/Test.hs b/src/Language/Haskell/LSP/Test.hs index 137cbb7..ec290ff 100644 --- a/src/Language/Haskell/LSP/Test.hs +++ b/src/Language/Haskell/LSP/Test.hs @@ -52,9 +52,11 @@ module Language.Haskell.LSP.Test , waitForDiagnostics , waitForDiagnosticsSource , noDiagnostics + , getCurrentDiagnostics -- ** Commands , executeCommand -- ** Code Actions + , getCodeActions , getAllCodeActions , executeCodeAction -- ** Completions @@ -349,25 +351,36 @@ noDiagnostics = do when (diagsNot ^. params . LSP.diagnostics /= List []) $ liftIO $ throw UnexpectedDiagnostics -- | Returns the symbols in a document. -getDocumentSymbols :: TextDocumentIdentifier -> Session [SymbolInformation] +getDocumentSymbols :: TextDocumentIdentifier -> Session (Either [DocumentSymbol] [SymbolInformation]) getDocumentSymbols doc = do - ResponseMessage _ rspLid mRes mErr <- request TextDocumentDocumentSymbol (DocumentSymbolParams doc) + ResponseMessage _ rspLid mRes mErr <- request TextDocumentDocumentSymbol (DocumentSymbolParams doc) :: Session DocumentSymbolsResponse maybe (return ()) (throw . UnexpectedResponseError rspLid) mErr - let (Just (List symbols)) = mRes - return symbols + case mRes of + Just (DSDocumentSymbols (List xs)) -> return (Left xs) + 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 [CommandOrCodeAction] +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 -> [CommandOrCodeAction] -> Diagnostic -> Session [CommandOrCodeAction] + go :: CodeActionContext -> [CAResult] -> Diagnostic -> Session [CAResult] go ctx acc diag = do ResponseMessage _ rspLid mRes mErr <- request TextDocumentCodeAction (CodeActionParams doc (diag ^. range) ctx) @@ -377,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