{-# LANGUAGE DataKinds #-}
module Unison.LSP.Queries
  ( markdownDocsForFQN,
    getTypeOfReferent,
    getTypeDeclaration,
    refAtPosition,
    nodeAtPosition,
    nodeAtPositionMatching,
    refInTerm,
    refInType,
    findSmallestEnclosingNode,
    findSmallestEnclosingType,
    findSmallestEnclosingTypeMatching,
    findSmallestEnclosingNodeMatching,
    findSmallestEnclosingPattern,
    findSmallestEnclosingPatternMatching,
    refInDecl,
    SourceNode (..),
  )
where
import Control.Lens
import Control.Lens qualified as Lens
import Control.Monad.Reader
import Data.Generics.Product (field)
import Language.LSP.Protocol.Types
import Unison.ABT qualified as ABT
import Unison.Builtin.Decls qualified as Builtins
import Unison.Codebase qualified as Codebase
import Unison.ConstructorReference (GConstructorReference (..))
import Unison.ConstructorType qualified as CT
import Unison.DataDeclaration (Decl)
import Unison.DataDeclaration qualified as DD
import Unison.HashQualified qualified as HQ
import Unison.LSP.Conversions (lspToUPos)
import Unison.LSP.FileAnalysis (getFileSummary, ppedForFile)
import Unison.LSP.Orphans ()
import Unison.LSP.Types
import Unison.LabeledDependency
import Unison.LabeledDependency qualified as LD
import Unison.Lexer.Pos (Pos (..))
import Unison.Name (Name)
import Unison.NamesWithHistory (SearchType (..))
import Unison.Parser.Ann (Ann)
import Unison.Parser.Ann qualified as Ann
import Unison.Pattern qualified as Pattern
import Unison.Prelude
import Unison.Reference (TypeReference)
import Unison.Reference qualified as Reference
import Unison.Referent (Referent)
import Unison.Referent qualified as Referent
import Unison.Server.Backend qualified as Backend
import Unison.Server.Doc.Markdown.Render qualified as Md
import Unison.Server.Doc.Markdown.Types qualified as Md
import Unison.Symbol (Symbol)
import Unison.Syntax.Parser (ann)
import Unison.Term (MatchCase (MatchCase), Term)
import Unison.Term qualified as Term
import Unison.Type (Type)
import Unison.Type qualified as Type
import Unison.UnisonFile.Summary (FileSummary (..))
import Unison.Util.Pretty qualified as Pretty
refAtPosition :: forall m. (Lspish m) => Uri -> Position -> MaybeT m LabeledDependency
refAtPosition :: forall (m :: * -> *).
Lspish m =>
Uri -> Position -> MaybeT m LabeledDependency
refAtPosition Uri
uri Position
pos = do
  MaybeT m LabeledDependency
findInNode MaybeT m LabeledDependency
-> MaybeT m LabeledDependency -> MaybeT m LabeledDependency
forall a. MaybeT m a -> MaybeT m a -> MaybeT m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> MaybeT m LabeledDependency
findInDecl
  where
    findInNode :: MaybeT m LabeledDependency
    findInNode :: MaybeT m LabeledDependency
findInNode =
      Uri -> Position -> MaybeT m (SourceNode Ann)
forall (m :: * -> *).
Lspish m =>
Uri -> Position -> MaybeT m (SourceNode Ann)
nodeAtPosition Uri
uri Position
pos MaybeT m (SourceNode Ann)
-> (SourceNode Ann -> MaybeT m LabeledDependency)
-> MaybeT m LabeledDependency
forall a b. MaybeT m a -> (a -> MaybeT m b) -> MaybeT m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
        TermNode Term Symbol Ann
term -> Maybe LabeledDependency -> MaybeT m LabeledDependency
forall a. Maybe a -> MaybeT m a
hoistMaybe (Maybe LabeledDependency -> MaybeT m LabeledDependency)
-> Maybe LabeledDependency -> MaybeT m LabeledDependency
forall a b. (a -> b) -> a -> b
$ Term Symbol Ann -> Maybe LabeledDependency
forall v a. Term v a -> Maybe LabeledDependency
refInTerm Term Symbol Ann
term
        TypeNode Type Symbol Ann
typ -> Maybe LabeledDependency -> MaybeT m LabeledDependency
forall a. Maybe a -> MaybeT m a
hoistMaybe (Maybe LabeledDependency -> MaybeT m LabeledDependency)
-> Maybe LabeledDependency -> MaybeT m LabeledDependency
forall a b. (a -> b) -> a -> b
$ (Reference -> LabeledDependency)
-> Maybe Reference -> Maybe LabeledDependency
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Reference -> LabeledDependency
TypeReference (Type Symbol Ann -> Maybe Reference
forall v a. Type v a -> Maybe Reference
refInType Type Symbol Ann
typ)
        PatternNode Pattern Ann
pat -> Maybe LabeledDependency -> MaybeT m LabeledDependency
forall a. Maybe a -> MaybeT m a
hoistMaybe (Maybe LabeledDependency -> MaybeT m LabeledDependency)
-> Maybe LabeledDependency -> MaybeT m LabeledDependency
forall a b. (a -> b) -> a -> b
$ Pattern Ann -> Maybe LabeledDependency
forall a. Pattern a -> Maybe LabeledDependency
refInPattern Pattern Ann
pat
    findInDecl :: MaybeT m LabeledDependency
    findInDecl :: MaybeT m LabeledDependency
findInDecl =
      Reference -> LabeledDependency
LD.TypeReference (Reference -> LabeledDependency)
-> MaybeT m Reference -> MaybeT m LabeledDependency
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> do
        let uPos :: Pos
uPos = Position -> Pos
lspToUPos Position
pos
        (FileSummary {Map Symbol (Id, DataDeclaration Symbol Ann)
dataDeclsBySymbol :: Map Symbol (Id, DataDeclaration Symbol Ann)
$sel:dataDeclsBySymbol:FileSummary :: FileSummary -> Map Symbol (Id, DataDeclaration Symbol Ann)
dataDeclsBySymbol, Map Symbol (Id, EffectDeclaration Symbol Ann)
effectDeclsBySymbol :: Map Symbol (Id, EffectDeclaration Symbol Ann)
$sel:effectDeclsBySymbol:FileSummary :: FileSummary -> Map Symbol (Id, EffectDeclaration Symbol Ann)
effectDeclsBySymbol}) <- Uri -> MaybeT m FileSummary
forall (m :: * -> *). Lspish m => Uri -> MaybeT m FileSummary
getFileSummary Uri
uri
        ( ((Id, DataDeclaration Symbol Ann) -> MaybeT m Reference)
-> Map Symbol (Id, DataDeclaration Symbol Ann)
-> MaybeT m Reference
forall (f :: * -> *) (t :: * -> *) a b.
(Alternative f, Foldable t) =>
(a -> f b) -> t a -> f b
altMap (Maybe Reference -> MaybeT m Reference
forall a. Maybe a -> MaybeT m a
hoistMaybe (Maybe Reference -> MaybeT m Reference)
-> ((Id, DataDeclaration Symbol Ann) -> Maybe Reference)
-> (Id, DataDeclaration Symbol Ann)
-> MaybeT m Reference
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pos -> Decl Symbol Ann -> Maybe Reference
refInDecl Pos
uPos (Decl Symbol Ann -> Maybe Reference)
-> ((Id, DataDeclaration Symbol Ann) -> Decl Symbol Ann)
-> (Id, DataDeclaration Symbol Ann)
-> Maybe Reference
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DataDeclaration Symbol Ann -> Decl Symbol Ann
forall a b. b -> Either a b
Right (DataDeclaration Symbol Ann -> Decl Symbol Ann)
-> ((Id, DataDeclaration Symbol Ann) -> DataDeclaration Symbol Ann)
-> (Id, DataDeclaration Symbol Ann)
-> Decl Symbol Ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Id, DataDeclaration Symbol Ann) -> DataDeclaration Symbol Ann
forall a b. (a, b) -> b
snd) Map Symbol (Id, DataDeclaration Symbol Ann)
dataDeclsBySymbol
            MaybeT m Reference -> MaybeT m Reference -> MaybeT m Reference
forall a. MaybeT m a -> MaybeT m a -> MaybeT m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> ((Id, EffectDeclaration Symbol Ann) -> MaybeT m Reference)
-> Map Symbol (Id, EffectDeclaration Symbol Ann)
-> MaybeT m Reference
forall (f :: * -> *) (t :: * -> *) a b.
(Alternative f, Foldable t) =>
(a -> f b) -> t a -> f b
altMap (Maybe Reference -> MaybeT m Reference
forall a. Maybe a -> MaybeT m a
hoistMaybe (Maybe Reference -> MaybeT m Reference)
-> ((Id, EffectDeclaration Symbol Ann) -> Maybe Reference)
-> (Id, EffectDeclaration Symbol Ann)
-> MaybeT m Reference
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pos -> Decl Symbol Ann -> Maybe Reference
refInDecl Pos
uPos (Decl Symbol Ann -> Maybe Reference)
-> ((Id, EffectDeclaration Symbol Ann) -> Decl Symbol Ann)
-> (Id, EffectDeclaration Symbol Ann)
-> Maybe Reference
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EffectDeclaration Symbol Ann -> Decl Symbol Ann
forall a b. a -> Either a b
Left (EffectDeclaration Symbol Ann -> Decl Symbol Ann)
-> ((Id, EffectDeclaration Symbol Ann)
    -> EffectDeclaration Symbol Ann)
-> (Id, EffectDeclaration Symbol Ann)
-> Decl Symbol Ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Id, EffectDeclaration Symbol Ann) -> EffectDeclaration Symbol Ann
forall a b. (a, b) -> b
snd) Map Symbol (Id, EffectDeclaration Symbol Ann)
effectDeclsBySymbol
          )
    hoistMaybe :: Maybe a -> MaybeT m a
    hoistMaybe :: forall a. Maybe a -> MaybeT m a
hoistMaybe = m (Maybe a) -> MaybeT m a
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (m (Maybe a) -> MaybeT m a)
-> (Maybe a -> m (Maybe a)) -> Maybe a -> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe a -> m (Maybe a)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
getTypeOfReferent :: (Lspish m) => Uri -> Referent -> MaybeT m (Type Symbol Ann)
getTypeOfReferent :: forall (m :: * -> *).
Lspish m =>
Uri -> Referent -> MaybeT m (Type Symbol Ann)
getTypeOfReferent Uri
fileUri Referent
ref = do
  MaybeT m (Type Symbol Ann)
getFromFile MaybeT m (Type Symbol Ann)
-> MaybeT m (Type Symbol Ann) -> MaybeT m (Type Symbol Ann)
forall a. MaybeT m a -> MaybeT m a -> MaybeT m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> MaybeT m (Type Symbol Ann)
getFromCodebase
  where
    getFromFile :: MaybeT m (Type Symbol Ann)
getFromFile = do
      FileSummary {Map
  (Maybe Id)
  (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
termsByReference :: Map
  (Maybe Id)
  (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
$sel:termsByReference:FileSummary :: FileSummary
-> Map
     (Maybe Id)
     (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
termsByReference} <- Uri -> MaybeT m FileSummary
forall (m :: * -> *). Lspish m => Uri -> MaybeT m FileSummary
getFileSummary Uri
fileUri
      case Referent
ref of
        Referent.Ref (Reference.Builtin {}) -> MaybeT m (Type Symbol Ann)
forall a. MaybeT m a
forall (f :: * -> *) a. Alternative f => f a
empty
        Referent.Ref (Reference.DerivedId Id
termRefId) -> do
          m (Maybe (Type Symbol Ann)) -> MaybeT m (Type Symbol Ann)
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (m (Maybe (Type Symbol Ann)) -> MaybeT m (Type Symbol Ann))
-> (Maybe (Type Symbol Ann) -> m (Maybe (Type Symbol Ann)))
-> Maybe (Type Symbol Ann)
-> MaybeT m (Type Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe (Type Symbol Ann) -> m (Maybe (Type Symbol Ann))
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (Type Symbol Ann) -> MaybeT m (Type Symbol Ann))
-> Maybe (Type Symbol Ann) -> MaybeT m (Type Symbol Ann)
forall a b. (a -> b) -> a -> b
$ (Map
  (Maybe Id)
  (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
termsByReference Map
  (Maybe Id)
  (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
-> Getting
     (First (Type Symbol Ann))
     (Map
        (Maybe Id)
        (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))))
     (Type Symbol Ann)
-> Maybe (Type Symbol Ann)
forall s a. s -> Getting (First a) s a -> Maybe a
^? Index
  (Map
     (Maybe Id)
     (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))))
-> Traversal'
     (Map
        (Maybe Id)
        (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))))
     (IxValue
        (Map
           (Maybe Id)
           (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))))
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix (Id -> Maybe Id
forall a. a -> Maybe a
Just Id
termRefId) ((Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
  -> Const
       (First (Type Symbol Ann))
       (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))))
 -> Map
      (Maybe Id)
      (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
 -> Const
      (First (Type Symbol Ann))
      (Map
         (Maybe Id)
         (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))))
-> ((Type Symbol Ann
     -> Const (First (Type Symbol Ann)) (Type Symbol Ann))
    -> Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
    -> Const
         (First (Type Symbol Ann))
         (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))))
-> Getting
     (First (Type Symbol Ann))
     (Map
        (Maybe Id)
        (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))))
     (Type Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
 -> Const
      (First (Type Symbol Ann))
      (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
-> Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
-> Const
     (First (Type Symbol Ann))
     (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
forall (f :: * -> *) a. Foldable f => IndexedFold Int (f a) a
IndexedFold
  Int
  (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
  (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
folded (((Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
  -> Const
       (First (Type Symbol Ann))
       (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
 -> Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
 -> Const
      (First (Type Symbol Ann))
      (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))))
-> ((Type Symbol Ann
     -> Const (First (Type Symbol Ann)) (Type Symbol Ann))
    -> (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
    -> Const
         (First (Type Symbol Ann))
         (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
-> (Type Symbol Ann
    -> Const (First (Type Symbol Ann)) (Type Symbol Ann))
-> Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
-> Const
     (First (Type Symbol Ann))
     (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Maybe (Type Symbol Ann)
 -> Const (First (Type Symbol Ann)) (Maybe (Type Symbol Ann)))
-> (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
-> Const
     (First (Type Symbol Ann))
     (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
forall s t a b. Field3 s t a b => Lens s t a b
Lens
  (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
  (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
  (Maybe (Type Symbol Ann))
  (Maybe (Type Symbol Ann))
_3 ((Maybe (Type Symbol Ann)
  -> Const (First (Type Symbol Ann)) (Maybe (Type Symbol Ann)))
 -> (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
 -> Const
      (First (Type Symbol Ann))
      (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
-> ((Type Symbol Ann
     -> Const (First (Type Symbol Ann)) (Type Symbol Ann))
    -> Maybe (Type Symbol Ann)
    -> Const (First (Type Symbol Ann)) (Maybe (Type Symbol Ann)))
-> (Type Symbol Ann
    -> Const (First (Type Symbol Ann)) (Type Symbol Ann))
-> (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
-> Const
     (First (Type Symbol Ann))
     (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Type Symbol Ann
 -> Const (First (Type Symbol Ann)) (Type Symbol Ann))
-> Maybe (Type Symbol Ann)
-> Const (First (Type Symbol Ann)) (Maybe (Type Symbol Ann))
forall a b (p :: * -> * -> *) (f :: * -> *).
(Choice p, Applicative f) =>
p a (f b) -> p (Maybe a) (f (Maybe b))
_Just)
        Referent.Con (ConstructorReference Reference
r0 ConstructorId
cid) ConstructorType
_type -> do
          case Reference
r0 of
            Reference.DerivedId Id
r -> do
              Decl Symbol Ann
decl <- Uri -> Id -> MaybeT m (Decl Symbol Ann)
forall (m :: * -> *).
Lspish m =>
Uri -> Id -> MaybeT m (Decl Symbol Ann)
getTypeDeclaration Uri
fileUri Id
r
              m (Maybe (Type Symbol Ann)) -> MaybeT m (Type Symbol Ann)
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (m (Maybe (Type Symbol Ann)) -> MaybeT m (Type Symbol Ann))
-> (Maybe (Type Symbol Ann) -> m (Maybe (Type Symbol Ann)))
-> Maybe (Type Symbol Ann)
-> MaybeT m (Type Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe (Type Symbol Ann) -> m (Maybe (Type Symbol Ann))
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (Type Symbol Ann) -> MaybeT m (Type Symbol Ann))
-> Maybe (Type Symbol Ann) -> MaybeT m (Type Symbol Ann)
forall a b. (a -> b) -> a -> b
$ DataDeclaration Symbol Ann
-> ConstructorId -> Maybe (Type Symbol Ann)
forall v a.
DataDeclaration v a -> ConstructorId -> Maybe (Type v a)
DD.typeOfConstructor ((EffectDeclaration Symbol Ann -> DataDeclaration Symbol Ann)
-> (DataDeclaration Symbol Ann -> DataDeclaration Symbol Ann)
-> Decl Symbol Ann
-> DataDeclaration Symbol Ann
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either EffectDeclaration Symbol Ann -> DataDeclaration Symbol Ann
forall v a. EffectDeclaration v a -> DataDeclaration v a
DD.toDataDecl DataDeclaration Symbol Ann -> DataDeclaration Symbol Ann
forall a. a -> a
id Decl Symbol Ann
decl) ConstructorId
cid
            Reference.Builtin Text
_ -> MaybeT m (Type Symbol Ann)
forall a. MaybeT m a
forall (f :: * -> *) a. Alternative f => f a
empty
    getFromCodebase :: MaybeT m (Type Symbol Ann)
getFromCodebase = do
      Env {Codebase IO Symbol Ann
codebase :: Codebase IO Symbol Ann
$sel:codebase:Env :: Env -> Codebase IO Symbol Ann
codebase} <- MaybeT m Env
forall r (m :: * -> *). MonadReader r m => m r
ask
      m (Maybe (Type Symbol Ann)) -> MaybeT m (Type Symbol Ann)
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (m (Maybe (Type Symbol Ann)) -> MaybeT m (Type Symbol Ann))
-> (IO (Maybe (Type Symbol Ann)) -> m (Maybe (Type Symbol Ann)))
-> IO (Maybe (Type Symbol Ann))
-> MaybeT m (Type Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (Maybe (Type Symbol Ann)) -> m (Maybe (Type Symbol Ann))
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe (Type Symbol Ann)) -> MaybeT m (Type Symbol Ann))
-> IO (Maybe (Type Symbol Ann)) -> MaybeT m (Type Symbol Ann)
forall a b. (a -> b) -> a -> b
$ Codebase IO Symbol Ann
-> Transaction (Maybe (Type Symbol Ann))
-> IO (Maybe (Type Symbol Ann))
forall (m :: * -> *) v a b.
MonadIO m =>
Codebase m v a -> Transaction b -> m b
Codebase.runTransaction Codebase IO Symbol Ann
codebase (Transaction (Maybe (Type Symbol Ann))
 -> IO (Maybe (Type Symbol Ann)))
-> Transaction (Maybe (Type Symbol Ann))
-> IO (Maybe (Type Symbol Ann))
forall a b. (a -> b) -> a -> b
$ Codebase IO Symbol Ann
-> Referent -> Transaction (Maybe (Type Symbol Ann))
forall a (m :: * -> *).
BuiltinAnnotation a =>
Codebase m Symbol a
-> Referent -> Transaction (Maybe (Type Symbol a))
Codebase.getTypeOfReferent Codebase IO Symbol Ann
codebase Referent
ref
getTypeDeclaration :: forall m. (Lspish m) => Uri -> Reference.Id -> MaybeT m (Decl Symbol Ann)
getTypeDeclaration :: forall (m :: * -> *).
Lspish m =>
Uri -> Id -> MaybeT m (Decl Symbol Ann)
getTypeDeclaration Uri
fileUri Id
refId = do
  MaybeT m (Decl Symbol Ann)
getFromFile MaybeT m (Decl Symbol Ann)
-> MaybeT m (Decl Symbol Ann) -> MaybeT m (Decl Symbol Ann)
forall a. MaybeT m a -> MaybeT m a -> MaybeT m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> MaybeT m (Decl Symbol Ann)
getFromCodebase
  where
    getFromFile :: MaybeT m (Decl Symbol Ann)
    getFromFile :: MaybeT m (Decl Symbol Ann)
getFromFile = do
      FileSummary {Map Id (Map Symbol (DataDeclaration Symbol Ann))
dataDeclsByReference :: Map Id (Map Symbol (DataDeclaration Symbol Ann))
$sel:dataDeclsByReference:FileSummary :: FileSummary -> Map Id (Map Symbol (DataDeclaration Symbol Ann))
dataDeclsByReference, Map Id (Map Symbol (EffectDeclaration Symbol Ann))
effectDeclsByReference :: Map Id (Map Symbol (EffectDeclaration Symbol Ann))
$sel:effectDeclsByReference:FileSummary :: FileSummary -> Map Id (Map Symbol (EffectDeclaration Symbol Ann))
effectDeclsByReference} <- Uri -> MaybeT m FileSummary
forall (m :: * -> *). Lspish m => Uri -> MaybeT m FileSummary
getFileSummary Uri
fileUri
      let datas :: [DataDeclaration Symbol Ann]
datas = Map Id (Map Symbol (DataDeclaration Symbol Ann))
dataDeclsByReference Map Id (Map Symbol (DataDeclaration Symbol Ann))
-> Getting
     (Endo [DataDeclaration Symbol Ann])
     (Map Id (Map Symbol (DataDeclaration Symbol Ann)))
     (DataDeclaration Symbol Ann)
-> [DataDeclaration Symbol Ann]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. Index (Map Id (Map Symbol (DataDeclaration Symbol Ann)))
-> Traversal'
     (Map Id (Map Symbol (DataDeclaration Symbol Ann)))
     (IxValue (Map Id (Map Symbol (DataDeclaration Symbol Ann))))
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index (Map Id (Map Symbol (DataDeclaration Symbol Ann)))
Id
refId ((Map Symbol (DataDeclaration Symbol Ann)
  -> Const
       (Endo [DataDeclaration Symbol Ann])
       (Map Symbol (DataDeclaration Symbol Ann)))
 -> Map Id (Map Symbol (DataDeclaration Symbol Ann))
 -> Const
      (Endo [DataDeclaration Symbol Ann])
      (Map Id (Map Symbol (DataDeclaration Symbol Ann))))
-> ((DataDeclaration Symbol Ann
     -> Const
          (Endo [DataDeclaration Symbol Ann]) (DataDeclaration Symbol Ann))
    -> Map Symbol (DataDeclaration Symbol Ann)
    -> Const
         (Endo [DataDeclaration Symbol Ann])
         (Map Symbol (DataDeclaration Symbol Ann)))
-> Getting
     (Endo [DataDeclaration Symbol Ann])
     (Map Id (Map Symbol (DataDeclaration Symbol Ann)))
     (DataDeclaration Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (DataDeclaration Symbol Ann
 -> Const
      (Endo [DataDeclaration Symbol Ann]) (DataDeclaration Symbol Ann))
-> Map Symbol (DataDeclaration Symbol Ann)
-> Const
     (Endo [DataDeclaration Symbol Ann])
     (Map Symbol (DataDeclaration Symbol Ann))
forall (f :: * -> *) a. Foldable f => IndexedFold Int (f a) a
IndexedFold
  Int
  (Map Symbol (DataDeclaration Symbol Ann))
  (DataDeclaration Symbol Ann)
folded
      let effects :: [EffectDeclaration Symbol Ann]
effects = Map Id (Map Symbol (EffectDeclaration Symbol Ann))
effectDeclsByReference Map Id (Map Symbol (EffectDeclaration Symbol Ann))
-> Getting
     (Endo [EffectDeclaration Symbol Ann])
     (Map Id (Map Symbol (EffectDeclaration Symbol Ann)))
     (EffectDeclaration Symbol Ann)
-> [EffectDeclaration Symbol Ann]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. Index (Map Id (Map Symbol (EffectDeclaration Symbol Ann)))
-> Traversal'
     (Map Id (Map Symbol (EffectDeclaration Symbol Ann)))
     (IxValue (Map Id (Map Symbol (EffectDeclaration Symbol Ann))))
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index (Map Id (Map Symbol (EffectDeclaration Symbol Ann)))
Id
refId ((Map Symbol (EffectDeclaration Symbol Ann)
  -> Const
       (Endo [EffectDeclaration Symbol Ann])
       (Map Symbol (EffectDeclaration Symbol Ann)))
 -> Map Id (Map Symbol (EffectDeclaration Symbol Ann))
 -> Const
      (Endo [EffectDeclaration Symbol Ann])
      (Map Id (Map Symbol (EffectDeclaration Symbol Ann))))
-> ((EffectDeclaration Symbol Ann
     -> Const
          (Endo [EffectDeclaration Symbol Ann])
          (EffectDeclaration Symbol Ann))
    -> Map Symbol (EffectDeclaration Symbol Ann)
    -> Const
         (Endo [EffectDeclaration Symbol Ann])
         (Map Symbol (EffectDeclaration Symbol Ann)))
-> Getting
     (Endo [EffectDeclaration Symbol Ann])
     (Map Id (Map Symbol (EffectDeclaration Symbol Ann)))
     (EffectDeclaration Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (EffectDeclaration Symbol Ann
 -> Const
      (Endo [EffectDeclaration Symbol Ann])
      (EffectDeclaration Symbol Ann))
-> Map Symbol (EffectDeclaration Symbol Ann)
-> Const
     (Endo [EffectDeclaration Symbol Ann])
     (Map Symbol (EffectDeclaration Symbol Ann))
forall (f :: * -> *) a. Foldable f => IndexedFold Int (f a) a
IndexedFold
  Int
  (Map Symbol (EffectDeclaration Symbol Ann))
  (EffectDeclaration Symbol Ann)
folded
      m (Maybe (Decl Symbol Ann)) -> MaybeT m (Decl Symbol Ann)
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (m (Maybe (Decl Symbol Ann)) -> MaybeT m (Decl Symbol Ann))
-> ([Decl Symbol Ann] -> m (Maybe (Decl Symbol Ann)))
-> [Decl Symbol Ann]
-> MaybeT m (Decl Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe (Decl Symbol Ann) -> m (Maybe (Decl Symbol Ann))
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe (Decl Symbol Ann) -> m (Maybe (Decl Symbol Ann)))
-> ([Decl Symbol Ann] -> Maybe (Decl Symbol Ann))
-> [Decl Symbol Ann]
-> m (Maybe (Decl Symbol Ann))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Decl Symbol Ann] -> Maybe (Decl Symbol Ann)
forall a. [a] -> Maybe a
listToMaybe ([Decl Symbol Ann] -> MaybeT m (Decl Symbol Ann))
-> [Decl Symbol Ann] -> MaybeT m (Decl Symbol Ann)
forall a b. (a -> b) -> a -> b
$ (DataDeclaration Symbol Ann -> Decl Symbol Ann)
-> [DataDeclaration Symbol Ann] -> [Decl Symbol Ann]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap DataDeclaration Symbol Ann -> Decl Symbol Ann
forall a b. b -> Either a b
Right [DataDeclaration Symbol Ann]
datas [Decl Symbol Ann] -> [Decl Symbol Ann] -> [Decl Symbol Ann]
forall a. Semigroup a => a -> a -> a
<> (EffectDeclaration Symbol Ann -> Decl Symbol Ann)
-> [EffectDeclaration Symbol Ann] -> [Decl Symbol Ann]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap EffectDeclaration Symbol Ann -> Decl Symbol Ann
forall a b. a -> Either a b
Left [EffectDeclaration Symbol Ann]
effects
    getFromCodebase :: MaybeT m (Decl Symbol Ann)
getFromCodebase = do
      Env {Codebase IO Symbol Ann
$sel:codebase:Env :: Env -> Codebase IO Symbol Ann
codebase :: Codebase IO Symbol Ann
codebase} <- MaybeT m Env
forall r (m :: * -> *). MonadReader r m => m r
ask
      m (Maybe (Decl Symbol Ann)) -> MaybeT m (Decl Symbol Ann)
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (m (Maybe (Decl Symbol Ann)) -> MaybeT m (Decl Symbol Ann))
-> (IO (Maybe (Decl Symbol Ann)) -> m (Maybe (Decl Symbol Ann)))
-> IO (Maybe (Decl Symbol Ann))
-> MaybeT m (Decl Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. IO (Maybe (Decl Symbol Ann)) -> m (Maybe (Decl Symbol Ann))
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe (Decl Symbol Ann)) -> MaybeT m (Decl Symbol Ann))
-> IO (Maybe (Decl Symbol Ann)) -> MaybeT m (Decl Symbol Ann)
forall a b. (a -> b) -> a -> b
$ Codebase IO Symbol Ann
-> Transaction (Maybe (Decl Symbol Ann))
-> IO (Maybe (Decl Symbol Ann))
forall (m :: * -> *) v a b.
MonadIO m =>
Codebase m v a -> Transaction b -> m b
Codebase.runTransaction Codebase IO Symbol Ann
codebase (Transaction (Maybe (Decl Symbol Ann))
 -> IO (Maybe (Decl Symbol Ann)))
-> Transaction (Maybe (Decl Symbol Ann))
-> IO (Maybe (Decl Symbol Ann))
forall a b. (a -> b) -> a -> b
$ Codebase IO Symbol Ann
-> Id -> Transaction (Maybe (Decl Symbol Ann))
forall (m :: * -> *) v a.
Codebase m v a -> Id -> Transaction (Maybe (Decl v a))
Codebase.getTypeDeclaration Codebase IO Symbol Ann
codebase Id
refId
refInTerm :: (Term v a -> Maybe LabeledDependency)
refInTerm :: forall v a. Term v a -> Maybe LabeledDependency
refInTerm Term v a
term =
  case Term v a -> ABT (F v a a) v (Term v a)
forall (f :: * -> *) v a. Term f v a -> ABT f v (Term f v a)
ABT.out Term v a
term of
    ABT.Tm F v a a (Term v a)
f -> case F v a a (Term v a)
f of
      Term.Int {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Nat {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Float {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Boolean {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Text {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Char {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Blank {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Ref Reference
ref -> LabeledDependency -> Maybe LabeledDependency
forall a. a -> Maybe a
Just (Reference -> LabeledDependency
LD.TermReference Reference
ref)
      Term.Constructor GConstructorReference Reference
conRef -> LabeledDependency -> Maybe LabeledDependency
forall a. a -> Maybe a
Just (GConstructorReference Reference
-> ConstructorType -> LabeledDependency
LD.ConReference GConstructorReference Reference
conRef ConstructorType
CT.Data)
      Term.Request GConstructorReference Reference
conRef -> LabeledDependency -> Maybe LabeledDependency
forall a. a -> Maybe a
Just (GConstructorReference Reference
-> ConstructorType -> LabeledDependency
LD.ConReference GConstructorReference Reference
conRef ConstructorType
CT.Effect)
      Term.Handle Term v a
_a Term v a
_b -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.App Term v a
_a Term v a
_b -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Ann Term v a
_a Type v a
_typ -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.List Seq (Term v a)
_xs -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.If Term v a
_cond Term v a
_a Term v a
_b -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.And Term v a
_l Term v a
_r -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Or Term v a
_l Term v a
_r -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Lam Term v a
_a -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.LetRec IsTop
_isTop [Term v a]
_xs Term v a
_y -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Let IsTop
_isTop Term v a
_a Term v a
_b -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.Match Term v a
_a [MatchCase a (Term v a)]
_cases -> Maybe LabeledDependency
forall a. Maybe a
Nothing
      Term.TermLink Referent
ref -> LabeledDependency -> Maybe LabeledDependency
forall a. a -> Maybe a
Just (Referent -> LabeledDependency
LD.TermReferent Referent
ref)
      Term.TypeLink Reference
ref -> LabeledDependency -> Maybe LabeledDependency
forall a. a -> Maybe a
Just (Reference -> LabeledDependency
LD.TypeReference Reference
ref)
    ABT.Var v
_v -> Maybe LabeledDependency
forall a. Maybe a
Nothing
    ABT.Cycle Term v a
_r -> Maybe LabeledDependency
forall a. Maybe a
Nothing
    ABT.Abs v
_v Term v a
_r -> Maybe LabeledDependency
forall a. Maybe a
Nothing
refInType :: Type v a -> Maybe TypeReference
refInType :: forall v a. Type v a -> Maybe Reference
refInType Type v a
typ = case Type v a -> ABT F v (Type v a)
forall (f :: * -> *) v a. Term f v a -> ABT f v (Term f v a)
ABT.out Type v a
typ of
  ABT.Tm F (Type v a)
f -> case F (Type v a)
f of
    Type.Ref Reference
ref -> Reference -> Maybe Reference
forall a. a -> Maybe a
Just Reference
ref
    Type.Arrow Type v a
_a Type v a
_b -> Maybe Reference
forall a. Maybe a
Nothing
    Type.Effect Type v a
_a Type v a
_b -> Maybe Reference
forall a. Maybe a
Nothing
    Type.App Type v a
_a Type v a
_b -> Maybe Reference
forall a. Maybe a
Nothing
    Type.Forall Type v a
_r -> Maybe Reference
forall a. Maybe a
Nothing
    Type.Ann Type v a
_a Kind
_kind -> Maybe Reference
forall a. Maybe a
Nothing
    Type.Effects [Type v a]
_es -> Maybe Reference
forall a. Maybe a
Nothing
    Type.IntroOuter Type v a
_a -> Maybe Reference
forall a. Maybe a
Nothing
  ABT.Var v
_v -> Maybe Reference
forall a. Maybe a
Nothing
  ABT.Cycle Type v a
_r -> Maybe Reference
forall a. Maybe a
Nothing
  ABT.Abs v
_v Type v a
_r -> Maybe Reference
forall a. Maybe a
Nothing
refInPattern :: Pattern.Pattern a -> Maybe LabeledDependency
refInPattern :: forall a. Pattern a -> Maybe LabeledDependency
refInPattern = \case
  Pattern.Unbound {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.Var {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.Boolean {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.Int {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.Nat {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.Float {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.Text {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.Char {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.Constructor a
_loc GConstructorReference Reference
conRef [Pattern a]
_ -> LabeledDependency -> Maybe LabeledDependency
forall a. a -> Maybe a
Just (GConstructorReference Reference
-> ConstructorType -> LabeledDependency
LD.ConReference GConstructorReference Reference
conRef ConstructorType
CT.Data)
  Pattern.As a
_loc Pattern a
_pat -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.EffectPure {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.EffectBind a
_loc GConstructorReference Reference
conRef [Pattern a]
_ Pattern a
_ -> LabeledDependency -> Maybe LabeledDependency
forall a. a -> Maybe a
Just (GConstructorReference Reference
-> ConstructorType -> LabeledDependency
LD.ConReference GConstructorReference Reference
conRef ConstructorType
CT.Effect)
  Pattern.SequenceLiteral {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
  Pattern.SequenceOp {} -> Maybe LabeledDependency
forall a. Maybe a
Nothing
data SourceNode a
  = TermNode (Term Symbol a)
  | TypeNode (Type Symbol a)
  | PatternNode (Pattern.Pattern a)
  deriving stock (SourceNode a -> SourceNode a -> IsTop
(SourceNode a -> SourceNode a -> IsTop)
-> (SourceNode a -> SourceNode a -> IsTop) -> Eq (SourceNode a)
forall a. Eq a => SourceNode a -> SourceNode a -> IsTop
forall a. (a -> a -> IsTop) -> (a -> a -> IsTop) -> Eq a
$c== :: forall a. Eq a => SourceNode a -> SourceNode a -> IsTop
== :: SourceNode a -> SourceNode a -> IsTop
$c/= :: forall a. Eq a => SourceNode a -> SourceNode a -> IsTop
/= :: SourceNode a -> SourceNode a -> IsTop
Eq, Int -> SourceNode a -> ShowS
[SourceNode a] -> ShowS
SourceNode a -> String
(Int -> SourceNode a -> ShowS)
-> (SourceNode a -> String)
-> ([SourceNode a] -> ShowS)
-> Show (SourceNode a)
forall a. Int -> SourceNode a -> ShowS
forall a. [SourceNode a] -> ShowS
forall a. SourceNode a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Int -> SourceNode a -> ShowS
showsPrec :: Int -> SourceNode a -> ShowS
$cshow :: forall a. SourceNode a -> String
show :: SourceNode a -> String
$cshowList :: forall a. [SourceNode a] -> ShowS
showList :: [SourceNode a] -> ShowS
Show)
instance Functor SourceNode where
  fmap :: forall a b. (a -> b) -> SourceNode a -> SourceNode b
fmap a -> b
f (TermNode Term Symbol a
t) = Term Symbol b -> SourceNode b
forall a. Term Symbol a -> SourceNode a
TermNode ((a -> b) -> Term Symbol a -> Term Symbol b
forall v a a2. Ord v => (a -> a2) -> Term v a -> Term v a2
Term.amap a -> b
f Term Symbol a
t)
  fmap a -> b
f (TypeNode Type Symbol a
t) = Type Symbol b -> SourceNode b
forall a. Type Symbol a -> SourceNode a
TypeNode ((a -> b) -> Type Symbol a -> Type Symbol b
forall a b. (a -> b) -> Term F Symbol a -> Term F Symbol b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Type Symbol a
t)
  fmap a -> b
f (PatternNode Pattern a
t) = Pattern b -> SourceNode b
forall a. Pattern a -> SourceNode a
PatternNode ((a -> b) -> Pattern a -> Pattern b
forall a b. (a -> b) -> Pattern a -> Pattern b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> b
f Pattern a
t)
findSmallestEnclosingNode :: Pos -> Term Symbol Ann -> Maybe (SourceNode Ann)
findSmallestEnclosingNode :: Pos -> Term Symbol Ann -> Maybe (SourceNode Ann)
findSmallestEnclosingNode Pos
pos Term Symbol Ann
term = Pos
-> (SourceNode Ann -> Maybe (SourceNode Ann))
-> Term Symbol Ann
-> Maybe (SourceNode Ann)
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> Maybe (SourceNode Ann)
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Term Symbol Ann
term
findSmallestEnclosingNodeMatching :: forall m a. (MonadPlus m) => Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching :: forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
term
  | ABT.Term Set Symbol
_ Ann
absAnn (ABT.Abs Symbol
_ Term Symbol Ann
body) <- Term Symbol Ann
term =
      
      
      if Ann
absAnn Ann -> Pos -> IsTop
`Ann.contains` Pos
pos
        then Term Symbol Ann -> m a
termPred Term Symbol Ann
term m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
body
        else Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
body
  | Ann -> IsTop
annIsFilePosition Ann
ann IsTop -> IsTop -> IsTop
&& IsTop -> IsTop
not (Ann
ann Ann -> Pos -> IsTop
`Ann.contains` Pos
pos) = m a
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty
  | Just Term Symbol Ann
r <- Term Symbol Ann -> Maybe (Term Symbol Ann)
cleanImplicitUnit Term Symbol Ann
term = Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
r
  | IsTop
otherwise = do
      
      
      
      
      let guardInFile :: m ()
guardInFile = IsTop -> m ()
forall (f :: * -> *). Alternative f => IsTop -> f ()
guard (Ann -> IsTop
annIsFilePosition Ann
ann)
      let bestChild :: m a
bestChild = case Term Symbol Ann -> ABT (F Symbol Ann Ann) Symbol (Term Symbol Ann)
forall (f :: * -> *) v a. Term f v a -> ABT f v (Term f v a)
ABT.out Term Symbol Ann
term of
            ABT.Tm F Symbol Ann Ann (Term Symbol Ann)
f -> case F Symbol Ann Ann (Term Symbol Ann)
f of
              Term.Int {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Nat {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Float {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Boolean {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Text {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Char {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Blank {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Ref {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Constructor {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Request {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.Handle Term Symbol Ann
a Term Symbol Ann
b -> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
a m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
b
              Term.App Term Symbol Ann
a Term Symbol Ann
b ->
                
                
                
                
                
                
                
                Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
b m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
a
              Term.Ann Term Symbol Ann
a Type Symbol Ann
typ -> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
a m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
typePred Type Symbol Ann
typ)
              Term.List Seq (Term Symbol Ann)
xs -> Seq (m a) -> m a
forall (f :: * -> *) (t :: * -> *) a.
(Alternative f, Foldable t) =>
t (f a) -> f a
altSum (Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred (Term Symbol Ann -> m a) -> Seq (Term Symbol Ann) -> Seq (m a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Seq (Term Symbol Ann)
xs)
              Term.If Term Symbol Ann
cond Term Symbol Ann
a Term Symbol Ann
b -> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
cond m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
a m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
b
              Term.And Term Symbol Ann
l Term Symbol Ann
r -> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
l m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
r
              Term.Or Term Symbol Ann
l Term Symbol Ann
r -> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
l m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
r
              Term.Lam Term Symbol Ann
a -> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
a
              Term.LetRec IsTop
_isTop [Term Symbol Ann]
xs Term Symbol Ann
y ->
                [m a] -> m a
forall (f :: * -> *) (t :: * -> *) a.
(Alternative f, Foldable t) =>
t (f a) -> f a
altSum (Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred (Term Symbol Ann -> m a) -> [Term Symbol Ann] -> [m a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Term Symbol Ann]
xs)
                  m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
y
              Term.Let IsTop
_isTop Term Symbol Ann
a Term Symbol Ann
b ->
                Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
a
                  m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
b
              Term.Match Term Symbol Ann
a [MatchCase Ann (Term Symbol Ann)]
cases ->
                Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
a
                  m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> [m a] -> m a
forall (f :: * -> *) (t :: * -> *) a.
(Alternative f, Foldable t) =>
t (f a) -> f a
altSum ([MatchCase Ann (Term Symbol Ann)]
cases [MatchCase Ann (Term Symbol Ann)]
-> (MatchCase Ann (Term Symbol Ann) -> m a) -> [m a]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(MatchCase Pattern Ann
pat Maybe (Term Symbol Ann)
grd Term Symbol Ann
body) -> ((Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
patPred Pattern Ann
pat) m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Maybe (Term Symbol Ann) -> m (Term Symbol Ann)
forall x. Maybe x -> m x
altMaybe Maybe (Term Symbol Ann)
grd m (Term Symbol Ann) -> (Term Symbol Ann -> m a) -> m a
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred) m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
body))
              Term.TermLink {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
              Term.TypeLink {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
            ABT.Var Symbol
_v -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Term Symbol Ann -> m a
termPred Term Symbol Ann
term
            ABT.Cycle Term Symbol Ann
r -> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
r
            ABT.Abs Symbol
_v Term Symbol Ann
r -> Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> m a
pred Term Symbol Ann
r
      let fallback :: m a
fallback = if Ann -> IsTop
annIsFilePosition Ann
ann then Term Symbol Ann -> m a
termPred Term Symbol Ann
term else m a
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty
      m a
bestChild m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> m a
fallback
  where
    altMaybe :: Maybe x -> m x
    altMaybe :: forall x. Maybe x -> m x
altMaybe = m x -> (x -> m x) -> Maybe x -> m x
forall b a. b -> (a -> b) -> Maybe a -> b
maybe m x
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty x -> m x
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    
    
    
    
    cleanImplicitUnit :: Term Symbol Ann -> Maybe (Term Symbol Ann)
    cleanImplicitUnit :: Term Symbol Ann -> Maybe (Term Symbol Ann)
cleanImplicitUnit = \case
      ABT.Tm' (Term.App (ABT.Tm' (Term.App (ABT.Tm' (Term.Constructor (ConstructorReference Reference
ref ConstructorId
0))) Term Symbol Ann
x)) Term Symbol Ann
trm)
        | Reference
ref Reference -> Reference -> IsTop
forall a. Eq a => a -> a -> IsTop
== Reference
Builtins.pairRef IsTop -> IsTop -> IsTop
&& (Ann -> ()) -> Term Symbol Ann -> Term Symbol ()
forall v a a2. Ord v => (a -> a2) -> Term v a -> Term v a2
Term.amap (() -> Ann -> ()
forall a b. a -> b -> a
const ()) Term Symbol Ann
trm Term Symbol () -> Term Symbol () -> IsTop
forall a. Eq a => a -> a -> IsTop
== () -> Term Symbol ()
forall v a vt at ap. Var v => a -> Term2 vt at ap v a
Builtins.unitTerm () -> Term Symbol Ann -> Maybe (Term Symbol Ann)
forall a. a -> Maybe a
Just Term Symbol Ann
x
      Term Symbol Ann
_ -> Maybe (Term Symbol Ann)
forall a. Maybe a
Nothing
    ann :: Ann
ann = Term Symbol Ann -> Ann
getTermSpanAnn Term Symbol Ann
term
    termPred :: Term Symbol Ann -> m a
termPred = SourceNode Ann -> m a
pred (SourceNode Ann -> m a)
-> (Term Symbol Ann -> SourceNode Ann) -> Term Symbol Ann -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term Symbol Ann -> SourceNode Ann
forall a. Term Symbol a -> SourceNode a
TermNode
    typePred :: Type Symbol Ann -> m a
typePred = SourceNode Ann -> m a
pred (SourceNode Ann -> m a)
-> (Type Symbol Ann -> SourceNode Ann) -> Type Symbol Ann -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type Symbol Ann -> SourceNode Ann
forall a. Type Symbol a -> SourceNode a
TypeNode
    patPred :: Pattern Ann -> m a
patPred = SourceNode Ann -> m a
pred (SourceNode Ann -> m a)
-> (Pattern Ann -> SourceNode Ann) -> Pattern Ann -> m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Pattern Ann -> SourceNode Ann
forall a. Pattern a -> SourceNode a
PatternNode
getTermSpanAnn :: Term Symbol Ann -> Ann
getTermSpanAnn :: Term Symbol Ann -> Ann
getTermSpanAnn Term Symbol Ann
tm = case Term Symbol Ann -> ABT (F Symbol Ann Ann) Symbol (Term Symbol Ann)
forall (f :: * -> *) v a. Term f v a -> ABT f v (Term f v a)
ABT.out Term Symbol Ann
tm of
  ABT.Abs Symbol
_v Term Symbol Ann
r -> Term Symbol Ann -> Ann
forall (f :: * -> *) v a. Term f v a -> a
ABT.annotation Term Symbol Ann
tm Ann -> Ann -> Ann
forall a. Semigroup a => a -> a -> a
<> Term Symbol Ann -> Ann
getTermSpanAnn Term Symbol Ann
r
  ABT (F Symbol Ann Ann) Symbol (Term Symbol Ann)
_ -> Term Symbol Ann -> Ann
forall (f :: * -> *) v a. Term f v a -> a
ABT.annotation Term Symbol Ann
tm
findSmallestEnclosingPattern :: Pos -> Pattern.Pattern Ann -> Maybe (Pattern.Pattern Ann)
findSmallestEnclosingPattern :: Pos -> Pattern Ann -> Maybe (Pattern Ann)
findSmallestEnclosingPattern Pos
pos Pattern Ann
pat = Pos
-> (Pattern Ann -> Maybe (Pattern Ann))
-> Pattern Ann
-> Maybe (Pattern Ann)
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> Maybe (Pattern Ann)
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Pattern Ann
pat
findSmallestEnclosingPatternMatching ::
  forall m a.
  (Alternative m) =>
  Pos ->
  (Pattern.Pattern Ann -> m a) ->
  Pattern.Pattern Ann ->
  m a
findSmallestEnclosingPatternMatching :: forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred Pattern Ann
pat
  | Just Pattern Ann
validTargets <- Pattern Ann -> Maybe (Pattern Ann)
cleanImplicitUnit Pattern Ann
pat = Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred Pattern Ann
validTargets
  | Ann -> IsTop
annIsFilePosition (Pattern Ann -> Ann
forall a. Annotated a => a -> Ann
ann Pattern Ann
pat) IsTop -> IsTop -> IsTop
&& IsTop -> IsTop
not (Pattern Ann -> Ann
forall a. Annotated a => a -> Ann
ann Pattern Ann
pat Ann -> Pos -> IsTop
`Ann.contains` Pos
pos) = m a
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty
  | IsTop
otherwise = do
      
      
      
      
      let guardInFile :: m ()
guardInFile = IsTop -> m ()
forall (f :: * -> *). Alternative f => IsTop -> f ()
guard (Ann -> IsTop
annIsFilePosition (Pattern Ann -> Ann
forall a. Annotated a => a -> Ann
ann Pattern Ann
pat))
      let bestChild :: m a
bestChild = case Pattern Ann
pat of
            Pattern.Unbound {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern Ann -> m a
pred Pattern Ann
pat
            Pattern.Var {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern Ann -> m a
pred Pattern Ann
pat
            Pattern.Boolean {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern Ann -> m a
pred Pattern Ann
pat
            Pattern.Int {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern Ann -> m a
pred Pattern Ann
pat
            Pattern.Nat {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern Ann -> m a
pred Pattern Ann
pat
            Pattern.Float {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern Ann -> m a
pred Pattern Ann
pat
            Pattern.Text {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern Ann -> m a
pred Pattern Ann
pat
            Pattern.Char {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Pattern Ann -> m a
pred Pattern Ann
pat
            Pattern.Constructor Ann
_loc GConstructorReference Reference
_conRef [Pattern Ann]
pats -> [m a] -> m a
forall (f :: * -> *) (t :: * -> *) a.
(Alternative f, Foldable t) =>
t (f a) -> f a
altSum (Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred (Pattern Ann -> m a) -> [Pattern Ann] -> [m a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Pattern Ann]
pats)
            Pattern.As Ann
_loc Pattern Ann
p -> Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred Pattern Ann
p
            Pattern.EffectPure Ann
_loc Pattern Ann
p -> Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred Pattern Ann
p
            Pattern.EffectBind Ann
_loc GConstructorReference Reference
_conRef [Pattern Ann]
pats Pattern Ann
p -> [m a] -> m a
forall (f :: * -> *) (t :: * -> *) a.
(Alternative f, Foldable t) =>
t (f a) -> f a
altSum (Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred (Pattern Ann -> m a) -> [Pattern Ann] -> [m a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Pattern Ann]
pats) m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred Pattern Ann
p
            Pattern.SequenceLiteral Ann
_loc [Pattern Ann]
pats -> [m a] -> m a
forall (f :: * -> *) (t :: * -> *) a.
(Alternative f, Foldable t) =>
t (f a) -> f a
altSum (Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred (Pattern Ann -> m a) -> [Pattern Ann] -> [m a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Pattern Ann]
pats)
            Pattern.SequenceOp Ann
_loc Pattern Ann
p1 SeqOp
_op Pattern Ann
p2 -> Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred Pattern Ann
p1 m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Pattern Ann -> m a) -> Pattern Ann -> m a
findSmallestEnclosingPatternMatching Pos
pos Pattern Ann -> m a
pred Pattern Ann
p2
      let fallback :: m a
fallback = if Ann -> IsTop
annIsFilePosition (Pattern Ann -> Ann
forall a. Annotated a => a -> Ann
ann Pattern Ann
pat) then Pattern Ann -> m a
pred Pattern Ann
pat else m a
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty
      m a
bestChild m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> m a
fallback
  where
    
    
    
    
    cleanImplicitUnit :: Pattern.Pattern Ann -> Maybe (Pattern.Pattern Ann)
    cleanImplicitUnit :: Pattern Ann -> Maybe (Pattern Ann)
cleanImplicitUnit = \case
      (Pattern.Constructor Ann
_loc (ConstructorReference Reference
conRef ConstructorId
0) [Pattern Ann
pat1, Pattern.Constructor Ann
_ (ConstructorReference Reference
mayUnitRef ConstructorId
0) [Pattern Ann]
_])
        | Reference
conRef Reference -> Reference -> IsTop
forall a. Eq a => a -> a -> IsTop
== Reference
Builtins.pairRef IsTop -> IsTop -> IsTop
&& Reference
mayUnitRef Reference -> Reference -> IsTop
forall a. Eq a => a -> a -> IsTop
== Reference
Builtins.unitRef -> Pattern Ann -> Maybe (Pattern Ann)
forall a. a -> Maybe a
Just Pattern Ann
pat1
      Pattern Ann
_ -> Maybe (Pattern Ann)
forall a. Maybe a
Nothing
findSmallestEnclosingType :: Pos -> Type Symbol Ann -> Maybe (Type Symbol Ann)
findSmallestEnclosingType :: Pos -> Type Symbol Ann -> Maybe (Type Symbol Ann)
findSmallestEnclosingType Pos
pos Type Symbol Ann
typ = Pos
-> (Type Symbol Ann -> Maybe (Type Symbol Ann))
-> Type Symbol Ann
-> Maybe (Type Symbol Ann)
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> Maybe (Type Symbol Ann)
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Type Symbol Ann
typ
findSmallestEnclosingTypeMatching :: (Alternative m) => Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching :: forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
typ
  | 
    ABT.Abs'' Symbol
_ Type Symbol Ann
body <- Type Symbol Ann
typ =
      Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
body
  | Ann -> IsTop
annIsFilePosition (Type Symbol Ann -> Ann
forall (f :: * -> *) v a. Term f v a -> a
ABT.annotation Type Symbol Ann
typ) IsTop -> IsTop -> IsTop
&& IsTop -> IsTop
not (Type Symbol Ann -> Ann
forall (f :: * -> *) v a. Term f v a -> a
ABT.annotation Type Symbol Ann
typ Ann -> Pos -> IsTop
`Ann.contains` Pos
pos) = m a
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty
  | IsTop
otherwise = do
      
      
      
      
      let guardInFile :: m ()
guardInFile = IsTop -> m ()
forall (f :: * -> *). Alternative f => IsTop -> f ()
guard (Ann -> IsTop
annIsFilePosition (Type Symbol Ann -> Ann
forall (f :: * -> *) v a. Term f v a -> a
ABT.annotation Type Symbol Ann
typ))
      let bestChild :: m a
bestChild = case Type Symbol Ann -> ABT F Symbol (Type Symbol Ann)
forall (f :: * -> *) v a. Term f v a -> ABT f v (Term f v a)
ABT.out Type Symbol Ann
typ of
            ABT.Tm F (Type Symbol Ann)
f -> case F (Type Symbol Ann)
f of
              Type.Ref {} -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Type Symbol Ann -> m a
pred Type Symbol Ann
typ
              Type.Arrow Type Symbol Ann
a Type Symbol Ann
b -> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
a m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
b
              Type.Effect Type Symbol Ann
effs Type Symbol Ann
rhs ->
                
                
                
                Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
rhs m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
effs
              Type.App Type Symbol Ann
a Type Symbol Ann
b -> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
a m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
b
              Type.Forall Type Symbol Ann
r -> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
r
              Type.Ann Type Symbol Ann
a Kind
_kind -> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
a
              Type.Effects [Type Symbol Ann]
es -> [m a] -> m a
forall (f :: * -> *) (t :: * -> *) a.
(Alternative f, Foldable t) =>
t (f a) -> f a
altSum (Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred (Type Symbol Ann -> m a) -> [Type Symbol Ann] -> [m a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Type Symbol Ann]
es)
              Type.IntroOuter Type Symbol Ann
a -> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
a
            ABT.Var Symbol
_v -> m ()
guardInFile m () -> m a -> m a
forall a b. m a -> m b -> m b
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f b
*> Type Symbol Ann -> m a
pred Type Symbol Ann
typ
            ABT.Cycle Type Symbol Ann
r -> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
r
            ABT.Abs Symbol
_v Type Symbol Ann
r -> Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos Type Symbol Ann -> m a
pred Type Symbol Ann
r
      let fallback :: m a
fallback = if Ann -> IsTop
annIsFilePosition (Type Symbol Ann -> Ann
forall (f :: * -> *) v a. Term f v a -> a
ABT.annotation Type Symbol Ann
typ) then Type Symbol Ann -> m a
pred Type Symbol Ann
typ else m a
forall a. m a
forall (f :: * -> *) a. Alternative f => f a
empty
      m a
bestChild m a -> m a -> m a
forall a. m a -> m a -> m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> m a
fallback
refInDecl :: Pos -> DD.Decl Symbol Ann -> Maybe TypeReference
refInDecl :: Pos -> Decl Symbol Ann -> Maybe Reference
refInDecl Pos
p (Decl Symbol Ann -> DataDeclaration Symbol Ann
forall v a. Decl v a -> DataDeclaration v a
DD.asDataDecl -> DataDeclaration Symbol Ann
dd) =
  DataDeclaration Symbol Ann -> [(Ann, Symbol, Type Symbol Ann)]
forall v a. DataDeclaration v a -> [(a, v, Type v a)]
DD.constructors' DataDeclaration Symbol Ann
dd
    [(Ann, Symbol, Type Symbol Ann)]
-> ([(Ann, Symbol, Type Symbol Ann)] -> Maybe Reference)
-> Maybe Reference
forall a b. a -> (a -> b) -> b
& ((Ann, Symbol, Type Symbol Ann) -> Maybe Reference)
-> [(Ann, Symbol, Type Symbol Ann)] -> Maybe Reference
forall (f :: * -> *) (t :: * -> *) a b.
(Alternative f, Foldable t) =>
(a -> f b) -> t a -> f b
altMap \(Ann
_conNameAnn, Symbol
_v, Type Symbol Ann
typ) -> do
      Type Symbol Ann
typeNode <- Pos -> Type Symbol Ann -> Maybe (Type Symbol Ann)
findSmallestEnclosingType Pos
p Type Symbol Ann
typ
      Reference
ref <- Type Symbol Ann -> Maybe Reference
forall v a. Type v a -> Maybe Reference
refInType Type Symbol Ann
typeNode
      Reference -> Maybe Reference
forall a. a -> Maybe a
forall (f :: * -> *) a. Applicative f => a -> f a
pure Reference
ref
nodeAtPosition :: (Lspish m) => Uri -> Position -> MaybeT m (SourceNode Ann)
nodeAtPosition :: forall (m :: * -> *).
Lspish m =>
Uri -> Position -> MaybeT m (SourceNode Ann)
nodeAtPosition Uri
uri Position
pos = Uri
-> Position
-> (SourceNode Ann -> MaybeT m (SourceNode Ann))
-> MaybeT m (SourceNode Ann)
forall (m :: * -> *) a.
Lspish m =>
Uri -> Position -> (SourceNode Ann -> MaybeT m a) -> MaybeT m a
nodeAtPositionMatching Uri
uri Position
pos SourceNode Ann -> MaybeT m (SourceNode Ann)
forall a. a -> MaybeT m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
nodeAtPositionMatching :: (Lspish m) => Uri -> Position -> (SourceNode Ann -> MaybeT m a) -> MaybeT m a
nodeAtPositionMatching :: forall (m :: * -> *) a.
Lspish m =>
Uri -> Position -> (SourceNode Ann -> MaybeT m a) -> MaybeT m a
nodeAtPositionMatching Uri
uri (Position -> Pos
lspToUPos -> Pos
pos) SourceNode Ann -> MaybeT m a
pred = do
  (FileSummary {Map
  Symbol (Ann, Maybe Id, Term Symbol Ann, Maybe (Type Symbol Ann))
termsBySymbol :: Map
  Symbol (Ann, Maybe Id, Term Symbol Ann, Maybe (Type Symbol Ann))
$sel:termsBySymbol:FileSummary :: FileSummary
-> Map
     Symbol (Ann, Maybe Id, Term Symbol Ann, Maybe (Type Symbol Ann))
termsBySymbol, [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatchSummary :: [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
$sel:testWatchSummary:FileSummary :: FileSummary
-> [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
     Maybe (Type Symbol Ann))]
testWatchSummary, [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe String)]
exprWatchSummary :: [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe String)]
$sel:exprWatchSummary:FileSummary :: FileSummary
-> [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe String)]
exprWatchSummary}) <- Uri -> MaybeT m FileSummary
forall (m :: * -> *). Lspish m => Uri -> MaybeT m FileSummary
getFileSummary Uri
uri
  let ([Term Symbol Ann]
trms, [Type Symbol Ann]
typs) = Map
  Symbol (Ann, Maybe Id, Term Symbol Ann, Maybe (Type Symbol Ann))
termsBySymbol Map
  Symbol (Ann, Maybe Id, Term Symbol Ann, Maybe (Type Symbol Ann))
-> (Map
      Symbol (Ann, Maybe Id, Term Symbol Ann, Maybe (Type Symbol Ann))
    -> ([Term Symbol Ann], [Type Symbol Ann]))
-> ([Term Symbol Ann], [Type Symbol Ann])
forall a b. a -> (a -> b) -> b
& ((Ann, Maybe Id, Term Symbol Ann, Maybe (Type Symbol Ann))
 -> ([Term Symbol Ann], [Type Symbol Ann]))
-> Map
     Symbol (Ann, Maybe Id, Term Symbol Ann, Maybe (Type Symbol Ann))
-> ([Term Symbol Ann], [Type Symbol Ann])
forall m a. Monoid m => (a -> m) -> Map Symbol a -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap \(Ann
_ann, Maybe Id
_ref, Term Symbol Ann
trm, Maybe (Type Symbol Ann)
mayTyp) -> ([Term Symbol Ann
trm], Maybe (Type Symbol Ann) -> [Type Symbol Ann]
forall a. Maybe a -> [a]
forall (t :: * -> *) a. Foldable t => t a -> [a]
toList Maybe (Type Symbol Ann)
mayTyp)
  ( (Term Symbol Ann -> MaybeT m a) -> [Term Symbol Ann] -> MaybeT m a
forall (f :: * -> *) (t :: * -> *) a b.
(Alternative f, Foldable t) =>
(a -> f b) -> t a -> f b
altMap (Pos
-> (SourceNode Ann -> MaybeT m a) -> Term Symbol Ann -> MaybeT m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> MaybeT m a
pred (Term Symbol Ann -> MaybeT m a)
-> (Term Symbol Ann -> Term Symbol Ann)
-> Term Symbol Ann
-> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term Symbol Ann -> Term Symbol Ann
forall v. Ord v => Term v Ann -> Term v Ann
removeInferredTypeAnnotations) [Term Symbol Ann]
trms
      MaybeT m a -> MaybeT m a -> MaybeT m a
forall a. MaybeT m a -> MaybeT m a -> MaybeT m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Term Symbol Ann -> MaybeT m a) -> [Term Symbol Ann] -> MaybeT m a
forall (f :: * -> *) (t :: * -> *) a b.
(Alternative f, Foldable t) =>
(a -> f b) -> t a -> f b
altMap (Pos
-> (SourceNode Ann -> MaybeT m a) -> Term Symbol Ann -> MaybeT m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> MaybeT m a
pred (Term Symbol Ann -> MaybeT m a)
-> (Term Symbol Ann -> Term Symbol Ann)
-> Term Symbol Ann
-> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term Symbol Ann -> Term Symbol Ann
forall v. Ord v => Term v Ann -> Term v Ann
removeInferredTypeAnnotations) ([(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatchSummary [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
-> Getting
     (Endo [Term Symbol Ann])
     [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
       Maybe (Type Symbol Ann))]
     (Term Symbol Ann)
-> [Term Symbol Ann]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. ((Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann))
 -> Const
      (Endo [Term Symbol Ann])
      (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
       Maybe (Type Symbol Ann)))
-> [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
     Maybe (Type Symbol Ann))]
-> Const
     (Endo [Term Symbol Ann])
     [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
       Maybe (Type Symbol Ann))]
forall (f :: * -> *) a. Foldable f => IndexedFold Int (f a) a
IndexedFold
  Int
  [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
    Maybe (Type Symbol Ann))]
  (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
   Maybe (Type Symbol Ann))
folded (((Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
   Maybe (Type Symbol Ann))
  -> Const
       (Endo [Term Symbol Ann])
       (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
        Maybe (Type Symbol Ann)))
 -> [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
      Maybe (Type Symbol Ann))]
 -> Const
      (Endo [Term Symbol Ann])
      [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
        Maybe (Type Symbol Ann))])
-> ((Term Symbol Ann
     -> Const (Endo [Term Symbol Ann]) (Term Symbol Ann))
    -> (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
        Maybe (Type Symbol Ann))
    -> Const
         (Endo [Term Symbol Ann])
         (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
          Maybe (Type Symbol Ann)))
-> Getting
     (Endo [Term Symbol Ann])
     [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
       Maybe (Type Symbol Ann))]
     (Term Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Term Symbol Ann
 -> Const (Endo [Term Symbol Ann]) (Term Symbol Ann))
-> (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
    Maybe (Type Symbol Ann))
-> Const
     (Endo [Term Symbol Ann])
     (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
      Maybe (Type Symbol Ann))
forall s t a b. Field4 s t a b => Lens s t a b
Lens
  (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
   Maybe (Type Symbol Ann))
  (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
   Maybe (Type Symbol Ann))
  (Term Symbol Ann)
  (Term Symbol Ann)
_4)
      MaybeT m a -> MaybeT m a -> MaybeT m a
forall a. MaybeT m a -> MaybeT m a -> MaybeT m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Term Symbol Ann -> MaybeT m a) -> [Term Symbol Ann] -> MaybeT m a
forall (f :: * -> *) (t :: * -> *) a b.
(Alternative f, Foldable t) =>
(a -> f b) -> t a -> f b
altMap (Pos
-> (SourceNode Ann -> MaybeT m a) -> Term Symbol Ann -> MaybeT m a
forall (m :: * -> *) a.
MonadPlus m =>
Pos -> (SourceNode Ann -> m a) -> Term Symbol Ann -> m a
findSmallestEnclosingNodeMatching Pos
pos SourceNode Ann -> MaybeT m a
pred (Term Symbol Ann -> MaybeT m a)
-> (Term Symbol Ann -> Term Symbol Ann)
-> Term Symbol Ann
-> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Term Symbol Ann -> Term Symbol Ann
forall v. Ord v => Term v Ann -> Term v Ann
removeInferredTypeAnnotations) ([(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe String)]
exprWatchSummary [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe String)]
-> Getting
     (Endo [Term Symbol Ann])
     [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
       Maybe (Type Symbol Ann), Maybe String)]
     (Term Symbol Ann)
-> [Term Symbol Ann]
forall s a. s -> Getting (Endo [a]) s a -> [a]
^.. ((Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe String)
 -> Const
      (Endo [Term Symbol Ann])
      (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
       Maybe (Type Symbol Ann), Maybe String))
-> [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe String)]
-> Const
     (Endo [Term Symbol Ann])
     [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
       Maybe (Type Symbol Ann), Maybe String)]
forall (f :: * -> *) a. Foldable f => IndexedFold Int (f a) a
IndexedFold
  Int
  [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
    Maybe (Type Symbol Ann), Maybe String)]
  (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
   Maybe (Type Symbol Ann), Maybe String)
folded (((Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
   Maybe (Type Symbol Ann), Maybe String)
  -> Const
       (Endo [Term Symbol Ann])
       (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
        Maybe (Type Symbol Ann), Maybe String))
 -> [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
      Maybe (Type Symbol Ann), Maybe String)]
 -> Const
      (Endo [Term Symbol Ann])
      [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
        Maybe (Type Symbol Ann), Maybe String)])
-> ((Term Symbol Ann
     -> Const (Endo [Term Symbol Ann]) (Term Symbol Ann))
    -> (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
        Maybe (Type Symbol Ann), Maybe String)
    -> Const
         (Endo [Term Symbol Ann])
         (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
          Maybe (Type Symbol Ann), Maybe String))
-> Getting
     (Endo [Term Symbol Ann])
     [(Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
       Maybe (Type Symbol Ann), Maybe String)]
     (Term Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Term Symbol Ann
 -> Const (Endo [Term Symbol Ann]) (Term Symbol Ann))
-> (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
    Maybe (Type Symbol Ann), Maybe String)
-> Const
     (Endo [Term Symbol Ann])
     (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
      Maybe (Type Symbol Ann), Maybe String)
forall s t a b. Field4 s t a b => Lens s t a b
Lens
  (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
   Maybe (Type Symbol Ann), Maybe String)
  (Ann, Maybe Symbol, Maybe Id, Term Symbol Ann,
   Maybe (Type Symbol Ann), Maybe String)
  (Term Symbol Ann)
  (Term Symbol Ann)
_4)
      MaybeT m a -> MaybeT m a -> MaybeT m a
forall a. MaybeT m a -> MaybeT m a -> MaybeT m a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> (Type Symbol Ann -> MaybeT m a) -> [Type Symbol Ann] -> MaybeT m a
forall (f :: * -> *) (t :: * -> *) a b.
(Alternative f, Foldable t) =>
(a -> f b) -> t a -> f b
altMap (Pos
-> (Type Symbol Ann -> MaybeT m a) -> Type Symbol Ann -> MaybeT m a
forall (m :: * -> *) a.
Alternative m =>
Pos -> (Type Symbol Ann -> m a) -> Type Symbol Ann -> m a
findSmallestEnclosingTypeMatching Pos
pos (SourceNode Ann -> MaybeT m a
pred (SourceNode Ann -> MaybeT m a)
-> (Type Symbol Ann -> SourceNode Ann)
-> Type Symbol Ann
-> MaybeT m a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Type Symbol Ann -> SourceNode Ann
forall a. Type Symbol a -> SourceNode a
TypeNode)) [Type Symbol Ann]
typs
    )
annIsFilePosition :: Ann -> Bool
annIsFilePosition :: Ann -> IsTop
annIsFilePosition = \case
  Ann
Ann.Intrinsic -> IsTop
False
  Ann
Ann.External -> IsTop
False
  Ann.Ann {} -> IsTop
True
  Ann.GeneratedFrom Ann
ann -> Ann -> IsTop
annIsFilePosition Ann
ann
removeInferredTypeAnnotations :: (Ord v) => Term.Term v Ann -> Term.Term v Ann
removeInferredTypeAnnotations :: forall v. Ord v => Term v Ann -> Term v Ann
removeInferredTypeAnnotations =
  ASetter (Term v Ann) (Term v Ann) (Term v Ann) (Term v Ann)
-> (Term v Ann -> Term v Ann) -> Term v Ann -> Term v Ann
forall a b. ASetter a b a b -> (b -> b) -> a -> b
Lens.transformOf (forall (field :: Symbol) s t a b.
HasField field s t a b =>
Lens s t a b
field @"out" ((ABT (F v Ann Ann) v (Term v Ann)
  -> Identity (ABT (F v Ann Ann) v (Term v Ann)))
 -> Term v Ann -> Identity (Term v Ann))
-> ((Term v Ann -> Identity (Term v Ann))
    -> ABT (F v Ann Ann) v (Term v Ann)
    -> Identity (ABT (F v Ann Ann) v (Term v Ann)))
-> ASetter (Term v Ann) (Term v Ann) (Term v Ann) (Term v Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Term v Ann -> Identity (Term v Ann))
-> ABT (F v Ann Ann) v (Term v Ann)
-> Identity (ABT (F v Ann Ann) v (Term v Ann))
forall (f :: * -> *) a b.
Traversable f =>
IndexedTraversal Int (f a) (f b) a b
IndexedTraversal
  Int
  (ABT (F v Ann Ann) v (Term v Ann))
  (ABT (F v Ann Ann) v (Term v Ann))
  (Term v Ann)
  (Term v Ann)
traversed) \case
    ABT.Term {out :: forall (f :: * -> *) v a. Term f v a -> ABT f v (Term f v a)
out = ABT.Tm (Term.Ann Term v Ann
trm Type v Ann
typ)}
      
      | Type v Ann -> Ann
forall (f :: * -> *) v a. Term f v a -> a
ABT.annotation Type v Ann
typ Ann -> Ann -> IsTop
forall a. Eq a => a -> a -> IsTop
== Term v Ann -> Ann
forall (f :: * -> *) v a. Term f v a -> a
ABT.annotation Term v Ann
trm -> Term v Ann
trm
    Term v Ann
t -> Term v Ann
t
markdownDocsForFQN :: (Lspish m) => Uri -> HQ.HashQualified Name -> m [Text]
markdownDocsForFQN :: forall (m :: * -> *).
Lspish m =>
Uri -> HashQualified Name -> m [Text]
markdownDocsForFQN Uri
fileUri HashQualified Name
fqn =
  [Text] -> Maybe [Text] -> [Text]
forall a. a -> Maybe a -> a
fromMaybe [] (Maybe [Text] -> [Text]) -> m (Maybe [Text]) -> m [Text]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> MaybeT m [Text] -> m (Maybe [Text])
forall (m :: * -> *) a. MaybeT m a -> m (Maybe a)
runMaybeT do
    PrettyPrintEnvDecl
pped <- m PrettyPrintEnvDecl -> MaybeT m PrettyPrintEnvDecl
forall (m :: * -> *) a. Monad m => m a -> MaybeT m a
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (m PrettyPrintEnvDecl -> MaybeT m PrettyPrintEnvDecl)
-> m PrettyPrintEnvDecl -> MaybeT m PrettyPrintEnvDecl
forall a b. (a -> b) -> a -> b
$ Uri -> m PrettyPrintEnvDecl
forall (m :: * -> *). Lspish m => Uri -> m PrettyPrintEnvDecl
ppedForFile Uri
fileUri
    Name
name <- m (Maybe Name) -> MaybeT m Name
forall (m :: * -> *) a. m (Maybe a) -> MaybeT m a
MaybeT (m (Maybe Name) -> MaybeT m Name)
-> (Maybe Name -> m (Maybe Name)) -> Maybe Name -> MaybeT m Name
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Maybe Name -> m (Maybe Name)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Maybe Name -> MaybeT m Name) -> Maybe Name -> MaybeT m Name
forall a b. (a -> b) -> a -> b
$ HashQualified Name -> Maybe Name
forall n. HashQualified n -> Maybe n
HQ.toName HashQualified Name
fqn
    NameSearch Transaction
nameSearch <- MaybeT m (NameSearch Transaction)
forall (m :: * -> *). Lspish m => m (NameSearch Transaction)
getNameSearch
    Env {Codebase IO Symbol Ann
$sel:codebase:Env :: Env -> Codebase IO Symbol Ann
codebase :: Codebase IO Symbol Ann
codebase, Runtime Symbol
runtime :: Runtime Symbol
$sel:runtime:Env :: Env -> Runtime Symbol
runtime} <- MaybeT m Env
forall r (m :: * -> *). MonadReader r m => m r
ask
    IO [Text] -> MaybeT m [Text]
forall a. IO a -> MaybeT m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO [Text] -> MaybeT m [Text]) -> IO [Text] -> MaybeT m [Text]
forall a b. (a -> b) -> a -> b
$ do
      [Reference]
docRefs <- Codebase IO Symbol Ann -> Transaction [Reference] -> IO [Reference]
forall (m :: * -> *) v a b.
MonadIO m =>
Codebase m v a -> Transaction b -> m b
Codebase.runTransaction Codebase IO Symbol Ann
codebase (Transaction [Reference] -> IO [Reference])
-> Transaction [Reference] -> IO [Reference]
forall a b. (a -> b) -> a -> b
$ Codebase IO Symbol Ann
-> NameSearch Transaction
-> SearchType
-> Name
-> Transaction [Reference]
Backend.docsForDefinitionName Codebase IO Symbol Ann
codebase NameSearch Transaction
nameSearch SearchType
ExactName Name
name
      [Reference] -> (Reference -> IO Text) -> IO [Text]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
t a -> (a -> f b) -> f (t b)
for [Reference]
docRefs ((Reference -> IO Text) -> IO [Text])
-> (Reference -> IO Text) -> IO [Text]
forall a b. (a -> b) -> a -> b
$ \Reference
docRef -> do
        Identity (Text
_, Text
_, Doc
doc, [DecompError]
_evalErrs) <- PrettyPrintEnvDecl
-> Width
-> Codebase IO Symbol Ann
-> Runtime Symbol
-> Identity Reference
-> IO (Identity (Text, Text, Doc, [DecompError]))
forall (t :: * -> *).
Traversable t =>
PrettyPrintEnvDecl
-> Width
-> Codebase IO Symbol Ann
-> Runtime Symbol
-> t Reference
-> IO (t (Text, Text, Doc, [DecompError]))
Backend.renderDocRefs PrettyPrintEnvDecl
pped (Int -> Width
Pretty.Width Int
80) Codebase IO Symbol Ann
codebase Runtime Symbol
runtime (Reference -> Identity Reference
forall a. a -> Identity a
Identity Reference
docRef)
        Text -> IO Text
forall a. a -> IO a
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Text -> IO Text) -> ([Markdown] -> Text) -> [Markdown] -> IO Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Markdown] -> Text
Md.toText ([Markdown] -> IO Text) -> [Markdown] -> IO Text
forall a b. (a -> b) -> a -> b
$ Doc -> [Markdown]
Md.toMarkdown Doc
doc