-- | goToDeclaration, goToDefinition, and goToImplementation are equivalent except for the input/return wrappers
module Unison.LSP.GoToDefinition
  ( goToDefinitionHandler,
    goToDeclarationHandler,
    goToImplementationHandler,
  )
where

import Control.Lens hiding (List)
import Data.IntervalMap.Lazy qualified as IM
import Language.LSP.Protocol.Lens
import Language.LSP.Protocol.Message qualified as Msg
import Language.LSP.Protocol.Types
import Unison.LSP.FileAnalysis qualified as FileAnalysis
import Unison.LSP.Types
import Unison.Prelude

-- | Go to Definition handler
goToDefinitionHandler :: Msg.TRequestMessage 'Msg.Method_TextDocumentDefinition -> (Either (Msg.TResponseError m) (Msg.MessageResult 'Msg.Method_TextDocumentDefinition) -> Lsp ()) -> Lsp ()
goToDefinitionHandler :: forall {f :: MessageDirection} (m :: Method f 'Request).
TRequestMessage 'Method_TextDocumentDefinition
-> (Either
      (TResponseError m) (MessageResult 'Method_TextDocumentDefinition)
    -> Lsp ())
-> Lsp ()
goToDefinitionHandler TRequestMessage 'Method_TextDocumentDefinition
m Either
  (TResponseError m) (MessageResult 'Method_TextDocumentDefinition)
-> Lsp ()
respond = do
  Either
  (TResponseError m) (Definition |? ([DefinitionLink] |? Null))
-> Lsp ()
Either
  (TResponseError m) (MessageResult 'Method_TextDocumentDefinition)
-> Lsp ()
respond (Either
   (TResponseError m) (Definition |? ([DefinitionLink] |? Null))
 -> Lsp ())
-> (Maybe [DefinitionLink]
    -> Either
         (TResponseError m) (Definition |? ([DefinitionLink] |? Null)))
-> Maybe [DefinitionLink]
-> Lsp ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Definition |? ([DefinitionLink] |? Null))
-> Either
     (TResponseError m) (Definition |? ([DefinitionLink] |? Null))
forall a b. b -> Either a b
Right ((Definition |? ([DefinitionLink] |? Null))
 -> Either
      (TResponseError m) (Definition |? ([DefinitionLink] |? Null)))
-> (Maybe [DefinitionLink]
    -> Definition |? ([DefinitionLink] |? Null))
-> Maybe [DefinitionLink]
-> Either
     (TResponseError m) (Definition |? ([DefinitionLink] |? Null))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Definition |? ([DefinitionLink] |? Null))
-> ([DefinitionLink] -> Definition |? ([DefinitionLink] |? Null))
-> Maybe [DefinitionLink]
-> Definition |? ([DefinitionLink] |? Null)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (([DefinitionLink] |? Null)
-> Definition |? ([DefinitionLink] |? Null)
forall a b. b -> a |? b
InR (([DefinitionLink] |? Null)
 -> Definition |? ([DefinitionLink] |? Null))
-> ([DefinitionLink] -> [DefinitionLink] |? Null)
-> [DefinitionLink]
-> Definition |? ([DefinitionLink] |? Null)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DefinitionLink] -> [DefinitionLink] |? Null
forall a b. a -> a |? b
InL ([DefinitionLink] -> Definition |? ([DefinitionLink] |? Null))
-> [DefinitionLink] -> Definition |? ([DefinitionLink] |? Null)
forall a b. (a -> b) -> a -> b
$ []) (([DefinitionLink] |? Null)
-> Definition |? ([DefinitionLink] |? Null)
forall a b. b -> a |? b
InR (([DefinitionLink] |? Null)
 -> Definition |? ([DefinitionLink] |? Null))
-> ([DefinitionLink] -> [DefinitionLink] |? Null)
-> [DefinitionLink]
-> Definition |? ([DefinitionLink] |? Null)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DefinitionLink] -> [DefinitionLink] |? Null
forall a b. a -> a |? b
InL) (Maybe [DefinitionLink] -> Lsp ())
-> Lsp (Maybe [DefinitionLink]) -> Lsp ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MaybeT Lsp [DefinitionLink] -> Lsp (Maybe [DefinitionLink])
forall (m :: * -> *) a. MaybeT m a -> m (Maybe a)
runMaybeT do
    let pos :: Position
pos = (TRequestMessage 'Method_TextDocumentDefinition
m TRequestMessage 'Method_TextDocumentDefinition
-> Getting
     Position (TRequestMessage 'Method_TextDocumentDefinition) Position
-> Position
forall s a. s -> Getting a s a -> a
^. (DefinitionParams -> Const Position DefinitionParams)
-> TRequestMessage 'Method_TextDocumentDefinition
-> Const Position (TRequestMessage 'Method_TextDocumentDefinition)
forall s a. HasParams s a => Lens' s a
Lens'
  (TRequestMessage 'Method_TextDocumentDefinition) DefinitionParams
params ((DefinitionParams -> Const Position DefinitionParams)
 -> TRequestMessage 'Method_TextDocumentDefinition
 -> Const Position (TRequestMessage 'Method_TextDocumentDefinition))
-> ((Position -> Const Position Position)
    -> DefinitionParams -> Const Position DefinitionParams)
-> Getting
     Position (TRequestMessage 'Method_TextDocumentDefinition) Position
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Position -> Const Position Position)
-> DefinitionParams -> Const Position DefinitionParams
forall s a. HasPosition s a => Lens' s a
Lens' DefinitionParams Position
position)
    targetRange <- Uri -> Position -> MaybeT Lsp Range
locationInfo (TRequestMessage 'Method_TextDocumentDefinition
m TRequestMessage 'Method_TextDocumentDefinition
-> Getting Uri (TRequestMessage 'Method_TextDocumentDefinition) Uri
-> Uri
forall s a. s -> Getting a s a -> a
^. (DefinitionParams -> Const Uri DefinitionParams)
-> TRequestMessage 'Method_TextDocumentDefinition
-> Const Uri (TRequestMessage 'Method_TextDocumentDefinition)
forall s a. HasParams s a => Lens' s a
Lens'
  (TRequestMessage 'Method_TextDocumentDefinition) DefinitionParams
params ((DefinitionParams -> Const Uri DefinitionParams)
 -> TRequestMessage 'Method_TextDocumentDefinition
 -> Const Uri (TRequestMessage 'Method_TextDocumentDefinition))
-> ((Uri -> Const Uri Uri)
    -> DefinitionParams -> Const Uri DefinitionParams)
-> Getting Uri (TRequestMessage 'Method_TextDocumentDefinition) Uri
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> DefinitionParams -> Const Uri DefinitionParams
forall s a. HasTextDocument s a => Lens' s a
Lens' DefinitionParams TextDocumentIdentifier
textDocument ((TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
 -> DefinitionParams -> Const Uri DefinitionParams)
-> ((Uri -> Const Uri Uri)
    -> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> (Uri -> Const Uri Uri)
-> DefinitionParams
-> Const Uri DefinitionParams
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Uri -> Const Uri Uri)
-> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier
forall s a. HasUri s a => Lens' s a
Lens' TextDocumentIdentifier Uri
uri) Position
pos
    let originLoc = Maybe a
forall a. Maybe a
Nothing -- Just use default
    let targetUri = TRequestMessage 'Method_TextDocumentDefinition
m TRequestMessage 'Method_TextDocumentDefinition
-> Getting Uri (TRequestMessage 'Method_TextDocumentDefinition) Uri
-> Uri
forall s a. s -> Getting a s a -> a
^. (DefinitionParams -> Const Uri DefinitionParams)
-> TRequestMessage 'Method_TextDocumentDefinition
-> Const Uri (TRequestMessage 'Method_TextDocumentDefinition)
forall s a. HasParams s a => Lens' s a
Lens'
  (TRequestMessage 'Method_TextDocumentDefinition) DefinitionParams
params ((DefinitionParams -> Const Uri DefinitionParams)
 -> TRequestMessage 'Method_TextDocumentDefinition
 -> Const Uri (TRequestMessage 'Method_TextDocumentDefinition))
-> ((Uri -> Const Uri Uri)
    -> DefinitionParams -> Const Uri DefinitionParams)
-> Getting Uri (TRequestMessage 'Method_TextDocumentDefinition) Uri
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> DefinitionParams -> Const Uri DefinitionParams
forall s a. HasTextDocument s a => Lens' s a
Lens' DefinitionParams TextDocumentIdentifier
textDocument ((TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
 -> DefinitionParams -> Const Uri DefinitionParams)
-> ((Uri -> Const Uri Uri)
    -> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> (Uri -> Const Uri Uri)
-> DefinitionParams
-> Const Uri DefinitionParams
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Uri -> Const Uri Uri)
-> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier
forall s a. HasUri s a => Lens' s a
Lens' TextDocumentIdentifier Uri
uri
    pure $
      [DefinitionLink (LocationLink originLoc targetUri targetRange targetRange)]

-- | Go to Declaration handler
goToDeclarationHandler :: Msg.TRequestMessage 'Msg.Method_TextDocumentDeclaration -> (Either (Msg.TResponseError m) (Msg.MessageResult 'Msg.Method_TextDocumentDeclaration) -> Lsp ()) -> Lsp ()
goToDeclarationHandler :: forall {f :: MessageDirection} (m :: Method f 'Request).
TRequestMessage 'Method_TextDocumentDeclaration
-> (Either
      (TResponseError m) (MessageResult 'Method_TextDocumentDeclaration)
    -> Lsp ())
-> Lsp ()
goToDeclarationHandler TRequestMessage 'Method_TextDocumentDeclaration
m Either
  (TResponseError m) (MessageResult 'Method_TextDocumentDeclaration)
-> Lsp ()
respond = do
  Either
  (TResponseError m) (Declaration |? ([DeclarationLink] |? Null))
-> Lsp ()
Either
  (TResponseError m) (MessageResult 'Method_TextDocumentDeclaration)
-> Lsp ()
respond (Either
   (TResponseError m) (Declaration |? ([DeclarationLink] |? Null))
 -> Lsp ())
-> (Maybe [DeclarationLink]
    -> Either
         (TResponseError m) (Declaration |? ([DeclarationLink] |? Null)))
-> Maybe [DeclarationLink]
-> Lsp ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Declaration |? ([DeclarationLink] |? Null))
-> Either
     (TResponseError m) (Declaration |? ([DeclarationLink] |? Null))
forall a b. b -> Either a b
Right ((Declaration |? ([DeclarationLink] |? Null))
 -> Either
      (TResponseError m) (Declaration |? ([DeclarationLink] |? Null)))
-> (Maybe [DeclarationLink]
    -> Declaration |? ([DeclarationLink] |? Null))
-> Maybe [DeclarationLink]
-> Either
     (TResponseError m) (Declaration |? ([DeclarationLink] |? Null))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Declaration |? ([DeclarationLink] |? Null))
-> ([DeclarationLink]
    -> Declaration |? ([DeclarationLink] |? Null))
-> Maybe [DeclarationLink]
-> Declaration |? ([DeclarationLink] |? Null)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (([DeclarationLink] |? Null)
-> Declaration |? ([DeclarationLink] |? Null)
forall a b. b -> a |? b
InR (([DeclarationLink] |? Null)
 -> Declaration |? ([DeclarationLink] |? Null))
-> ([DeclarationLink] -> [DeclarationLink] |? Null)
-> [DeclarationLink]
-> Declaration |? ([DeclarationLink] |? Null)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DeclarationLink] -> [DeclarationLink] |? Null
forall a b. a -> a |? b
InL ([DeclarationLink] -> Declaration |? ([DeclarationLink] |? Null))
-> [DeclarationLink] -> Declaration |? ([DeclarationLink] |? Null)
forall a b. (a -> b) -> a -> b
$ []) (([DeclarationLink] |? Null)
-> Declaration |? ([DeclarationLink] |? Null)
forall a b. b -> a |? b
InR (([DeclarationLink] |? Null)
 -> Declaration |? ([DeclarationLink] |? Null))
-> ([DeclarationLink] -> [DeclarationLink] |? Null)
-> [DeclarationLink]
-> Declaration |? ([DeclarationLink] |? Null)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DeclarationLink] -> [DeclarationLink] |? Null
forall a b. a -> a |? b
InL) (Maybe [DeclarationLink] -> Lsp ())
-> Lsp (Maybe [DeclarationLink]) -> Lsp ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MaybeT Lsp [DeclarationLink] -> Lsp (Maybe [DeclarationLink])
forall (m :: * -> *) a. MaybeT m a -> m (Maybe a)
runMaybeT do
    let pos :: Position
pos = (TRequestMessage 'Method_TextDocumentDeclaration
m TRequestMessage 'Method_TextDocumentDeclaration
-> Getting
     Position (TRequestMessage 'Method_TextDocumentDeclaration) Position
-> Position
forall s a. s -> Getting a s a -> a
^. (DeclarationParams -> Const Position DeclarationParams)
-> TRequestMessage 'Method_TextDocumentDeclaration
-> Const Position (TRequestMessage 'Method_TextDocumentDeclaration)
forall s a. HasParams s a => Lens' s a
Lens'
  (TRequestMessage 'Method_TextDocumentDeclaration) DeclarationParams
params ((DeclarationParams -> Const Position DeclarationParams)
 -> TRequestMessage 'Method_TextDocumentDeclaration
 -> Const
      Position (TRequestMessage 'Method_TextDocumentDeclaration))
-> ((Position -> Const Position Position)
    -> DeclarationParams -> Const Position DeclarationParams)
-> Getting
     Position (TRequestMessage 'Method_TextDocumentDeclaration) Position
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Position -> Const Position Position)
-> DeclarationParams -> Const Position DeclarationParams
forall s a. HasPosition s a => Lens' s a
Lens' DeclarationParams Position
position)
    targetRange <- Uri -> Position -> MaybeT Lsp Range
locationInfo (TRequestMessage 'Method_TextDocumentDeclaration
m TRequestMessage 'Method_TextDocumentDeclaration
-> Getting
     Uri (TRequestMessage 'Method_TextDocumentDeclaration) Uri
-> Uri
forall s a. s -> Getting a s a -> a
^. (DeclarationParams -> Const Uri DeclarationParams)
-> TRequestMessage 'Method_TextDocumentDeclaration
-> Const Uri (TRequestMessage 'Method_TextDocumentDeclaration)
forall s a. HasParams s a => Lens' s a
Lens'
  (TRequestMessage 'Method_TextDocumentDeclaration) DeclarationParams
params ((DeclarationParams -> Const Uri DeclarationParams)
 -> TRequestMessage 'Method_TextDocumentDeclaration
 -> Const Uri (TRequestMessage 'Method_TextDocumentDeclaration))
-> ((Uri -> Const Uri Uri)
    -> DeclarationParams -> Const Uri DeclarationParams)
-> Getting
     Uri (TRequestMessage 'Method_TextDocumentDeclaration) Uri
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> DeclarationParams -> Const Uri DeclarationParams
forall s a. HasTextDocument s a => Lens' s a
Lens' DeclarationParams TextDocumentIdentifier
textDocument ((TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
 -> DeclarationParams -> Const Uri DeclarationParams)
-> ((Uri -> Const Uri Uri)
    -> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> (Uri -> Const Uri Uri)
-> DeclarationParams
-> Const Uri DeclarationParams
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Uri -> Const Uri Uri)
-> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier
forall s a. HasUri s a => Lens' s a
Lens' TextDocumentIdentifier Uri
uri) Position
pos
    let originLoc = Maybe a
forall a. Maybe a
Nothing -- Just use default
    let targetUri = TRequestMessage 'Method_TextDocumentDeclaration
m TRequestMessage 'Method_TextDocumentDeclaration
-> Getting
     Uri (TRequestMessage 'Method_TextDocumentDeclaration) Uri
-> Uri
forall s a. s -> Getting a s a -> a
^. (DeclarationParams -> Const Uri DeclarationParams)
-> TRequestMessage 'Method_TextDocumentDeclaration
-> Const Uri (TRequestMessage 'Method_TextDocumentDeclaration)
forall s a. HasParams s a => Lens' s a
Lens'
  (TRequestMessage 'Method_TextDocumentDeclaration) DeclarationParams
params ((DeclarationParams -> Const Uri DeclarationParams)
 -> TRequestMessage 'Method_TextDocumentDeclaration
 -> Const Uri (TRequestMessage 'Method_TextDocumentDeclaration))
-> ((Uri -> Const Uri Uri)
    -> DeclarationParams -> Const Uri DeclarationParams)
-> Getting
     Uri (TRequestMessage 'Method_TextDocumentDeclaration) Uri
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> DeclarationParams -> Const Uri DeclarationParams
forall s a. HasTextDocument s a => Lens' s a
Lens' DeclarationParams TextDocumentIdentifier
textDocument ((TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
 -> DeclarationParams -> Const Uri DeclarationParams)
-> ((Uri -> Const Uri Uri)
    -> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> (Uri -> Const Uri Uri)
-> DeclarationParams
-> Const Uri DeclarationParams
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Uri -> Const Uri Uri)
-> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier
forall s a. HasUri s a => Lens' s a
Lens' TextDocumentIdentifier Uri
uri
    pure $
      [DeclarationLink (LocationLink originLoc targetUri targetRange targetRange)]

goToImplementationHandler :: Msg.TRequestMessage 'Msg.Method_TextDocumentImplementation -> (Either (Msg.TResponseError m) (Msg.MessageResult 'Msg.Method_TextDocumentImplementation) -> Lsp ()) -> Lsp ()
goToImplementationHandler :: forall {f :: MessageDirection} (m :: Method f 'Request).
TRequestMessage 'Method_TextDocumentImplementation
-> (Either
      (TResponseError m)
      (MessageResult 'Method_TextDocumentImplementation)
    -> Lsp ())
-> Lsp ()
goToImplementationHandler TRequestMessage 'Method_TextDocumentImplementation
m Either
  (TResponseError m)
  (MessageResult 'Method_TextDocumentImplementation)
-> Lsp ()
respond = do
  Either
  (TResponseError m) (Definition |? ([DefinitionLink] |? Null))
-> Lsp ()
Either
  (TResponseError m)
  (MessageResult 'Method_TextDocumentImplementation)
-> Lsp ()
respond (Either
   (TResponseError m) (Definition |? ([DefinitionLink] |? Null))
 -> Lsp ())
-> (Maybe [DefinitionLink]
    -> Either
         (TResponseError m) (Definition |? ([DefinitionLink] |? Null)))
-> Maybe [DefinitionLink]
-> Lsp ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Definition |? ([DefinitionLink] |? Null))
-> Either
     (TResponseError m) (Definition |? ([DefinitionLink] |? Null))
forall a b. b -> Either a b
Right ((Definition |? ([DefinitionLink] |? Null))
 -> Either
      (TResponseError m) (Definition |? ([DefinitionLink] |? Null)))
-> (Maybe [DefinitionLink]
    -> Definition |? ([DefinitionLink] |? Null))
-> Maybe [DefinitionLink]
-> Either
     (TResponseError m) (Definition |? ([DefinitionLink] |? Null))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Definition |? ([DefinitionLink] |? Null))
-> ([DefinitionLink] -> Definition |? ([DefinitionLink] |? Null))
-> Maybe [DefinitionLink]
-> Definition |? ([DefinitionLink] |? Null)
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (([DefinitionLink] |? Null)
-> Definition |? ([DefinitionLink] |? Null)
forall a b. b -> a |? b
InR (([DefinitionLink] |? Null)
 -> Definition |? ([DefinitionLink] |? Null))
-> ([DefinitionLink] -> [DefinitionLink] |? Null)
-> [DefinitionLink]
-> Definition |? ([DefinitionLink] |? Null)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DefinitionLink] -> [DefinitionLink] |? Null
forall a b. a -> a |? b
InL ([DefinitionLink] -> Definition |? ([DefinitionLink] |? Null))
-> [DefinitionLink] -> Definition |? ([DefinitionLink] |? Null)
forall a b. (a -> b) -> a -> b
$ []) (([DefinitionLink] |? Null)
-> Definition |? ([DefinitionLink] |? Null)
forall a b. b -> a |? b
InR (([DefinitionLink] |? Null)
 -> Definition |? ([DefinitionLink] |? Null))
-> ([DefinitionLink] -> [DefinitionLink] |? Null)
-> [DefinitionLink]
-> Definition |? ([DefinitionLink] |? Null)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [DefinitionLink] -> [DefinitionLink] |? Null
forall a b. a -> a |? b
InL) (Maybe [DefinitionLink] -> Lsp ())
-> Lsp (Maybe [DefinitionLink]) -> Lsp ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< MaybeT Lsp [DefinitionLink] -> Lsp (Maybe [DefinitionLink])
forall (m :: * -> *) a. MaybeT m a -> m (Maybe a)
runMaybeT do
    let pos :: Position
pos = (TRequestMessage 'Method_TextDocumentImplementation
m TRequestMessage 'Method_TextDocumentImplementation
-> Getting
     Position
     (TRequestMessage 'Method_TextDocumentImplementation)
     Position
-> Position
forall s a. s -> Getting a s a -> a
^. (ImplementationParams -> Const Position ImplementationParams)
-> TRequestMessage 'Method_TextDocumentImplementation
-> Const
     Position (TRequestMessage 'Method_TextDocumentImplementation)
forall s a. HasParams s a => Lens' s a
Lens'
  (TRequestMessage 'Method_TextDocumentImplementation)
  ImplementationParams
params ((ImplementationParams -> Const Position ImplementationParams)
 -> TRequestMessage 'Method_TextDocumentImplementation
 -> Const
      Position (TRequestMessage 'Method_TextDocumentImplementation))
-> ((Position -> Const Position Position)
    -> ImplementationParams -> Const Position ImplementationParams)
-> Getting
     Position
     (TRequestMessage 'Method_TextDocumentImplementation)
     Position
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Position -> Const Position Position)
-> ImplementationParams -> Const Position ImplementationParams
forall s a. HasPosition s a => Lens' s a
Lens' ImplementationParams Position
position)
    targetRange <- Uri -> Position -> MaybeT Lsp Range
locationInfo (TRequestMessage 'Method_TextDocumentImplementation
m TRequestMessage 'Method_TextDocumentImplementation
-> Getting
     Uri (TRequestMessage 'Method_TextDocumentImplementation) Uri
-> Uri
forall s a. s -> Getting a s a -> a
^. (ImplementationParams -> Const Uri ImplementationParams)
-> TRequestMessage 'Method_TextDocumentImplementation
-> Const Uri (TRequestMessage 'Method_TextDocumentImplementation)
forall s a. HasParams s a => Lens' s a
Lens'
  (TRequestMessage 'Method_TextDocumentImplementation)
  ImplementationParams
params ((ImplementationParams -> Const Uri ImplementationParams)
 -> TRequestMessage 'Method_TextDocumentImplementation
 -> Const Uri (TRequestMessage 'Method_TextDocumentImplementation))
-> ((Uri -> Const Uri Uri)
    -> ImplementationParams -> Const Uri ImplementationParams)
-> Getting
     Uri (TRequestMessage 'Method_TextDocumentImplementation) Uri
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> ImplementationParams -> Const Uri ImplementationParams
forall s a. HasTextDocument s a => Lens' s a
Lens' ImplementationParams TextDocumentIdentifier
textDocument ((TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
 -> ImplementationParams -> Const Uri ImplementationParams)
-> ((Uri -> Const Uri Uri)
    -> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> (Uri -> Const Uri Uri)
-> ImplementationParams
-> Const Uri ImplementationParams
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Uri -> Const Uri Uri)
-> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier
forall s a. HasUri s a => Lens' s a
Lens' TextDocumentIdentifier Uri
uri) Position
pos
    let originLoc = Maybe a
forall a. Maybe a
Nothing -- Just use default
    let targetUri = TRequestMessage 'Method_TextDocumentImplementation
m TRequestMessage 'Method_TextDocumentImplementation
-> Getting
     Uri (TRequestMessage 'Method_TextDocumentImplementation) Uri
-> Uri
forall s a. s -> Getting a s a -> a
^. (ImplementationParams -> Const Uri ImplementationParams)
-> TRequestMessage 'Method_TextDocumentImplementation
-> Const Uri (TRequestMessage 'Method_TextDocumentImplementation)
forall s a. HasParams s a => Lens' s a
Lens'
  (TRequestMessage 'Method_TextDocumentImplementation)
  ImplementationParams
params ((ImplementationParams -> Const Uri ImplementationParams)
 -> TRequestMessage 'Method_TextDocumentImplementation
 -> Const Uri (TRequestMessage 'Method_TextDocumentImplementation))
-> ((Uri -> Const Uri Uri)
    -> ImplementationParams -> Const Uri ImplementationParams)
-> Getting
     Uri (TRequestMessage 'Method_TextDocumentImplementation) Uri
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> ImplementationParams -> Const Uri ImplementationParams
forall s a. HasTextDocument s a => Lens' s a
Lens' ImplementationParams TextDocumentIdentifier
textDocument ((TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
 -> ImplementationParams -> Const Uri ImplementationParams)
-> ((Uri -> Const Uri Uri)
    -> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier)
-> (Uri -> Const Uri Uri)
-> ImplementationParams
-> Const Uri ImplementationParams
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Uri -> Const Uri Uri)
-> TextDocumentIdentifier -> Const Uri TextDocumentIdentifier
forall s a. HasUri s a => Lens' s a
Lens' TextDocumentIdentifier Uri
uri
    pure $
      [DefinitionLink (LocationLink originLoc targetUri targetRange targetRange)]

locationInfo :: Uri -> Position -> MaybeT Lsp Range
locationInfo :: Uri -> Position -> MaybeT Lsp Range
locationInfo Uri
uri Position
pos = do
  FileAnalysis {localBindingInfo} <- Uri -> MaybeT Lsp FileAnalysis
forall (m :: * -> *). Lspish m => Uri -> MaybeT m FileAnalysis
FileAnalysis.getFileAnalysis Uri
uri
  (_interval, (_typ, range)) <- hoistMaybe $ IM.lookupMin $ IM.intersecting localBindingInfo (IM.ClosedInterval pos pos)
  pure range
  where
    hoistMaybe :: Maybe a -> MaybeT Lsp a
    hoistMaybe :: forall a. Maybe a -> MaybeT Lsp a
hoistMaybe = Lsp (Maybe a) -> MaybeT Lsp a
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (Lsp (Maybe a) -> MaybeT Lsp a)
-> (Maybe a -> Lsp (Maybe a)) -> Maybe a -> MaybeT Lsp a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe a -> Lsp (Maybe a)
forall a. a -> Lsp a
forall (f :: * -> *) a. Applicative f => a -> f a
pure