never executed always true always false
1 module Conjure.LSP.Handlers.Format (formatHandler) where
2
3 import Conjure.LSP.Util (sendErrorMessage, withFile)
4 import Conjure.Language.Parser (prettyPrintWithChecks)
5 import Conjure.Prelude
6 import Control.Lens
7 import Data.Text qualified as T
8 import Language.LSP.Protocol.Lens (params, textDocument)
9 import Language.LSP.Protocol.Message
10 import Language.LSP.Protocol.Types
11 import Language.LSP.Server (Handlers, LspM, requestHandler)
12 import Language.LSP.VFS (virtualFileText)
13 import Prettyprinter qualified as Pr
14 import Prettyprinter.Render.Text (renderStrict)
15
16 formatHandler :: Handlers (LspM ())
17 formatHandler = requestHandler SMethod_TextDocumentFormatting $ \req res -> do
18 let ps = req ^. params . textDocument
19 withFile ps $ \vf -> do
20 let txt = virtualFileText vf
21 case prettyPrintWithChecks txt of
22 Left err -> do
23 sendErrorMessage $ T.pack $ show err
24 pure ()
25 Right d -> do
26 let rendered = renderStrict $ Pr.layoutSmart (Pr.LayoutOptions $ Pr.AvailablePerLine 80 0.8) d
27 res $ Right $ InL $ fullEdit (fromInteger $ toInteger $ Conjure.Prelude.length $ T.lines txt) rendered
28
29 fullEdit :: UInt -> Text -> [TextEdit]
30 fullEdit t d =
31 [ TextEdit (Range (Position 0 0) (Position t 0)) (d)
32 ]