static-ls-0.1.0: src/StaticLS/IDE/Hover.hs
module StaticLS.IDE.Hover (
retrieveHover,
)
where
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Trans.Maybe (MaybeT (..), runMaybeT)
import Data.Maybe (listToMaybe)
import Data.Text (Text, intercalate)
import qualified GHC.Iface.Ext.Types as GHC
import GHC.Stack (HasCallStack)
import HieDb (pointCommand)
import Language.LSP.Types (
Hover (..),
HoverContents (..),
MarkupContent (..),
MarkupKind (..),
Position,
Range (..),
TextDocumentIdentifier,
sectionSeparator,
)
import StaticLS.HIE
import StaticLS.HIE.File
import StaticLS.IDE.Hover.Info
import StaticLS.Maybe
import StaticLS.StaticEnv
-- | Retrive hover information. Incomplete
retrieveHover :: (HasCallStack, HasStaticEnv m, MonadIO m) => TextDocumentIdentifier -> Position -> m (Maybe Hover)
retrieveHover identifier position = do
runMaybeT $ do
hieFile <- getHieFileFromTdi identifier
let info =
listToMaybe $
pointCommand
hieFile
(lspPositionToHieDbCoords position)
Nothing
(hoverInfo (GHC.hie_types hieFile))
toAlt $ hoverInfoToHover <$> info
where
hoverInfoToHover :: (Maybe Range, [Text]) -> Hover
hoverInfoToHover (mRange, contents) =
Hover
{ _range = mRange
, _contents = HoverContents $ MarkupContent MkMarkdown $ intercalate sectionSeparator contents
}