{-# LANGUAGE TemplateHaskell       #-}
{-# LANGUAGE DuplicateRecordFields #-}

module Language.LSP.Types.CodeLens where

import Data.Aeson
import Data.Aeson.TH
import Language.LSP.Types.Command
import Language.LSP.Types.Location
import Language.LSP.Types.Progress
import Language.LSP.Types.TextDocument
import Language.LSP.Types.Utils

-- -------------------------------------

data CodeLensClientCapabilities =
  CodeLensClientCapabilities
    { -- | Whether code lens supports dynamic registration.
      _dynamicRegistration :: Maybe Bool
    } deriving (Show, Read, Eq)

deriveJSON lspOptions ''CodeLensClientCapabilities

-- -------------------------------------

makeExtendingDatatype "CodeLensOptions" [''WorkDoneProgressOptions]
  [ ("_resolveProvider", [t| Maybe Bool |] )]
deriveJSON lspOptions ''CodeLensOptions

makeExtendingDatatype "CodeLensRegistrationOptions"
  [ ''TextDocumentRegistrationOptions
  , ''CodeLensOptions
  ] []
deriveJSON lspOptions ''CodeLensRegistrationOptions

-- -------------------------------------

makeExtendingDatatype "CodeLensParams"
  [ ''WorkDoneProgressParams,
    ''PartialResultParams
  ]
  [("_textDocument", [t|TextDocumentIdentifier|])]
deriveJSON lspOptions ''CodeLensParams

-- -------------------------------------

-- | A code lens represents a command that should be shown along with source
-- text, like the number of references, a way to run tests, etc.
-- 
-- A code lens is _unresolved_ when no command is associated to it. For
-- performance reasons the creation of a code lens and resolving should be done
-- in two stages.
data CodeLens =
  CodeLens
  { -- | The range in which this code lens is valid. Should only span a single line.
    _range   :: Range
  , -- | The command this code lens represents.
    _command :: Maybe Command
  , -- | A data entry field that is preserved on a code lens item between
    -- a code lens and a code lens resolve request.
    _xdata   :: Maybe Value
  } deriving (Read,Show,Eq)

deriveJSON lspOptions ''CodeLens