packages feed

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

module LSP.Handlers.Hover where

import Control.Concurrent.MVar
import Control.Lens (to, (^.))
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)
import Language.LSP.VFS
import Zwirn.Language.Compiler
import Zwirn.Language.LSP.Hover

hoverHandler :: MVar Environment -> Handlers LSP
hoverHandler envMV = requestHandler
  LSP.SMethod_TextDocumentHover
  $ \req responder -> do
    let doc = req ^. LSP.params . LSP.textDocument . LSP.uri . to LSP.toNormalizedUri
        pos = req ^. LSP.params . LSP.position . to fromLSPPos
    mdoc <- getVirtualFile doc
    env <- liftIO $ readMVar envMV
    case mdoc of
      Just vf -> do
        mci <- liftIO $ runCI env (parseAndGetInfoAt (virtualFileText vf) pos)
        case mci of
          Right (Just (info, rng)) -> responder . Right . LSP.maybeToNull $ Just $ LSP.Hover (LSP.InL $ LSP.mkMarkdown info) (Just (toLSP rng))
          _ -> return ()
      Nothing -> return ()