-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 })
- liftIO $ print 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
+
+-- | Parses an ApplyEditRequest, checks that it is for the passed document
+-- and returns the new content
+getDocumentEdit :: TextDocumentIdentifier -> Session T.Text
+getDocumentEdit doc = do
+ req <- request :: Session ApplyWorkspaceEditRequest
+
+ unless (checkDocumentChanges req || checkChanges req) $
+ liftIO $ throw (IncorrectApplyEditRequestException (show req))
+
+ documentContents doc
+ where
+ checkDocumentChanges :: ApplyWorkspaceEditRequest -> Bool
+ checkDocumentChanges req =
+ let changes = req ^. params . edit . documentChanges
+ maybeDocs = fmap (fmap (^. textDocument . uri)) changes
+ in case maybeDocs of
+ Just docs -> (doc ^. uri) `elem` docs
+ Nothing -> False
+ checkChanges :: ApplyWorkspaceEditRequest -> Bool
+ checkChanges req =
+ let mMap = req ^. params . edit . changes
+ in maybe False (HashMap.member (doc ^. uri)) mMap