never executed always true always false
1 module Conjure.LSP.Handlers.Hover where
2
3 import Conjure.LSP.Documentation (getDocsForBuiltin)
4 import Conjure.LSP.Util (ProcessedFile (ProcessedFile), getRelevantRegions, snippet, withProcessedDoc)
5 import Conjure.Language.Pretty qualified as CPr
6 import Conjure.Language.Validator (RegionInfo (..), RegionType (..))
7 import Conjure.Prelude
8 import Data.Text as T (pack)
9 import Language.LSP.Protocol.Message
10 import Language.LSP.Protocol.Types hiding (Definition)
11 import Language.LSP.Server (Handlers, LspM, requestHandler)
12 import Prettyprinter
13
14 hoverHandler :: Handlers (LspM ())
15 hoverHandler = requestHandler SMethod_TextDocumentHover $ \req res -> do
16 let TRequestMessage _ _ _ (HoverParams _doc pos _workDone) = req
17 let Position _l _c' = pos
18 withProcessedDoc _doc $ \(ProcessedFile _ _ st _) -> do
19 let ranges = getRelevantRegions st pos
20 texts <- mapM prettySymbol ranges
21 let ms = InL $ mconcat (catMaybes texts)
22 let range = Range pos pos
23 let rsp = Hover ms (Just range)
24 res (Right $ InL rsp)
25
26 prettySymbol :: RegionInfo -> LspM () (Maybe MarkupContent)
27 prettySymbol (RegionInfo _ _ dt _ _) = case dt of
28 Definition nm ty -> return $ Just . snippet . pack . show $ hcat [pretty nm, " : ", pretty . show $ CPr.pretty ty]
29 LiteralDecl {} -> return Nothing
30 Ref nm k _ -> return . Just . snippet . pack . show $ hcat [pretty nm, " : ", pretty . show $ CPr.pretty k]
31 Documentation {} -> liftIO $ getDocsForBuiltin dt
32 _ -> return Nothing