{-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE DuplicateRecordFields #-} module Language.LSP.Types.Hover where import Control.Applicative import Data.Aeson import Data.Aeson.TH import Data.Text ( Text ) import Language.LSP.Types.Common import Language.LSP.Types.Location import Language.LSP.Types.MarkupContent import Language.LSP.Types.Progress import Language.LSP.Types.TextDocument import Language.LSP.Types.Utils -- ------------------------------------- data HoverClientCapabilities = HoverClientCapabilities { _dynamicRegistration :: Maybe Bool , _contentFormat :: Maybe (List MarkupKind) } deriving (Show, Read, Eq) deriveJSON lspOptions ''HoverClientCapabilities makeExtendingDatatype "HoverOptions" [''WorkDoneProgressOptions] [] deriveJSON lspOptions ''HoverOptions makeExtendingDatatype "HoverRegistrationOptions" [''TextDocumentRegistrationOptions, ''HoverOptions] [] deriveJSON lspOptions ''HoverRegistrationOptions makeExtendingDatatype "HoverParams" [''TextDocumentPositionParams, ''WorkDoneProgressParams] [] deriveJSON lspOptions ''HoverParams -- ------------------------------------- data LanguageString = LanguageString { _language :: Text , _value :: Text } deriving (Read,Show,Eq) deriveJSON lspOptions ''LanguageString {-# DEPRECATED MarkedString, PlainString, CodeString "Use MarkupContent instead, since 3.3.0 (11/24/2017)" #-} data MarkedString = PlainString Text | CodeString LanguageString deriving (Eq,Read,Show) instance ToJSON MarkedString where toJSON (PlainString x) = toJSON x toJSON (CodeString x) = toJSON x instance FromJSON MarkedString where parseJSON (String t) = pure $ PlainString t parseJSON o = CodeString <$> parseJSON o -- ------------------------------------- data HoverContents = HoverContentsMS (List MarkedString) | HoverContents MarkupContent deriving (Read,Show,Eq) instance ToJSON HoverContents where toJSON (HoverContentsMS x) = toJSON x toJSON (HoverContents x) = toJSON x instance FromJSON HoverContents where parseJSON v@(String _) = HoverContentsMS <$> parseJSON v parseJSON v@(Array _) = HoverContentsMS <$> parseJSON v parseJSON v@(Object _) = HoverContents <$> parseJSON v <|> HoverContentsMS <$> parseJSON v parseJSON _ = mempty -- ------------------------------------- instance Semigroup HoverContents where HoverContents h1 <> HoverContents h2 = HoverContents (h1 `mappend` h2) HoverContents h1 <> HoverContentsMS (List h2s) = HoverContents (mconcat (h1: (map toMarkupContent h2s))) HoverContentsMS (List h1s) <> HoverContents h2 = HoverContents (mconcat ((map toMarkupContent h1s) ++ [h2])) HoverContentsMS (List h1s) <> HoverContentsMS (List h2s) = HoverContentsMS (List (h1s `mappend` h2s)) instance Monoid HoverContents where mempty = HoverContentsMS (List []) toMarkupContent :: MarkedString -> MarkupContent toMarkupContent (PlainString s) = unmarkedUpContent s toMarkupContent (CodeString (LanguageString lang s)) = markedUpContent lang s -- ------------------------------------- data Hover = Hover { _contents :: HoverContents , _range :: Maybe Range } deriving (Read,Show,Eq) deriveJSON lspOptions ''Hover