haskell-lsp 0.6.0.0 → 0.7.0.0
raw patch · 11 files changed
+236/−233 lines, 11 filesdep ~aesondep ~haskell-lsp-typesPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: aeson, haskell-lsp-types
API changes (from Hackage documentation)
- Language.Haskell.LSP.Types.Capabilities: capsForVersion :: LSPVersion -> ClientCapabilities
- Language.Haskell.LSP.Types.Capabilities: data LSPVersion
- Language.Haskell.LSP.Types.Capabilities: fullCaps :: ClientCapabilities
+ Language.Haskell.LSP.Core: [colorPresentationHandler] :: Handlers -> !(Maybe (Handler ColorPresentationRequest))
+ Language.Haskell.LSP.Core: [colorProvider] :: Options -> Maybe ColorOptions
+ Language.Haskell.LSP.Core: [didChangeWorkspaceFoldersNotificationHandler] :: Handlers -> !(Maybe (Handler DidChangeWorkspaceFoldersNotification))
+ Language.Haskell.LSP.Core: [documentColorHandler] :: Handlers -> !(Maybe (Handler DocumentColorRequest))
+ Language.Haskell.LSP.Core: [foldingRangeHandler] :: Handlers -> !(Maybe (Handler FoldingRangeRequest))
+ Language.Haskell.LSP.Core: [foldingRangeProvider] :: Options -> Maybe FoldingRangeOptions
+ Language.Haskell.LSP.Core: [getWorkspaceFolders] :: LspFuncs c -> !(IO (Maybe [WorkspaceFolder]))
+ Language.Haskell.LSP.Core: [implementationProvider] :: Options -> Maybe GotoOptions
+ Language.Haskell.LSP.Core: [resWorkspaceFolders] :: LanguageContextData a -> ![WorkspaceFolder]
+ Language.Haskell.LSP.Core: [typeDefinitionHandler] :: Handlers -> !(Maybe (Handler TypeDefinitionRequest))
+ Language.Haskell.LSP.Core: [typeDefinitionProvider] :: Options -> Maybe GotoOptions
+ Language.Haskell.LSP.Messages: NotDidChangeWorkspaceFolders :: DidChangeWorkspaceFoldersNotification -> FromClientMessage
+ Language.Haskell.LSP.Messages: ReqColorPresentation :: ColorPresentationRequest -> FromClientMessage
+ Language.Haskell.LSP.Messages: ReqDocumentColor :: DocumentColorRequest -> FromClientMessage
+ Language.Haskell.LSP.Messages: ReqFoldingRange :: FoldingRangeRequest -> FromClientMessage
+ Language.Haskell.LSP.Messages: ReqImplementation :: ImplementationRequest -> FromClientMessage
+ Language.Haskell.LSP.Messages: ReqTypeDefinition :: TypeDefinitionRequest -> FromClientMessage
+ Language.Haskell.LSP.Messages: RspColorPresentation :: ColorPresentationResponse -> FromServerMessage
+ Language.Haskell.LSP.Messages: RspDocumentColor :: DocumentColorResponse -> FromServerMessage
+ Language.Haskell.LSP.Messages: RspFoldingRange :: FoldingRangeResponse -> FromServerMessage
+ Language.Haskell.LSP.Messages: RspImplementation :: ImplementationResponse -> FromServerMessage
+ Language.Haskell.LSP.Messages: RspTypeDefinition :: TypeDefinitionResponse -> FromServerMessage
- Language.Haskell.LSP.Core: Handlers :: !(Maybe (Handler HoverRequest)) -> !(Maybe (Handler CompletionRequest)) -> !(Maybe (Handler CompletionItemResolveRequest)) -> !(Maybe (Handler SignatureHelpRequest)) -> !(Maybe (Handler ImplementationRequest)) -> !(Maybe (Handler ImplementationRequest)) -> !(Maybe (Handler ReferencesRequest)) -> !(Maybe (Handler DocumentHighlightRequest)) -> !(Maybe (Handler DocumentSymbolRequest)) -> !(Maybe (Handler WorkspaceSymbolRequest)) -> !(Maybe (Handler CodeActionRequest)) -> !(Maybe (Handler CodeLensRequest)) -> !(Maybe (Handler CodeLensResolveRequest)) -> !(Maybe (Handler DocumentFormattingRequest)) -> !(Maybe (Handler DocumentRangeFormattingRequest)) -> !(Maybe (Handler DocumentOnTypeFormattingRequest)) -> !(Maybe (Handler RenameRequest)) -> !(Maybe (Handler DocumentLinkRequest)) -> !(Maybe (Handler DocumentLinkResolveRequest)) -> !(Maybe (Handler ExecuteCommandRequest)) -> !(Maybe (Handler WillSaveWaitUntilTextDocumentRequest)) -> !(Maybe (Handler DidChangeConfigurationNotification)) -> !(Maybe (Handler DidOpenTextDocumentNotification)) -> !(Maybe (Handler DidChangeTextDocumentNotification)) -> !(Maybe (Handler DidCloseTextDocumentNotification)) -> !(Maybe (Handler DidSaveTextDocumentNotification)) -> !(Maybe (Handler DidChangeWatchedFilesNotification)) -> !(Maybe (Handler InitializedNotification)) -> !(Maybe (Handler WillSaveTextDocumentNotification)) -> !(Maybe (Handler CancelNotification)) -> !(Maybe (Handler BareResponseMessage)) -> !(Maybe (Handler InitializeRequest)) -> !(Maybe (Handler ExitNotification)) -> Handlers
+ Language.Haskell.LSP.Core: Handlers :: !(Maybe (Handler HoverRequest)) -> !(Maybe (Handler CompletionRequest)) -> !(Maybe (Handler CompletionItemResolveRequest)) -> !(Maybe (Handler SignatureHelpRequest)) -> !(Maybe (Handler DefinitionRequest)) -> !(Maybe (Handler TypeDefinitionRequest)) -> !(Maybe (Handler ImplementationRequest)) -> !(Maybe (Handler ReferencesRequest)) -> !(Maybe (Handler DocumentHighlightRequest)) -> !(Maybe (Handler DocumentSymbolRequest)) -> !(Maybe (Handler WorkspaceSymbolRequest)) -> !(Maybe (Handler CodeActionRequest)) -> !(Maybe (Handler CodeLensRequest)) -> !(Maybe (Handler CodeLensResolveRequest)) -> !(Maybe (Handler DocumentColorRequest)) -> !(Maybe (Handler ColorPresentationRequest)) -> !(Maybe (Handler DocumentFormattingRequest)) -> !(Maybe (Handler DocumentRangeFormattingRequest)) -> !(Maybe (Handler DocumentOnTypeFormattingRequest)) -> !(Maybe (Handler RenameRequest)) -> !(Maybe (Handler FoldingRangeRequest)) -> !(Maybe (Handler DocumentLinkRequest)) -> !(Maybe (Handler DocumentLinkResolveRequest)) -> !(Maybe (Handler ExecuteCommandRequest)) -> !(Maybe (Handler WillSaveWaitUntilTextDocumentRequest)) -> !(Maybe (Handler DidChangeConfigurationNotification)) -> !(Maybe (Handler DidOpenTextDocumentNotification)) -> !(Maybe (Handler DidChangeTextDocumentNotification)) -> !(Maybe (Handler DidCloseTextDocumentNotification)) -> !(Maybe (Handler DidSaveTextDocumentNotification)) -> !(Maybe (Handler DidChangeWatchedFilesNotification)) -> !(Maybe (Handler DidChangeWorkspaceFoldersNotification)) -> !(Maybe (Handler InitializedNotification)) -> !(Maybe (Handler WillSaveTextDocumentNotification)) -> !(Maybe (Handler CancelNotification)) -> !(Maybe (Handler BareResponseMessage)) -> !(Maybe (Handler InitializeRequest)) -> !(Maybe (Handler ExitNotification)) -> Handlers
- Language.Haskell.LSP.Core: LanguageContextData :: !Int -> !Handlers -> !Options -> !SendFunc -> !VFS -> !DiagnosticStore -> !(Maybe a) -> !(TVar Int) -> LspFuncs a -> !(Maybe FilePath) -> LanguageContextData a
+ Language.Haskell.LSP.Core: LanguageContextData :: !Int -> !Handlers -> !Options -> !SendFunc -> !VFS -> !DiagnosticStore -> !(Maybe a) -> !(TVar Int) -> LspFuncs a -> !(Maybe FilePath) -> ![WorkspaceFolder] -> LanguageContextData a
- Language.Haskell.LSP.Core: LspFuncs :: !ClientCapabilities -> !(IO (Maybe c)) -> !SendFunc -> !(Uri -> IO (Maybe VirtualFile)) -> !PublishDiagnosticsFunc -> !FlushDiagnosticsBySourceFunc -> !(IO LspId) -> !(Maybe FilePath) -> LspFuncs c
+ Language.Haskell.LSP.Core: LspFuncs :: !ClientCapabilities -> !(IO (Maybe c)) -> !SendFunc -> !(Uri -> IO (Maybe VirtualFile)) -> !PublishDiagnosticsFunc -> !FlushDiagnosticsBySourceFunc -> !(IO LspId) -> !(Maybe FilePath) -> !(IO (Maybe [WorkspaceFolder])) -> LspFuncs c
- Language.Haskell.LSP.Core: Options :: Maybe TextDocumentSyncOptions -> Maybe CompletionOptions -> Maybe SignatureHelpOptions -> Maybe CodeLensOptions -> Maybe DocumentOnTypeFormattingOptions -> Maybe DocumentLinkOptions -> Maybe ExecuteCommandOptions -> Options
+ Language.Haskell.LSP.Core: Options :: Maybe TextDocumentSyncOptions -> Maybe CompletionOptions -> Maybe SignatureHelpOptions -> Maybe GotoOptions -> Maybe GotoOptions -> Maybe CodeLensOptions -> Maybe DocumentOnTypeFormattingOptions -> Maybe DocumentLinkOptions -> Maybe ColorOptions -> Maybe FoldingRangeOptions -> Maybe ExecuteCommandOptions -> Options
- Language.Haskell.LSP.Core: [definitionHandler] :: Handlers -> !(Maybe (Handler ImplementationRequest))
+ Language.Haskell.LSP.Core: [definitionHandler] :: Handlers -> !(Maybe (Handler DefinitionRequest))
Files
- ChangeLog.md +18/−0
- haskell-lsp.cabal +11/−6
- src/Language/Haskell/LSP/Core.hs +71/−10
- src/Language/Haskell/LSP/Diagnostics.hs +1/−1
- src/Language/Haskell/LSP/Messages.hs +18/−7
- src/Language/Haskell/LSP/Types.hs +0/−6
- src/Language/Haskell/LSP/Types/Capabilities.hs +0/−202
- src/Language/Haskell/LSP/VFS.hs +1/−1
- test/CapabilitiesSpec.hs +15/−0
- test/ServerCapabilitiesSpec.hs +32/−0
- test/WorkspaceFoldersSpec.hs +69/−0
ChangeLog.md view
@@ -1,5 +1,23 @@ # Revision history for haskell-lsp +## 0.7.0.0 -- 2018-08-14++* Update CompletionItem+ * Add `commitCharacters` field+ * Add `MarkupContent` option for `documentation`+ * Add `preselect` field+* Add CompletionContext+* Add new server capabilities+* Add workspace folder support+* Add document color and color presentation+* Add folding range support+* Add goto type support+* s/TH/Types/g+ * Move all types into haskell-lsp-types+ * Hide Language.Haskell.LSP.TH.DataTypesJSON - Use Language.Haskell.LSP.Types instead+* Add lenses for Language.Haskell.LSP.Types.Capabilities++ ## 0.6.0.0 -- 2018-08-06 * Add new DocumentSymbol type and heirarchal support
haskell-lsp.cabal view
@@ -1,5 +1,5 @@ name: haskell-lsp-version: 0.6.0.0+version: 0.7.0.0 synopsis: Haskell library for the Microsoft Language Server Protocol description: An implementation of the types, and basic message server to@@ -18,23 +18,22 @@ category: Development build-type: Simple extra-source-files: ChangeLog.md, README.md-cabal-version: >=1.10+cabal-version: >=1.22 library+ reexported-modules: Language.Haskell.LSP.Types+ , Language.Haskell.LSP.Types.Capabilities exposed-modules: Language.Haskell.LSP.Capture , Language.Haskell.LSP.Constant , Language.Haskell.LSP.Core , Language.Haskell.LSP.Control , Language.Haskell.LSP.Diagnostics , Language.Haskell.LSP.Messages- , Language.Haskell.LSP.Types- , Language.Haskell.LSP.Types.Capabilities , Language.Haskell.LSP.Utility , Language.Haskell.LSP.VFS -- other-modules: -- other-extensions: ghc-options: -Wall- -- ghc-options: -Werror build-depends: base >=4.9 && <4.12 , aeson >=1.0.0.0 , bytestring@@ -44,7 +43,7 @@ , filepath , hslogger , hashable- , haskell-lsp-types >= 0.6+ , haskell-lsp-types >= 0.7 , lens >= 4.15.2 , mtl , network-uri@@ -93,13 +92,18 @@ hs-source-dirs: test main-is: Main.hs other-modules: Spec+ CapabilitiesSpec DiagnosticsSpec MethodSpec+ ServerCapabilitiesSpec URIFilePathSpec VspSpec+ WorkspaceFoldersSpec build-depends: base , aeson+ , bytestring , containers+ , data-default , directory , filepath , hspec@@ -111,6 +115,7 @@ , yi-rope , haskell-lsp , text+ , stm ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall default-language: Haskell2010
src/Language/Haskell/LSP/Core.hs view
@@ -35,14 +35,15 @@ import qualified Data.HashMap.Strict as HM import qualified Data.List as L import qualified Data.Map as Map+import Data.Maybe import Data.Monoid import qualified Data.Text as T import Data.Text ( Text ) import Language.Haskell.LSP.Capture import Language.Haskell.LSP.Constant import Language.Haskell.LSP.Messages-import qualified Language.Haskell.LSP.TH.ClientCapabilities as C-import qualified Language.Haskell.LSP.TH.DataTypesJSON as J+import qualified Language.Haskell.LSP.Types.Capabilities as C+import qualified Language.Haskell.LSP.Types as J import Language.Haskell.LSP.Utility import Language.Haskell.LSP.VFS import Language.Haskell.LSP.Diagnostics@@ -77,6 +78,7 @@ , resLspId :: !(TVar Int) , resLspFuncs :: LspFuncs a -- NOTE: Cannot be strict, lazy initialization , resCaptureFile :: !(Maybe FilePath)+ , resWorkspaceFolders :: ![J.WorkspaceFolder] } -- ---------------------------------------------------------------------@@ -89,14 +91,20 @@ { textDocumentSync :: Maybe J.TextDocumentSyncOptions , completionProvider :: Maybe J.CompletionOptions , signatureHelpProvider :: Maybe J.SignatureHelpOptions+ , typeDefinitionProvider :: Maybe J.GotoOptions+ , implementationProvider :: Maybe J.GotoOptions , codeLensProvider :: Maybe J.CodeLensOptions , documentOnTypeFormattingProvider :: Maybe J.DocumentOnTypeFormattingOptions , documentLinkProvider :: Maybe J.DocumentLinkOptions+ , colorProvider :: Maybe J.ColorOptions+ , foldingRangeProvider :: Maybe J.FoldingRangeOptions , executeCommandProvider :: Maybe J.ExecuteCommandOptions } instance Default Options where- def = Options Nothing Nothing Nothing Nothing Nothing Nothing Nothing+ def = Options Nothing Nothing Nothing Nothing Nothing+ Nothing Nothing Nothing Nothing Nothing+ Nothing -- | A function to publish diagnostics. It aggregates all diagnostics pertaining -- to a particular version of a document, by source, and sends a@@ -122,6 +130,7 @@ , flushDiagnosticsBySourceFunc :: !FlushDiagnosticsBySourceFunc , getNextReqId :: !(IO J.LspId) , rootPath :: !(Maybe FilePath)+ , getWorkspaceFolders :: !(IO (Maybe [J.WorkspaceFolder])) } -- | The function in the LSP process that is called once the 'initialize'@@ -144,7 +153,8 @@ , completionHandler :: !(Maybe (Handler J.CompletionRequest)) , completionResolveHandler :: !(Maybe (Handler J.CompletionItemResolveRequest)) , signatureHelpHandler :: !(Maybe (Handler J.SignatureHelpRequest))- , definitionHandler :: !(Maybe (Handler J.ImplementationRequest))+ , definitionHandler :: !(Maybe (Handler J.DefinitionRequest))+ , typeDefinitionHandler :: !(Maybe (Handler J.TypeDefinitionRequest)) , implementationHandler :: !(Maybe (Handler J.ImplementationRequest)) , referencesHandler :: !(Maybe (Handler J.ReferencesRequest)) , documentHighlightHandler :: !(Maybe (Handler J.DocumentHighlightRequest))@@ -153,10 +163,13 @@ , codeActionHandler :: !(Maybe (Handler J.CodeActionRequest)) , codeLensHandler :: !(Maybe (Handler J.CodeLensRequest)) , codeLensResolveHandler :: !(Maybe (Handler J.CodeLensResolveRequest))+ , documentColorHandler :: !(Maybe (Handler J.DocumentColorRequest))+ , colorPresentationHandler :: !(Maybe (Handler J.ColorPresentationRequest)) , documentFormattingHandler :: !(Maybe (Handler J.DocumentFormattingRequest)) , documentRangeFormattingHandler :: !(Maybe (Handler J.DocumentRangeFormattingRequest)) , documentTypeFormattingHandler :: !(Maybe (Handler J.DocumentOnTypeFormattingRequest)) , renameHandler :: !(Maybe (Handler J.RenameRequest))+ , foldingRangeHandler :: !(Maybe (Handler J.FoldingRangeRequest)) -- new in 3.0 , documentLinkHandler :: !(Maybe (Handler J.DocumentLinkRequest)) , documentLinkResolveHandler :: !(Maybe (Handler J.DocumentLinkResolveRequest))@@ -173,6 +186,7 @@ , didCloseTextDocumentNotificationHandler :: !(Maybe (Handler J.DidCloseTextDocumentNotification)) , didSaveTextDocumentNotificationHandler :: !(Maybe (Handler J.DidSaveTextDocumentNotification)) , didChangeWatchedFilesNotificationHandler :: !(Maybe (Handler J.DidChangeWatchedFilesNotification))+ , didChangeWorkspaceFoldersNotificationHandler :: !(Maybe (Handler J.DidChangeWorkspaceFoldersNotification)) -- new in 3.0 , initializedHandler :: !(Maybe (Handler J.InitializedNotification)) , willSaveTextDocumentNotificationHandler :: !(Maybe (Handler J.WillSaveTextDocumentNotification))@@ -195,7 +209,8 @@ def = Handlers Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing- Nothing Nothing Nothing Nothing Nothing Nothing+ Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing+ Nothing Nothing -- --------------------------------------------------------------------- nop :: a -> b -> IO a@@ -236,6 +251,7 @@ exitSuccess handlerMap _ h J.CancelRequest = hh nop NotCancelRequestFromClient $ cancelNotificationHandler h -- Workspace+handlerMap _ h J.WorkspaceDidChangeWorkspaceFolders = hwf $ didChangeWorkspaceFoldersNotificationHandler h handlerMap i h J.WorkspaceDidChangeConfiguration = hc i $ didChangeConfigurationParamsHandler h handlerMap _ h J.WorkspaceDidChangeWatchedFiles = hh nop NotDidChangeWatchedFiles $ didChangeWatchedFilesNotificationHandler h handlerMap _ h J.WorkspaceSymbol = hh nop ReqWorkspaceSymbols $ workspaceSymbolHandler h@@ -251,20 +267,24 @@ handlerMap _ h J.CompletionItemResolve = hh nop ReqCompletionItemResolve $ completionResolveHandler h handlerMap _ h J.TextDocumentHover = hh nop ReqHover $ hoverHandler h handlerMap _ h J.TextDocumentSignatureHelp = hh nop ReqSignatureHelp $ signatureHelpHandler h+handlerMap _ h J.TextDocumentDefinition = hh nop ReqDefinition $ definitionHandler h+handlerMap _ h J.TextDocumentTypeDefinition = hh nop ReqTypeDefinition $ definitionHandler h+handlerMap _ h J.TextDocumentImplementation = hh nop ReqImplementation $ implementationHandler h handlerMap _ h J.TextDocumentReferences = hh nop ReqFindReferences $ referencesHandler h handlerMap _ h J.TextDocumentDocumentHighlight = hh nop ReqDocumentHighlights $ documentHighlightHandler h handlerMap _ h J.TextDocumentDocumentSymbol = hh nop ReqDocumentSymbols $ documentSymbolHandler h handlerMap _ h J.TextDocumentFormatting = hh nop ReqDocumentFormatting $ documentFormattingHandler h handlerMap _ h J.TextDocumentRangeFormatting = hh nop ReqDocumentRangeFormatting $ documentRangeFormattingHandler h handlerMap _ h J.TextDocumentOnTypeFormatting = hh nop ReqDocumentOnTypeFormatting $ documentTypeFormattingHandler h-handlerMap _ h J.TextDocumentDefinition = hh nop ReqDefinition $ definitionHandler h-handlerMap _ h J.TextDocumentImplementation = hh nop ReqDefinition $ implementationHandler h handlerMap _ h J.TextDocumentCodeAction = hh nop ReqCodeAction $ codeActionHandler h handlerMap _ h J.TextDocumentCodeLens = hh nop ReqCodeLens $ codeLensHandler h handlerMap _ h J.CodeLensResolve = hh nop ReqCodeLensResolve $ codeLensResolveHandler h+handlerMap _ h J.TextDocumentDocumentColor = hh nop ReqDocumentColor $ documentColorHandler h+handlerMap _ h J.TextDocumentColorPresentation = hh nop ReqColorPresentation $ colorPresentationHandler h handlerMap _ h J.TextDocumentDocumentLink = hh nop ReqDocumentLink $ documentLinkHandler h handlerMap _ h J.DocumentLinkResolve = hh nop ReqDocumentLinkResolve $ documentLinkResolveHandler h handlerMap _ h J.TextDocumentRename = hh nop ReqRename $ renameHandler h+handlerMap _ h J.TextDocumentFoldingRanges = hh nop ReqFoldingRange $ foldingRangeHandler h handlerMap _ _ (J.Misc x) = helper f where f :: TVar (LanguageContextData c) -> J.Value -> IO () f tvarDat n = do@@ -326,7 +346,22 @@ let msg = T.pack $ unwords $ ["haskell-lsp:parse error.", show json, show err] ++ _ERR_MSG_URL sendErrorLog tvarDat msg +-- | Updates the list of workspace folders and then delegates back to 'hh'+hwf :: Maybe (Handler J.DidChangeWorkspaceFoldersNotification) -> TVar (LanguageContextData c) -> J.Value -> IO ()+hwf h tvarDat json = do+ case J.fromJSON json :: J.Result J.DidChangeWorkspaceFoldersNotification of+ J.Success (J.NotificationMessage _ _ params) -> atomically $ do + oldWfs <- resWorkspaceFolders <$> readTVar tvarDat+ let J.List toRemove = params ^. J.event . J.removed+ wfs0 = foldr L.delete oldWfs toRemove+ J.List toAdd = params ^. J.event . J.added+ wfs1 = wfs0 <> toAdd++ modifyTVar' tvarDat (\c -> c {resWorkspaceFolders = wfs1})+ _ -> return ()+ hh nop NotDidChangeWorkspaceFolders h tvarDat json+ -- --------------------------------------------------------------------- getVirtualFile :: TVar (LanguageContextData c) -> J.Uri -> IO (Maybe VirtualFile)@@ -371,7 +406,7 @@ -- defaultLanguageContextData :: Handlers -> Options -> LspFuncs c -> TVar Int -> SendFunc -> Maybe FilePath -> LanguageContextData c defaultLanguageContextData h o lf tv sf cf =- LanguageContextData _INITIAL_RESPONSE_SEQUENCE h o sf mempty mempty Nothing tv lf cf+ LanguageContextData _INITIAL_RESPONSE_SEQUENCE h o sf mempty mempty Nothing tv lf cf mempty -- --------------------------------------------------------------------- @@ -500,6 +535,12 @@ Just handler -> handler req Nothing -> return () + let wfs = case params ^. J.workspaceFolders of+ Just (J.List xs) -> xs+ Nothing -> []++ atomically $ modifyTVar' tvarCtx (\c -> c { resWorkspaceFolders = wfs })+ ctx0 <- readTVarIO tvarCtx -- capture initialize request@@ -516,12 +557,20 @@ let getCapabilities :: J.InitializeParams -> C.ClientCapabilities- getCapabilities (J.InitializeParams _ _ _ _ c _) = c+ getCapabilities (J.InitializeParams _ _ _ _ c _ _) = c getLspId tvId = atomically $ do cid <- readTVar tvId modifyTVar' tvId (+1) return $ J.IdInt cid + clientSupportsWfs = fromMaybe False $ do+ let (C.ClientCapabilities mw _ _) = params ^. J.capabilities+ (C.WorkspaceClientCapabilities _ _ _ _ _ _ mwf _) <- mw+ mwf+ getWfs tvc+ | clientSupportsWfs = atomically $ Just . resWorkspaceFolders <$> readTVar tvc+ | otherwise = return Nothing+ -- Launch the given process once the project root directory has been set let lspFuncs = LspFuncs (getCapabilities params) (getConfig tvarCtx)@@ -531,6 +580,7 @@ (flushDiagnosticsBySource tvarCtx) (getLspId $ resLspId ctx0) rootDir+ (getWfs tvarCtx) let ctx = ctx0 { resLspFuncs = lspFuncs } atomically $ writeTVar tvarCtx ctx @@ -553,6 +603,13 @@ Just x -> Just (J.TDSOptions x) Nothing -> Nothing + workspace = J.WorkspaceOptions workspaceFolder+ workspaceFolder = case didChangeWorkspaceFoldersNotificationHandler h of+ Just _ -> Just $+ -- sign up to receive notifications+ J.WorkspaceFolderOptions (Just True) (Just (J.WorkspaceFolderChangeNotificationsBool True))+ Nothing -> Nothing+ capa = J.InitializeResponseCapabilitiesInner { J._textDocumentSync = sync@@ -560,9 +617,10 @@ , J._completionProvider = completionProvider o , J._signatureHelpProvider = signatureHelpProvider o , J._definitionProvider = supported (definitionHandler h)+ , J._typeDefinitionProvider = typeDefinitionProvider o+ , J._implementationProvider = implementationProvider o , J._referencesProvider = supported (referencesHandler h) , J._documentHighlightProvider = supported (documentHighlightHandler h)- , J._documentSymbolProvider = supported (documentSymbolHandler h) , J._workspaceSymbolProvider = supported (workspaceSymbolHandler h) , J._codeActionProvider = supported (codeActionHandler h)@@ -572,7 +630,10 @@ , J._documentOnTypeFormattingProvider = documentOnTypeFormattingProvider o , J._renameProvider = supported (renameHandler h) , J._documentLinkProvider = documentLinkProvider o+ , J._colorProvider = colorProvider o+ , J._foldingRangeProvider = foldingRangeProvider o , J._executeCommandProvider = executeCommandProvider o+ , J._workspace = Just workspace -- TODO: Add something for experimental , J._experimental = Nothing :: Maybe J.Value }
src/Language/Haskell/LSP/Diagnostics.hs view
@@ -22,7 +22,7 @@ import qualified Data.SortedList as SL import qualified Data.Map as Map-import qualified Language.Haskell.LSP.TH.DataTypesJSON as J+import qualified Language.Haskell.LSP.Types as J -- --------------------------------------------------------------------- {-# ANN module ("hlint: ignore Eta reduce" :: String) #-}
src/Language/Haskell/LSP/Messages.hs view
@@ -2,14 +2,14 @@ {-# LANGUAGE DeriveGeneric #-} module Language.Haskell.LSP.Messages- ( module Language.Haskell.LSP.TH.MessageFuncs+ ( module Language.Haskell.LSP.Types.MessageFuncs , FromClientMessage(..) , FromServerMessage(..) ) where -import Language.Haskell.LSP.TH.MessageFuncs-import Language.Haskell.LSP.TH.DataTypesJSON+import Language.Haskell.LSP.Types.MessageFuncs+import Language.Haskell.LSP.Types import GHC.Generics import Data.Aeson @@ -22,6 +22,8 @@ | ReqCompletionItemResolve CompletionItemResolveRequest | ReqSignatureHelp SignatureHelpRequest | ReqDefinition DefinitionRequest+ | ReqTypeDefinition TypeDefinitionRequest+ | ReqImplementation ImplementationRequest | ReqFindReferences ReferencesRequest | ReqDocumentHighlights DocumentHighlightRequest | ReqDocumentSymbols DocumentSymbolRequest@@ -29,13 +31,16 @@ | ReqCodeAction CodeActionRequest | ReqCodeLens CodeLensRequest | ReqCodeLensResolve CodeLensResolveRequest+ | ReqDocumentLink DocumentLinkRequest+ | ReqDocumentLinkResolve DocumentLinkResolveRequest+ | ReqDocumentColor DocumentColorRequest+ | ReqColorPresentation ColorPresentationRequest | ReqDocumentFormatting DocumentFormattingRequest | ReqDocumentRangeFormatting DocumentRangeFormattingRequest | ReqDocumentOnTypeFormatting DocumentOnTypeFormattingRequest | ReqRename RenameRequest+ | ReqFoldingRange FoldingRangeRequest | ReqExecuteCommand ExecuteCommandRequest- | ReqDocumentLink DocumentLinkRequest- | ReqDocumentLinkResolve DocumentLinkResolveRequest | ReqWillSaveWaitUntil WillSaveWaitUntilTextDocumentRequest -- Responses | RspApplyWorkspaceEdit ApplyWorkspaceEditResponse@@ -54,6 +59,7 @@ | NotWillSaveTextDocument WillSaveTextDocumentNotification | NotDidSaveTextDocument DidSaveTextDocumentNotification | NotDidChangeWatchedFiles DidChangeWatchedFilesNotification+ | NotDidChangeWorkspaceFolders DidChangeWorkspaceFoldersNotification -- Unknown (The client sends something we don't understand) | UnknownFromClientMessage Value deriving (Eq,Read,Show,Generic,ToJSON,FromJSON)@@ -72,6 +78,8 @@ | RspCompletionItemResolve CompletionItemResolveResponse | RspSignatureHelp SignatureHelpResponse | RspDefinition DefinitionResponse+ | RspTypeDefinition TypeDefinitionResponse+ | RspImplementation ImplementationResponse | RspFindReferences ReferencesResponse | RspDocumentHighlights DocumentHighlightsResponse | RspDocumentSymbols DocumentSymbolsResponse@@ -79,14 +87,17 @@ | RspCodeAction CodeActionResponse | RspCodeLens CodeLensResponse | RspCodeLensResolve CodeLensResolveResponse+ | RspDocumentLink DocumentLinkResponse+ | RspDocumentLinkResolve DocumentLinkResolveResponse+ | RspDocumentColor DocumentColorResponse+ | RspColorPresentation ColorPresentationResponse | RspDocumentFormatting DocumentFormattingResponse | RspDocumentRangeFormatting DocumentRangeFormattingResponse | RspDocumentOnTypeFormatting DocumentOnTypeFormattingResponse | RspRename RenameResponse+ | RspFoldingRange FoldingRangeResponse | RspExecuteCommand ExecuteCommandResponse | RspError ErrorResponse- | RspDocumentLink DocumentLinkResponse- | RspDocumentLinkResolve DocumentLinkResolveResponse | RspWillSaveWaitUntil WillSaveWaitUntilTextDocumentResponse -- Notifications | NotPublishDiagnostics PublishDiagnosticsNotification
− src/Language/Haskell/LSP/Types.hs
@@ -1,6 +0,0 @@-module Language.Haskell.LSP.Types- (- module Language.Haskell.LSP.TH.DataTypesJSON- ) where--import Language.Haskell.LSP.TH.DataTypesJSON
− src/Language/Haskell/LSP/Types/Capabilities.hs
@@ -1,202 +0,0 @@-module Language.Haskell.LSP.Types.Capabilities- (- module Language.Haskell.LSP.TH.ClientCapabilities- , fullCaps- , LSPVersion- , capsForVersion- ) where--import Prelude hiding (min)-import Language.Haskell.LSP.TH.ClientCapabilities-import Language.Haskell.LSP.TH.DataTypesJSON---- | The whole shebang. The real deal.--- Capabilities for full conformance to the current (v3.10) LSP specification.-fullCaps :: ClientCapabilities-fullCaps = capsForVersion (LSPVersion maxBound maxBound)---- | A specific version of the LSP specification.-data LSPVersion = LSPVersion Int Int -- ^ Construct a major.minor version---- | Capabilities for full conformance to the LSP specification up until a version.--- Some important milestones:------ * 3.9 completion item preselect--- * 3.8 codeAction literals--- * 3.7 related information in diagnostics--- * 3.6 workspace folders, colors, goto type/implementation--- * 3.4 extended completion item and symbol item kinds--- * 3.0 dynamic registration-capsForVersion :: LSPVersion -> ClientCapabilities-capsForVersion (LSPVersion maj min) = ClientCapabilities (Just w) (Just td) Nothing- where- w = WorkspaceClientCapabilities- (Just True)- (Just (WorkspaceEditClientCapabilities (Just True)))- (Just (DidChangeConfigurationClientCapabilities dynamicReg))- (Just (DidChangeWatchedFilesClientCapabilities dynamicReg))- (Just symbol)- (Just (ExecuteClientCapabilities dynamicReg))- (since 3 6 True)- (since 3 6 True)-- symbol = SymbolClientCapabilities- dynamicReg- (since 3 4 symbolKind)-- symbolKind = - SymbolKindClientCapabilities (Just sKs)-- sKs - | maj >= 3 && min >= 4 = List (oldSKs ++ newSKs)- | otherwise = List oldSKs- - oldSKs = [ SkFile- , SkModule- , SkNamespace- , SkPackage- , SkClass- , SkMethod- , SkProperty- , SkField- , SkConstructor- , SkEnum- , SkInterface- , SkFunction- , SkVariable- , SkConstant- , SkString- , SkNumber- , SkBoolean- , SkArray- ]-- newSKs = [ SkObject- , SkKey- , SkNull- , SkEnumMember- , SkStruct- , SkEvent- , SkOperator- , SkTypeParameter- ]-- td = TextDocumentClientCapabilities- (Just sync)- (Just completion)- (Just hover)- (Just signatureHelp)- (Just (ReferencesClientCapabilities dynamicReg))- (Just (DocumentHighlightClientCapabilities dynamicReg))- (Just documentSymbol)- (Just (FormattingClientCapabilities (Just True)))- (Just (RangeFormattingClientCapabilities dynamicReg))- (Just (OnTypeFormattingClientCapabilities dynamicReg))- (Just (DefinitionClientCapabilities dynamicReg))- (since 3 6 (TypeDefinitionClientCapabilities dynamicReg))- (since 3 6 (ImplementationClientCapabilities dynamicReg))- (Just codeAction)- (Just (CodeLensClientCapabilities dynamicReg))- (Just (DocumentLinkClientCapabilities dynamicReg))- (since 3 6 (ColorProviderClientCapabilities dynamicReg))- (Just (RenameClientCapabilities dynamicReg))- (Just (PublishDiagnosticsClientCapabilities (since 3 7 True)))- sync =- SynchronizationTextDocumentClientCapabilities- dynamicReg- (Just True)- (Just True)- (Just True)- - completion =- CompletionClientCapabilities- dynamicReg- (Just completionItem)- (since 3 4 completionItemKind)- (since 3 3 True)-- completionItem = CompletionItemClientCapabilities- (Just True)- (Just True)- (since 3 3 (List [MkPlainText, MkMarkdown]))- (Just True)- (since 3 9 True)-- completionItemKind =- CompletionItemKindClientCapabilities (Just ciKs)-- ciKs- | maj >= 3 && min >= 4 = List (oldCiKs ++ newCiKs)- | otherwise = List oldCiKs-- oldCiKs = [ CiText- , CiMethod- , CiFunction- , CiConstructor- , CiField- , CiVariable- , CiClass- , CiInterface- , CiModule- , CiProperty- , CiUnit- , CiValue- , CiEnum- , CiKeyword- , CiSnippet- , CiColor- , CiFile- , CiReference- ]-- newCiKs = [ CiFolder- , CiEnumMember- , CiConstant- , CiStruct- , CiEvent- , CiOperator- , CiTypeParameter- ]- - hover =- HoverClientCapabilities- dynamicReg- (since 3 3 (List [MkPlainText, MkMarkdown]))-- codeAction = CodeActionClientCapabilities- dynamicReg- (since 3 8 (CodeActionLiteralSupport caKs))- caKs = CodeActionKindClientCapabilities- (List [ CodeActionQuickFix- , CodeActionRefactor- , CodeActionRefactorExtract- , CodeActionRefactorInline- , CodeActionRefactorRewrite- , CodeActionSource- , CodeActionSourceOrganizeImports- ])-- signatureHelp =- SignatureHelpClientCapabilities- dynamicReg- (Just signatureInformation)- - signatureInformation =- SignatureInformationClientCapabilities- (Just (List [MkPlainText, MkMarkdown]))- - documentSymbol = DocumentSymbolClientCapabilities- dynamicReg- (since 3 4 documentSymbolKind)- (since 3 10 True)-- documentSymbolKind =- DocumentSymbolKindClientCapabilities- (Just sKs) -- same as workspace symbol kinds-- dynamicReg- | maj >= 3 = Just True- | otherwise = Nothing- since x y a- | maj >= x && min >= y = Just a- | otherwise = Nothing
src/Language/Haskell/LSP/VFS.hs view
@@ -37,7 +37,7 @@ import qualified Data.HashMap.Strict as HashMap import qualified Data.Map as Map import Data.Maybe-import qualified Language.Haskell.LSP.TH.DataTypesJSON as J+import qualified Language.Haskell.LSP.Types as J import Language.Haskell.LSP.Utility import qualified Yi.Rope as Yi
+ test/CapabilitiesSpec.hs view
@@ -0,0 +1,15 @@+module CapabilitiesSpec where++import Language.Haskell.LSP.Types.Capabilities+import Test.Hspec++spec :: Spec+spec = describe "capabilities" $ do+ it "gives 3.10 capabilities" $+ let ClientCapabilities _ (Just tdcs) _ = capsForVersion (LSPVersion 3 10)+ Just (DocumentSymbolClientCapabilities _ _ mHierarchical) = _documentSymbol tdcs+ in mHierarchical `shouldBe` Just True+ it "gives pre 3.10 capabilities" $+ let ClientCapabilities _ (Just tdcs) _ = capsForVersion (LSPVersion 3 9)+ Just (DocumentSymbolClientCapabilities _ _ mHierarchical) = _documentSymbol tdcs+ in mHierarchical `shouldBe` Nothing
+ test/ServerCapabilitiesSpec.hs view
@@ -0,0 +1,32 @@+{-# LANGUAGE OverloadedStrings #-}+module ServerCapabilitiesSpec where++import Control.Lens.Operators+import Data.Aeson+import Data.Monoid ((<>))+import Language.Haskell.LSP.Types+import Test.Hspec++spec :: Spec+spec = describe "server capabilities" $ do+ describe "folding range options" $ do+ describe "decodes" $ do+ it "just id" $+ let input = "{\"id\": \"abc123\"}"+ in decode input `shouldBe` Just (FoldingRangeOptionsDynamicDocument Nothing (Just "abc123"))+ it "id and document selector" $+ let input = "{\"id\": \"foo\", \"documentSelector\": " <> documentFiltersJson <> "}"+ in decode input `shouldBe` Just (FoldingRangeOptionsDynamicDocument (Just documentFilters) (Just "foo"))+ it "static boolean" $+ let input = "true"+ in decode input `shouldBe` Just (FoldingRangeOptionsStatic True)+ describe "encodes" $+ it "just id" $+ encode (FoldingRangeOptionsDynamicDocument Nothing (Just "foo")) `shouldBe` "{\"id\":\"foo\"}"+ it "decodes" $ + let input = "{\"hoverProvider\": true, \"colorProvider\": {\"id\": \"abc123\", \"documentSelector\": " <> documentFiltersJson <> "}}"+ Just caps = decode input :: Maybe InitializeResponseCapabilitiesInner+ in caps ^. colorProvider `shouldBe` Just (ColorOptionsDynamicDocument (Just documentFilters) (Just "abc123"))+ where+ documentFilters = List [DocumentFilter (Just "haskell") Nothing Nothing]+ documentFiltersJson = "[{\"language\": \"haskell\"}]"
+ test/WorkspaceFoldersSpec.hs view
@@ -0,0 +1,69 @@+{-# LANGUAGE OverloadedStrings #-}++module WorkspaceFoldersSpec where++import Control.Concurrent.MVar+import Control.Concurrent.STM+import Data.Aeson+import qualified Data.ByteString.Lazy.Char8 as BSL+import Data.Default+import Language.Haskell.LSP.Core+import Language.Haskell.LSP.Types hiding (error, trace)+import Language.Haskell.LSP.Types.Capabilities+import Test.Hspec++spec :: Spec+spec = describe "workspace folders" $+ it "keeps track of open workspace folders" $ do++ lfVar <- newEmptyMVar++ let initCb :: InitializeCallback ()+ initCb = (const $ Left "", \lf -> putMVar lfVar lf >> return Nothing)+ handlers = def++ tvarLspId <- newTVarIO 0+ tvarCtx <- newTVarIO $+ defaultLanguageContextData handlers def undefined tvarLspId (const $ return ()) Nothing++ let putMsg msg =+ let jsonStr = encode msg+ clStr = BSL.pack $ "Content-Length: " ++ show (BSL.length jsonStr)+ in handleMessage initCb tvarCtx clStr jsonStr++ let starterWorkspaces = List [wf0]+ initParams = InitializeParams + Nothing Nothing (Just (Uri "/foo")) Nothing fullCaps Nothing (Just starterWorkspaces)+ initMsg :: InitializeRequest+ initMsg = RequestMessage "2.0" (IdInt 0) Initialize initParams++ putMsg initMsg++ firstWorkspaces <- readMVar lfVar >>= getWorkspaceFolders+ firstWorkspaces `shouldBe` Just [wf0]+++ putMsg (makeNotif [wf1] [])+ readMVar lfVar >>= \lf -> do+ Just wfs <- getWorkspaceFolders lf+ wfs `shouldContain` [wf1]+ wfs `shouldContain` [wf0]++ putMsg (makeNotif [wf2] [wf1])+ readMVar lfVar >>= \lf -> do+ Just wfs <- getWorkspaceFolders lf+ wfs `shouldNotContain` [wf1]+ wfs `shouldContain` [wf0]+ wfs `shouldContain` [wf2]++ where+ wf0 = WorkspaceFolder "one" "Starter workspace"+ wf1 = WorkspaceFolder "/foo/bar" "My workspace"+ wf2 = WorkspaceFolder "/foo/baz" "My other workspace"++ makeNotif add rmv =+ let addedFolders = List add+ removedFolders = List rmv+ ev = WorkspaceFoldersChangeEvent addedFolders removedFolders+ ps = DidChangeWorkspaceFoldersParams ev+ in NotificationMessage "2.0" WorkspaceDidChangeWorkspaceFolders ps