{- ORMOLU_DISABLE -}
{- HLINT ignore -}
-- THIS IS A GENERATED FILE, DO NOT EDIT

{-# OPTIONS_GHC -Wno-unused-imports #-}
{-# OPTIONS_GHC -Wno-unused-matches #-}
{-# OPTIONS_GHC -Wno-deprecations #-}
module Language.LSP.Protocol.Internal.Types.LocationLink where

import Control.DeepSeq
import Data.Hashable
import GHC.Generics
import Language.LSP.Protocol.Utils.Misc
import Prettyprinter
import qualified Data.Aeson as Aeson
import qualified Data.Row.Aeson as Aeson
import qualified Data.Row.Hashable as Hashable
import qualified Language.LSP.Protocol.Internal.Types.Range
import qualified Language.LSP.Protocol.Types.Common
import qualified Language.LSP.Protocol.Types.Uri

{-|
Represents the connection of two locations. Provides additional metadata over normal `Location`,
including an origin range.
-}
data LocationLink = LocationLink 
  { {-|
  Span of the origin of this link.

  Used as the underlined span for mouse interaction. Defaults to the word range at
  the definition position.
  -}
  _originSelectionRange :: (Maybe Language.LSP.Protocol.Internal.Types.Range.Range)
  , {-|
  The target resource identifier of this link.
  -}
  _targetUri :: Language.LSP.Protocol.Types.Uri.Uri
  , {-|
  The full target range of this link. If the target for example is a symbol then target range is the
  range enclosing this symbol not including leading/trailing whitespace but everything else
  like comments. This information is typically used to highlight the range in the editor.
  -}
  _targetRange :: Language.LSP.Protocol.Internal.Types.Range.Range
  , {-|
  The range that should be selected and revealed when this link is being followed, e.g the name of a function.
  Must be contained by the `targetRange`. See also `DocumentSymbol#range`
  -}
  _targetSelectionRange :: Language.LSP.Protocol.Internal.Types.Range.Range
  }
  deriving stock (Show, Eq, Ord, Generic)
  deriving anyclass (NFData, Hashable)
  deriving Pretty via (ViaJSON LocationLink)

instance Aeson.ToJSON LocationLink where
  toJSON (LocationLink arg0 arg1 arg2 arg3) = Aeson.object $ concat $  ["originSelectionRange" Language.LSP.Protocol.Types.Common..=? arg0
    ,["targetUri" Aeson..= arg1]
    ,["targetRange" Aeson..= arg2]
    ,["targetSelectionRange" Aeson..= arg3]]

instance Aeson.FromJSON LocationLink where
  parseJSON = Aeson.withObject "LocationLink" $ \arg -> LocationLink <$> arg Language.LSP.Protocol.Types.Common..:!? "originSelectionRange" <*> arg Aeson..: "targetUri" <*> arg Aeson..: "targetRange" <*> arg Aeson..: "targetSelectionRange"
