-- | 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.ResponseError (Msg.MessageResult 'Msg.Method_TextDocumentDefinition) -> Lsp ()) -> Lsp ()
goToDefinitionHandler :: TRequestMessage 'Method_TextDocumentDefinition
-> (Either
      ResponseError (MessageResult 'Method_TextDocumentDefinition)
    -> Lsp ())
-> Lsp ()
goToDefinitionHandler TRequestMessage 'Method_TextDocumentDefinition
m Either ResponseError (MessageResult 'Method_TextDocumentDefinition)
-> Lsp ()
respond = do
  Either ResponseError (Definition |? ([DefinitionLink] |? Null))
-> Lsp ()
Either ResponseError (MessageResult 'Method_TextDocumentDefinition)
-> Lsp ()
respond (Either ResponseError (Definition |? ([DefinitionLink] |? Null))
 -> Lsp ())
-> (Maybe [DefinitionLink]
    -> Either ResponseError (Definition |? ([DefinitionLink] |? Null)))
-> Maybe [DefinitionLink]
-> Lsp ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Definition |? ([DefinitionLink] |? Null))
-> Either ResponseError (Definition |? ([DefinitionLink] |? Null))
forall a b. b -> Either a b
Right ((Definition |? ([DefinitionLink] |? Null))
 -> Either ResponseError (Definition |? ([DefinitionLink] |? Null)))
-> (Maybe [DefinitionLink]
    -> Definition |? ([DefinitionLink] |? Null))
-> Maybe [DefinitionLink]
-> Either ResponseError (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)
    Range
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
originLoc = Maybe a
forall a. Maybe a
Nothing -- Just use default
    let targetUri :: Uri
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
    [DefinitionLink] -> MaybeT Lsp [DefinitionLink]
forall a. a -> MaybeT Lsp a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([DefinitionLink] -> MaybeT Lsp [DefinitionLink])
-> [DefinitionLink] -> MaybeT Lsp [DefinitionLink]
forall a b. (a -> b) -> a -> b
$
      [LocationLink -> DefinitionLink
DefinitionLink (Maybe Range -> Uri -> Range -> Range -> LocationLink
LocationLink Maybe Range
forall a. Maybe a
originLoc Uri
targetUri Range
targetRange Range
targetRange)]

-- | Go to Declaration handler
goToDeclarationHandler :: Msg.TRequestMessage 'Msg.Method_TextDocumentDeclaration -> (Either Msg.ResponseError (Msg.MessageResult 'Msg.Method_TextDocumentDeclaration) -> Lsp ()) -> Lsp ()
goToDeclarationHandler :: TRequestMessage 'Method_TextDocumentDeclaration
-> (Either
      ResponseError (MessageResult 'Method_TextDocumentDeclaration)
    -> Lsp ())
-> Lsp ()
goToDeclarationHandler TRequestMessage 'Method_TextDocumentDeclaration
m Either
  ResponseError (MessageResult 'Method_TextDocumentDeclaration)
-> Lsp ()
respond = do
  Either ResponseError (Declaration |? ([DeclarationLink] |? Null))
-> Lsp ()
Either
  ResponseError (MessageResult 'Method_TextDocumentDeclaration)
-> Lsp ()
respond (Either ResponseError (Declaration |? ([DeclarationLink] |? Null))
 -> Lsp ())
-> (Maybe [DeclarationLink]
    -> Either
         ResponseError (Declaration |? ([DeclarationLink] |? Null)))
-> Maybe [DeclarationLink]
-> Lsp ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Declaration |? ([DeclarationLink] |? Null))
-> Either
     ResponseError (Declaration |? ([DeclarationLink] |? Null))
forall a b. b -> Either a b
Right ((Declaration |? ([DeclarationLink] |? Null))
 -> Either
      ResponseError (Declaration |? ([DeclarationLink] |? Null)))
-> (Maybe [DeclarationLink]
    -> Declaration |? ([DeclarationLink] |? Null))
-> Maybe [DeclarationLink]
-> Either
     ResponseError (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)
    Range
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
originLoc = Maybe a
forall a. Maybe a
Nothing -- Just use default
    let targetUri :: Uri
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
    [DeclarationLink] -> MaybeT Lsp [DeclarationLink]
forall a. a -> MaybeT Lsp a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([DeclarationLink] -> MaybeT Lsp [DeclarationLink])
-> [DeclarationLink] -> MaybeT Lsp [DeclarationLink]
forall a b. (a -> b) -> a -> b
$
      [LocationLink -> DeclarationLink
DeclarationLink (Maybe Range -> Uri -> Range -> Range -> LocationLink
LocationLink Maybe Range
forall a. Maybe a
originLoc Uri
targetUri Range
targetRange Range
targetRange)]

goToImplementationHandler :: Msg.TRequestMessage 'Msg.Method_TextDocumentImplementation -> (Either Msg.ResponseError (Msg.MessageResult 'Msg.Method_TextDocumentImplementation) -> Lsp ()) -> Lsp ()
goToImplementationHandler :: TRequestMessage 'Method_TextDocumentImplementation
-> (Either
      ResponseError (MessageResult 'Method_TextDocumentImplementation)
    -> Lsp ())
-> Lsp ()
goToImplementationHandler TRequestMessage 'Method_TextDocumentImplementation
m Either
  ResponseError (MessageResult 'Method_TextDocumentImplementation)
-> Lsp ()
respond = do
  Either ResponseError (Definition |? ([DefinitionLink] |? Null))
-> Lsp ()
Either
  ResponseError (MessageResult 'Method_TextDocumentImplementation)
-> Lsp ()
respond (Either ResponseError (Definition |? ([DefinitionLink] |? Null))
 -> Lsp ())
-> (Maybe [DefinitionLink]
    -> Either ResponseError (Definition |? ([DefinitionLink] |? Null)))
-> Maybe [DefinitionLink]
-> Lsp ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Definition |? ([DefinitionLink] |? Null))
-> Either ResponseError (Definition |? ([DefinitionLink] |? Null))
forall a b. b -> Either a b
Right ((Definition |? ([DefinitionLink] |? Null))
 -> Either ResponseError (Definition |? ([DefinitionLink] |? Null)))
-> (Maybe [DefinitionLink]
    -> Definition |? ([DefinitionLink] |? Null))
-> Maybe [DefinitionLink]
-> Either ResponseError (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)
    Range
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
originLoc = Maybe a
forall a. Maybe a
Nothing -- Just use default
    let targetUri :: Uri
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
    [DefinitionLink] -> MaybeT Lsp [DefinitionLink]
forall a. a -> MaybeT Lsp a
forall (f :: * -> *) a. Applicative f => a -> f a
pure ([DefinitionLink] -> MaybeT Lsp [DefinitionLink])
-> [DefinitionLink] -> MaybeT Lsp [DefinitionLink]
forall a b. (a -> b) -> a -> b
$
      [LocationLink -> DefinitionLink
DefinitionLink (Maybe Range -> Uri -> Range -> Range -> LocationLink
LocationLink Maybe Range
forall a. Maybe a
originLoc Uri
targetUri Range
targetRange Range
targetRange)]

locationInfo :: Uri -> Position -> MaybeT Lsp Range
locationInfo :: Uri -> Position -> MaybeT Lsp Range
locationInfo Uri
uri Position
pos = do
  FileAnalysis {IntervalMap Position (Type Symbol Ann, Range)
localBindingInfo :: IntervalMap Position (Type Symbol Ann, Range)
$sel:localBindingInfo:FileAnalysis :: FileAnalysis -> IntervalMap Position (Type Symbol Ann, Range)
localBindingInfo} <- Uri -> MaybeT Lsp FileAnalysis
forall (m :: * -> *). Lspish m => Uri -> MaybeT m FileAnalysis
FileAnalysis.getFileAnalysis Uri
uri
  (Interval Position
_interval, (Type Symbol Ann
_typ, Range
range)) <- Maybe (Interval Position, (Type Symbol Ann, Range))
-> MaybeT Lsp (Interval Position, (Type Symbol Ann, Range))
forall a. Maybe a -> MaybeT Lsp a
hoistMaybe (Maybe (Interval Position, (Type Symbol Ann, Range))
 -> MaybeT Lsp (Interval Position, (Type Symbol Ann, Range)))
-> Maybe (Interval Position, (Type Symbol Ann, Range))
-> MaybeT Lsp (Interval Position, (Type Symbol Ann, Range))
forall a b. (a -> b) -> a -> b
$ IntervalMap Position (Type Symbol Ann, Range)
-> Maybe (Interval Position, (Type Symbol Ann, Range))
forall k v. IntervalMap k v -> Maybe (k, v)
IM.lookupMin (IntervalMap Position (Type Symbol Ann, Range)
 -> Maybe (Interval Position, (Type Symbol Ann, Range)))
-> IntervalMap Position (Type Symbol Ann, Range)
-> Maybe (Interval Position, (Type Symbol Ann, Range))
forall a b. (a -> b) -> a -> b
$ IntervalMap Position (Type Symbol Ann, Range)
-> Interval Position
-> IntervalMap Position (Type Symbol Ann, Range)
forall k e v.
Interval k e =>
IntervalMap k v -> k -> IntervalMap k v
IM.intersecting IntervalMap Position (Type Symbol Ann, Range)
localBindingInfo (Position -> Position -> Interval Position
forall a. a -> a -> Interval a
IM.ClosedInterval Position
pos Position
pos)
  Range -> MaybeT Lsp Range
forall a. a -> MaybeT Lsp a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Range
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