packages feed

zwirn-0.2.2.0: app/zwirnzi/LSP/Handlers/InlayHint.hs

module LSP.Handlers.InlayHint where

import Control.Concurrent.MVar
import Control.Lens (to, (^.))
import Control.Monad (void)
import Control.Monad.IO.Class
import LSP.Util
import qualified Language.LSP.Protocol.Lens as LSP
import qualified Language.LSP.Protocol.Message as LSP
import Language.LSP.Protocol.Types ()
import qualified Language.LSP.Protocol.Types as LSP
import Language.LSP.Server (Handlers, getVirtualFile, requestHandler, sendRequest)
import Language.LSP.VFS
import Zwirn.Language.Compiler
import Zwirn.Language.LSP.InlayHints (Hint (..), getHints)

inlayHintHandler :: MVar Environment -> Handlers LSP
inlayHintHandler envMV = requestHandler LSP.SMethod_TextDocumentInlayHint $ \req responder -> do
  let doc = req ^. LSP.params . LSP.textDocument . LSP.uri . to LSP.toNormalizedUri

  mdoc <- getVirtualFile doc
  env <- liftIO $ readMVar envMV
  psHints <- case mdoc of
    Just vf -> do
      hci <- liftIO $ runCI env (getHints (virtualFileText vf))
      case hci of
        Right hs -> return $ map mkHint hs
        _ -> return []
    Nothing -> return []

  responder $ Right $ LSP.InL psHints

mkHint :: Hint -> LSP.InlayHint
mkHint (Hint pos ct desc) = LSP.InlayHint (toLSPPos pos) (LSP.InL ct) Nothing Nothing (Just $ LSP.InL desc) Nothing Nothing Nothing

refreshHints :: LSP ()
refreshHints = void $ sendRequest LSP.SMethod_WorkspaceInlayHintRefresh Nothing (const $ return ())