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

module Language.LSP.Types.SelectionRange where

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

data SelectionRangeClientCapabilities = SelectionRangeClientCapabilities
  { -- | Whether implementation supports dynamic registration for selection range providers. If this is set to 'True'
    -- the client supports the new 'SelectionRangeRegistrationOptions' return value for the corresponding server
    -- capability as well.
    _dynamicRegistration :: Maybe Bool
  }
  deriving (Read, Show, Eq)

deriveJSON lspOptions ''SelectionRangeClientCapabilities

makeExtendingDatatype "SelectionRangeOptions" [''WorkDoneProgressOptions] []
deriveJSON lspOptions ''SelectionRangeOptions

makeExtendingDatatype
  "SelectionRangeRegistrationOptions"
  [ ''SelectionRangeOptions,
    ''TextDocumentRegistrationOptions,
    ''StaticRegistrationOptions
  ]
  []
deriveJSON lspOptions ''SelectionRangeRegistrationOptions

makeExtendingDatatype
  "SelectionRangeParams"
  [ ''WorkDoneProgressParams,
    ''PartialResultParams
  ]
  [ ("_textDocument", [t|TextDocumentIdentifier|]),
    ("_positions", [t|List Position|])
  ]
deriveJSON lspOptions ''SelectionRangeParams

data SelectionRange = SelectionRange
  { -- | The 'range' of this selection range.
    _range :: Range,
    -- | The parent selection range containing this range. Therefore @parent.range@ must contain @this.range@.
    _parent :: Maybe SelectionRange
  }
  deriving (Read, Show, Eq)

deriveJSON lspOptions ''SelectionRange