-processTextChanges :: FromServerMessage -> Session ()
-processTextChanges (ReqApplyWorkspaceEdit r) = do
- List changeParams <- case r ^. params . edit . documentChanges of
- Just cs -> mapM applyTextDocumentEdit cs
- Nothing -> case r ^. params . edit . changes of
- Just cs -> mapM (uncurry applyTextEdit) (List (HashMap.toList cs))
- Nothing -> return (List [])
-
- let groupedParams = groupBy (\a b -> (a ^. textDocument == b ^. textDocument)) changeParams
- mergedParams = map mergeParams groupedParams
-
- forM_ mergedParams (sendNotification TextDocumentDidChange)
-
- where applyTextDocumentEdit (TextDocumentEdit docId (List edits)) = do
- oldVFS <- vfs <$> get
- let changeEvents = map (\e -> TextDocumentContentChangeEvent (Just (e ^. range)) Nothing (e ^. newText)) edits
- params = DidChangeTextDocumentParams docId (List changeEvents)
- newVFS <- liftIO $ changeVFS oldVFS (fmClientDidChangeTextDocumentNotification params)
- modify (\s -> s { vfs = newVFS })
- return params
-
- applyTextEdit uri edits = applyTextDocumentEdit (TextDocumentEdit (VersionedTextDocumentIdentifier uri 0) edits)
-
- mergeParams :: [DidChangeTextDocumentParams] -> DidChangeTextDocumentParams
- mergeParams params = let events = concat (toList (map (toList . (^. contentChanges)) params))
- in DidChangeTextDocumentParams (head params ^. textDocument) (List events)
-processTextChanges _ = return ()
+-- | The current text contents of a document.
+documentContents :: TextDocumentIdentifier -> Session T.Text
+documentContents doc = do
+ vfs <- vfs <$> get
+ let file = vfs Map.! (doc ^. uri)
+ return $ Rope.toText $ Language.Haskell.LSP.VFS._text file