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
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
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)]
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
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
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