module Unison.UnisonFile.Summary
  ( FileSummary (..),
    allWatches,
    allTypeDecls,
    mkFileSummary,
    fileDefLocations,
  )
where

import Control.Lens
import Data.Foldable
import Data.Map qualified as Map
import Data.Set qualified as Set
import Unison.DataDeclaration qualified as DD
import Unison.Names (Names)
import Unison.Parser.Ann
import Unison.Prelude
import Unison.Reference qualified as Reference
import Unison.Symbol
import Unison.Symbol qualified as Symbol
import Unison.Term (Term)
import Unison.Term qualified as Term
import Unison.Type (Type)
import Unison.UnisonFile qualified as UF
import Unison.UnisonFile.Names qualified as UF
import Unison.Var qualified as Var
import Unison.WatchKind (pattern TestWatch)
import Unison.WatchKind qualified as WK

-- | A file that parses might not always type-check, but often we just want to get as much
-- information as we have available. This provides a type where we can summarize the
-- information available in a Unison file.
--
-- If the file typechecked then all the Ref Ids and types will be filled in, otherwise
-- they will be Nothing.
data FileSummary = FileSummary
  { FileSummary
-> Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclsBySymbol :: Map Symbol (Reference.Id, DD.DataDeclaration Symbol Ann),
    FileSummary
-> Map TermReferenceId (Map Symbol (DataDeclaration Symbol Ann))
dataDeclsByReference :: Map Reference.Id (Map Symbol (DD.DataDeclaration Symbol Ann)),
    FileSummary
-> Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclsBySymbol :: Map Symbol (Reference.Id, DD.EffectDeclaration Symbol Ann),
    FileSummary
-> Map TermReferenceId (Map Symbol (EffectDeclaration Symbol Ann))
effectDeclsByReference :: Map Reference.Id (Map Symbol (DD.EffectDeclaration Symbol Ann)),
    FileSummary
-> Map
     Symbol
     (Ann, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))
termsBySymbol :: Map Symbol (Ann, Maybe Reference.Id, Term Symbol Ann, Maybe (Type Symbol Ann)),
    FileSummary
-> Map
     (Maybe TermReferenceId)
     (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
termsByReference :: Map (Maybe Reference.Id) (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann))),
    FileSummary
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann))]
testWatchSummary :: [(Ann, Maybe Symbol, Maybe Reference.Id, Term Symbol Ann, Maybe (Type Symbol Ann))],
    FileSummary
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatchSummary :: [(Ann, Maybe Symbol, Maybe Reference.Id, Term Symbol Ann, Maybe (Type Symbol Ann), Maybe WK.WatchKind)],
    FileSummary -> Names
fileNames :: Names
  }
  deriving stock (Int -> FileSummary -> ShowS
[FileSummary] -> ShowS
FileSummary -> WatchKind
(Int -> FileSummary -> ShowS)
-> (FileSummary -> WatchKind)
-> ([FileSummary] -> ShowS)
-> Show FileSummary
forall a.
(Int -> a -> ShowS) -> (a -> WatchKind) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> FileSummary -> ShowS
showsPrec :: Int -> FileSummary -> ShowS
$cshow :: FileSummary -> WatchKind
show :: FileSummary -> WatchKind
$cshowList :: [FileSummary] -> ShowS
showList :: [FileSummary] -> ShowS
Show)

allWatches :: FileSummary -> [(Ann, Maybe Symbol, Maybe Reference.Id, Term Symbol Ann, Maybe (Type Symbol Ann), Maybe WK.WatchKind)]
allWatches :: FileSummary
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe WatchKind)]
allWatches FileSummary {[(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
$sel:testWatchSummary:FileSummary :: FileSummary
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann))]
testWatchSummary :: [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatchSummary, [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
$sel:exprWatchSummary:FileSummary :: FileSummary
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatchSummary :: [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatchSummary} =
  [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatchSummary
    [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe WatchKind)]
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe WatchKind)]
forall a. Semigroup a => a -> a -> a
<> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatchSummary [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
-> ((Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann))
    -> (Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
        Maybe (Type Symbol Ann), Maybe WatchKind))
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe WatchKind)]
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(Ann
ann, Maybe Symbol
sym, Maybe TermReferenceId
refId, Term Symbol Ann
tm, Maybe (Type Symbol Ann)
typ) -> (Ann
ann, Maybe Symbol
sym, Maybe TermReferenceId
refId, Term Symbol Ann
tm, Maybe (Type Symbol Ann)
typ, WatchKind -> Maybe WatchKind
forall a. a -> Maybe a
Just WatchKind
forall a. (Eq a, IsString a) => a
WK.TestWatch))

allTypeDecls :: FileSummary -> Map Symbol (Reference.Id, Either (DD.EffectDeclaration Symbol Ann) (DD.DataDeclaration Symbol Ann))
allTypeDecls :: FileSummary
-> Map
     Symbol
     (TermReferenceId,
      Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
allTypeDecls FileSummary {Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
$sel:dataDeclsBySymbol:FileSummary :: FileSummary
-> Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclsBySymbol :: Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclsBySymbol, Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
$sel:effectDeclsBySymbol:FileSummary :: FileSummary
-> Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclsBySymbol :: Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclsBySymbol} =
  let dataDecls :: Map
  Symbol
  (TermReferenceId,
   Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
dataDecls = Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclsBySymbol Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
-> ((TermReferenceId, DataDeclaration Symbol Ann)
    -> (TermReferenceId,
        Either
          (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann)))
-> Map
     Symbol
     (TermReferenceId,
      Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(TermReferenceId
refId, DataDeclaration Symbol Ann
dd) -> (TermReferenceId
refId, DataDeclaration Symbol Ann
-> Either
     (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann)
forall a b. b -> Either a b
Right DataDeclaration Symbol Ann
dd)
      effectDecls :: Map
  Symbol
  (TermReferenceId,
   Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
effectDecls = Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclsBySymbol Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
-> ((TermReferenceId, EffectDeclaration Symbol Ann)
    -> (TermReferenceId,
        Either
          (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann)))
-> Map
     Symbol
     (TermReferenceId,
      Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(TermReferenceId
refId, EffectDeclaration Symbol Ann
ed) -> (TermReferenceId
refId, EffectDeclaration Symbol Ann
-> Either
     (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann)
forall a b. a -> Either a b
Left EffectDeclaration Symbol Ann
ed)
   in Map
  Symbol
  (TermReferenceId,
   Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
dataDecls Map
  Symbol
  (TermReferenceId,
   Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
-> Map
     Symbol
     (TermReferenceId,
      Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
-> Map
     Symbol
     (TermReferenceId,
      Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
forall a. Semigroup a => a -> a -> a
<> Map
  Symbol
  (TermReferenceId,
   Either (EffectDeclaration Symbol Ann) (DataDeclaration Symbol Ann))
effectDecls

-- | Summarize the information available to us from the current state of the file.
-- See 'FileSummary' for more information.
mkFileSummary :: Maybe (UF.UnisonFile Symbol Ann) -> Maybe (UF.TypecheckedUnisonFile Symbol Ann) -> Maybe FileSummary
mkFileSummary :: Maybe (UnisonFile Symbol Ann)
-> Maybe (TypecheckedUnisonFile Symbol Ann) -> Maybe FileSummary
mkFileSummary Maybe (UnisonFile Symbol Ann)
parsed Maybe (TypecheckedUnisonFile Symbol Ann)
typechecked = case (Maybe (UnisonFile Symbol Ann)
parsed, Maybe (TypecheckedUnisonFile Symbol Ann)
typechecked) of
  (Maybe (UnisonFile Symbol Ann)
Nothing, Maybe (TypecheckedUnisonFile Symbol Ann)
Nothing) -> Maybe FileSummary
forall a. Maybe a
Nothing
  (Maybe (UnisonFile Symbol Ann)
_, Just tf :: TypecheckedUnisonFile Symbol Ann
tf@(UF.TypecheckedUnisonFileId {Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclarationsId' :: Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
$sel:dataDeclarationsId':TypecheckedUnisonFileId :: forall v a.
TypecheckedUnisonFile v a
-> Map v (TermReferenceId, DataDeclaration v a)
dataDeclarationsId', Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclarationsId' :: Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
$sel:effectDeclarationsId':TypecheckedUnisonFileId :: forall v a.
TypecheckedUnisonFile v a
-> Map v (TermReferenceId, EffectDeclaration v a)
effectDeclarationsId', Map
  Symbol
  (Ann, TermReferenceId, Maybe WatchKind, Term Symbol Ann,
   Type Symbol Ann)
hashTermsId :: Map
  Symbol
  (Ann, TermReferenceId, Maybe WatchKind, Term Symbol Ann,
   Type Symbol Ann)
$sel:hashTermsId:TypecheckedUnisonFileId :: forall v a.
TypecheckedUnisonFile v a
-> Map v (a, TermReferenceId, Maybe WatchKind, Term v a, Type v a)
hashTermsId})) ->
    let (Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
trms, [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatches, [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatches) =
          Map
  Symbol
  (Ann, TermReferenceId, Maybe WatchKind, Term Symbol Ann,
   Type Symbol Ann)
hashTermsId Map
  Symbol
  (Ann, TermReferenceId, Maybe WatchKind, Term Symbol Ann,
   Type Symbol Ann)
-> (Map
      Symbol
      (Ann, TermReferenceId, Maybe WatchKind, Term Symbol Ann,
       Type Symbol Ann)
    -> (Map
          Symbol
          (Ann, Maybe TermReferenceId, Term Symbol Ann,
           Maybe (Type Symbol Ann)),
        [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
          Maybe (Type Symbol Ann))],
        [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
          Maybe (Type Symbol Ann), Maybe WatchKind)]))
-> (Map
      Symbol
      (Ann, Maybe TermReferenceId, Term Symbol Ann,
       Maybe (Type Symbol Ann)),
    [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))],
    [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann), Maybe WatchKind)])
forall a b. a -> (a -> b) -> b
& (Symbol
 -> (Ann, TermReferenceId, Maybe WatchKind, Term Symbol Ann,
     Type Symbol Ann)
 -> (Map
       Symbol
       (Ann, Maybe TermReferenceId, Term Symbol Ann,
        Maybe (Type Symbol Ann)),
     [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
       Maybe (Type Symbol Ann))],
     [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
       Maybe (Type Symbol Ann), Maybe WatchKind)]))
-> Map
     Symbol
     (Ann, TermReferenceId, Maybe WatchKind, Term Symbol Ann,
      Type Symbol Ann)
-> (Map
      Symbol
      (Ann, Maybe TermReferenceId, Term Symbol Ann,
       Maybe (Type Symbol Ann)),
    [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))],
    [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann), Maybe WatchKind)])
forall m a. Monoid m => (Symbol -> a -> m) -> Map Symbol a -> m
forall i (f :: * -> *) m a.
(FoldableWithIndex i f, Monoid m) =>
(i -> a -> m) -> f a -> m
ifoldMap \Symbol
sym (Ann
ann, TermReferenceId
ref, Maybe WatchKind
wk, Term Symbol Ann
trm, Type Symbol Ann
typ) ->
            case Maybe WatchKind
wk of
              Maybe WatchKind
Nothing -> (Symbol
-> (Ann, Maybe TermReferenceId, Term Symbol Ann,
    Maybe (Type Symbol Ann))
-> Map
     Symbol
     (Ann, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))
forall k a. k -> a -> Map k a
Map.singleton Symbol
sym (Ann
ann, TermReferenceId -> Maybe TermReferenceId
forall a. a -> Maybe a
Just TermReferenceId
ref, Term Symbol Ann
trm, Symbol -> Maybe (Type Symbol Ann)
getUserTypeAnnotation Symbol
sym Maybe (Type Symbol Ann)
-> Maybe (Type Symbol Ann) -> Maybe (Type Symbol Ann)
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Type Symbol Ann -> Maybe (Type Symbol Ann)
forall a. a -> Maybe a
Just Type Symbol Ann
typ), [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
forall a. Monoid a => a
mempty, [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
forall a. Monoid a => a
mempty)
              Just WatchKind
TestWatch -> (Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
forall a. Monoid a => a
mempty, [(Ann
ann, Symbol -> Maybe Symbol
assertUserSym Symbol
sym, TermReferenceId -> Maybe TermReferenceId
forall a. a -> Maybe a
Just TermReferenceId
ref, Term Symbol Ann
trm, Symbol -> Maybe (Type Symbol Ann)
getUserTypeAnnotation Symbol
sym Maybe (Type Symbol Ann)
-> Maybe (Type Symbol Ann) -> Maybe (Type Symbol Ann)
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Type Symbol Ann -> Maybe (Type Symbol Ann)
forall a. a -> Maybe a
Just Type Symbol Ann
typ)], [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
forall a. Monoid a => a
mempty)
              Just WatchKind
wk -> (Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
forall a. Monoid a => a
mempty, [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
forall a. Monoid a => a
mempty, [(Ann
ann, Symbol -> Maybe Symbol
assertUserSym Symbol
sym, TermReferenceId -> Maybe TermReferenceId
forall a. a -> Maybe a
Just TermReferenceId
ref, Term Symbol Ann
trm, Symbol -> Maybe (Type Symbol Ann)
getUserTypeAnnotation Symbol
sym Maybe (Type Symbol Ann)
-> Maybe (Type Symbol Ann) -> Maybe (Type Symbol Ann)
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Type Symbol Ann -> Maybe (Type Symbol Ann)
forall a. a -> Maybe a
Just Type Symbol Ann
typ, WatchKind -> Maybe WatchKind
forall a. a -> Maybe a
Just WatchKind
wk)])
     in FileSummary -> Maybe FileSummary
forall a. a -> Maybe a
Just (FileSummary -> Maybe FileSummary)
-> FileSummary -> Maybe FileSummary
forall a b. (a -> b) -> a -> b
$
          FileSummary
            { $sel:dataDeclsBySymbol:FileSummary :: Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclsBySymbol = Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclarationsId',
              $sel:dataDeclsByReference:FileSummary :: Map TermReferenceId (Map Symbol (DataDeclaration Symbol Ann))
dataDeclsByReference = Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
-> Map TermReferenceId (Map Symbol (DataDeclaration Symbol Ann))
forall v r a. (Ord v, Ord r) => Map v (r, a) -> Map r (Map v a)
declsRefMap Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclarationsId',
              $sel:effectDeclsBySymbol:FileSummary :: Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclsBySymbol = Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclarationsId',
              $sel:effectDeclsByReference:FileSummary :: Map TermReferenceId (Map Symbol (EffectDeclaration Symbol Ann))
effectDeclsByReference = Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
-> Map TermReferenceId (Map Symbol (EffectDeclaration Symbol Ann))
forall v r a. (Ord v, Ord r) => Map v (r, a) -> Map r (Map v a)
declsRefMap Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclarationsId',
              $sel:termsBySymbol:FileSummary :: Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
termsBySymbol = Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
trms,
              $sel:termsByReference:FileSummary :: Map
  (Maybe TermReferenceId)
  (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
termsByReference = Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
-> Map
     (Maybe TermReferenceId)
     (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
forall v r ann a b.
(Ord v, Ord r) =>
Map v (ann, r, a, b) -> Map r (Map v (ann, a, b))
termsRefMap Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
trms,
              $sel:testWatchSummary:FileSummary :: [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatchSummary = [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatches,
              $sel:exprWatchSummary:FileSummary :: [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatchSummary = [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatches,
              $sel:fileNames:FileSummary :: Names
fileNames = TypecheckedUnisonFile Symbol Ann -> Names
forall v a. Var v => TypecheckedUnisonFile v a -> Names
UF.typecheckedToNames TypecheckedUnisonFile Symbol Ann
tf
            }
  (Just uf :: UnisonFile Symbol Ann
uf@(UF.UnisonFileId {Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclarationsId :: Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
$sel:dataDeclarationsId:UnisonFileId :: forall v a.
UnisonFile v a -> Map v (TermReferenceId, DataDeclaration v a)
dataDeclarationsId, Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclarationsId :: Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
$sel:effectDeclarationsId:UnisonFileId :: forall v a.
UnisonFile v a -> Map v (TermReferenceId, EffectDeclaration v a)
effectDeclarationsId, Map Symbol (Ann, Term Symbol Ann)
terms :: Map Symbol (Ann, Term Symbol Ann)
$sel:terms:UnisonFileId :: forall v a. UnisonFile v a -> Map v (a, Term v a)
terms, Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
watches :: Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
$sel:watches:UnisonFileId :: forall v a. UnisonFile v a -> Map WatchKind [(v, a, Term v a)]
watches}), Maybe (TypecheckedUnisonFile Symbol Ann)
_) ->
    let trms :: Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
trms = (\(Ann
ann, Term Symbol Ann
trm) -> (Ann
ann, Maybe TermReferenceId
forall a. Maybe a
Nothing, Term Symbol Ann
trm, Maybe (Type Symbol Ann)
forall a. Maybe a
Nothing)) ((Ann, Term Symbol Ann)
 -> (Ann, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann)))
-> Map Symbol (Ann, Term Symbol Ann)
-> Map
     Symbol
     (Ann, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Map Symbol (Ann, Term Symbol Ann)
terms
        ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatches, [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatches) =
          Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
watches Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
-> (Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
    -> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
          Maybe (Type Symbol Ann))],
        [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
          Maybe (Type Symbol Ann), Maybe WatchKind)]))
-> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))],
    [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann), Maybe WatchKind)])
forall a b. a -> (a -> b) -> b
& (WatchKind
 -> [(Symbol, Ann, Term Symbol Ann)]
 -> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
       Maybe (Type Symbol Ann))],
     [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
       Maybe (Type Symbol Ann), Maybe WatchKind)]))
-> Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
-> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))],
    [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann), Maybe WatchKind)])
forall m a.
Monoid m =>
(WatchKind -> a -> m) -> Map WatchKind a -> m
forall i (f :: * -> *) m a.
(FoldableWithIndex i f, Monoid m) =>
(i -> a -> m) -> f a -> m
ifoldMap \WatchKind
wk [(Symbol, Ann, Term Symbol Ann)]
tms ->
            [(Symbol, Ann, Term Symbol Ann)]
tms [(Symbol, Ann, Term Symbol Ann)]
-> ([(Symbol, Ann, Term Symbol Ann)]
    -> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
          Maybe (Type Symbol Ann))],
        [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
          Maybe (Type Symbol Ann), Maybe WatchKind)]))
-> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))],
    [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann), Maybe WatchKind)])
forall a b. a -> (a -> b) -> b
& ((Symbol, Ann, Term Symbol Ann)
 -> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
       Maybe (Type Symbol Ann))],
     [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
       Maybe (Type Symbol Ann), Maybe WatchKind)]))
-> [(Symbol, Ann, Term Symbol Ann)]
-> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))],
    [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann), Maybe WatchKind)])
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap \(Symbol
v, Ann
ann, Term Symbol Ann
trm) ->
              case WatchKind
wk of
                WatchKind
TestWatch -> ([(Ann
ann, Symbol -> Maybe Symbol
assertUserSym Symbol
v, Maybe TermReferenceId
forall a. Maybe a
Nothing, Term Symbol Ann
trm, Maybe (Type Symbol Ann)
forall a. Maybe a
Nothing)], [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
forall a. Monoid a => a
mempty)
                WatchKind
_ -> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
forall a. Monoid a => a
mempty, [(Ann
ann, Symbol -> Maybe Symbol
assertUserSym Symbol
v, Maybe TermReferenceId
forall a. Maybe a
Nothing, Term Symbol Ann
trm, Maybe (Type Symbol Ann)
forall a. Maybe a
Nothing, WatchKind -> Maybe WatchKind
forall a. a -> Maybe a
Just WatchKind
wk)])
     in FileSummary -> Maybe FileSummary
forall a. a -> Maybe a
Just (FileSummary -> Maybe FileSummary)
-> FileSummary -> Maybe FileSummary
forall a b. (a -> b) -> a -> b
$
          FileSummary
            { $sel:dataDeclsBySymbol:FileSummary :: Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclsBySymbol = Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclarationsId,
              $sel:dataDeclsByReference:FileSummary :: Map TermReferenceId (Map Symbol (DataDeclaration Symbol Ann))
dataDeclsByReference = Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
-> Map TermReferenceId (Map Symbol (DataDeclaration Symbol Ann))
forall v r a. (Ord v, Ord r) => Map v (r, a) -> Map r (Map v a)
declsRefMap Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclarationsId,
              $sel:effectDeclsBySymbol:FileSummary :: Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclsBySymbol = Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclarationsId,
              $sel:effectDeclsByReference:FileSummary :: Map TermReferenceId (Map Symbol (EffectDeclaration Symbol Ann))
effectDeclsByReference = Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
-> Map TermReferenceId (Map Symbol (EffectDeclaration Symbol Ann))
forall v r a. (Ord v, Ord r) => Map v (r, a) -> Map r (Map v a)
declsRefMap Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclarationsId,
              $sel:termsBySymbol:FileSummary :: Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
termsBySymbol = Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
trms,
              $sel:termsByReference:FileSummary :: Map
  (Maybe TermReferenceId)
  (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
termsByReference = Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
-> Map
     (Maybe TermReferenceId)
     (Map Symbol (Ann, Term Symbol Ann, Maybe (Type Symbol Ann)))
forall v r ann a b.
(Ord v, Ord r) =>
Map v (ann, r, a, b) -> Map r (Map v (ann, a, b))
termsRefMap Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
trms,
              $sel:testWatchSummary:FileSummary :: [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatchSummary = [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann))]
testWatches,
              $sel:exprWatchSummary:FileSummary :: [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatchSummary = [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
exprWatches,
              $sel:fileNames:FileSummary :: Names
fileNames = UnisonFile Symbol Ann -> Names
forall v a. Var v => UnisonFile v a -> Names
UF.toNames UnisonFile Symbol Ann
uf
            }
  where
    declsRefMap :: (Ord v, Ord r) => Map v (r, a) -> Map r (Map v a)
    declsRefMap :: forall v r a. (Ord v, Ord r) => Map v (r, a) -> Map r (Map v a)
declsRefMap Map v (r, a)
m =
      Map v (r, a)
m
        Map v (r, a) -> (Map v (r, a) -> [(v, (r, a))]) -> [(v, (r, a))]
forall a b. a -> (a -> b) -> b
& Map v (r, a) -> [(v, (r, a))]
forall k a. Map k a -> [(k, a)]
Map.toList
        [(v, (r, a))]
-> ([(v, (r, a))] -> [(r, Map v a)]) -> [(r, Map v a)]
forall a b. a -> (a -> b) -> b
& ((v, (r, a)) -> (r, Map v a)) -> [(v, (r, a))] -> [(r, Map v a)]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(v
v, (r
r, a
a)) -> (r
r, v -> a -> Map v a
forall k a. k -> a -> Map k a
Map.singleton v
v a
a))
        [(r, Map v a)]
-> ([(r, Map v a)] -> Map r (Map v a)) -> Map r (Map v a)
forall a b. a -> (a -> b) -> b
& (Map v a -> Map v a -> Map v a)
-> [(r, Map v a)] -> Map r (Map v a)
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith Map v a -> Map v a -> Map v a
forall a. Semigroup a => a -> a -> a
(<>)
    termsRefMap :: (Ord v, Ord r) => Map v (ann, r, a, b) -> Map r (Map v (ann, a, b))
    termsRefMap :: forall v r ann a b.
(Ord v, Ord r) =>
Map v (ann, r, a, b) -> Map r (Map v (ann, a, b))
termsRefMap Map v (ann, r, a, b)
m =
      Map v (ann, r, a, b)
m
        Map v (ann, r, a, b)
-> (Map v (ann, r, a, b) -> [(v, (ann, r, a, b))])
-> [(v, (ann, r, a, b))]
forall a b. a -> (a -> b) -> b
& Map v (ann, r, a, b) -> [(v, (ann, r, a, b))]
forall k a. Map k a -> [(k, a)]
Map.toList
        [(v, (ann, r, a, b))]
-> ([(v, (ann, r, a, b))] -> [(r, Map v (ann, a, b))])
-> [(r, Map v (ann, a, b))]
forall a b. a -> (a -> b) -> b
& ((v, (ann, r, a, b)) -> (r, Map v (ann, a, b)))
-> [(v, (ann, r, a, b))] -> [(r, Map v (ann, a, b))]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(v
v, (ann
ann, r
r, a
a, b
b)) -> (r
r, v -> (ann, a, b) -> Map v (ann, a, b)
forall k a. k -> a -> Map k a
Map.singleton v
v (ann
ann, a
a, b
b)))
        [(r, Map v (ann, a, b))]
-> ([(r, Map v (ann, a, b))] -> Map r (Map v (ann, a, b)))
-> Map r (Map v (ann, a, b))
forall a b. a -> (a -> b) -> b
& (Map v (ann, a, b) -> Map v (ann, a, b) -> Map v (ann, a, b))
-> [(r, Map v (ann, a, b))] -> Map r (Map v (ann, a, b))
forall k a. Ord k => (a -> a -> a) -> [(k, a)] -> Map k a
Map.fromListWith Map v (ann, a, b) -> Map v (ann, a, b) -> Map v (ann, a, b)
forall a. Semigroup a => a -> a -> a
(<>)
    -- Gets the user provided type annotation for a term if there is one.
    -- This type sig will have Ann's within the file if it exists.
    getUserTypeAnnotation :: Symbol -> Maybe (Type Symbol Ann)
    getUserTypeAnnotation :: Symbol -> Maybe (Type Symbol Ann)
getUserTypeAnnotation Symbol
v = do
      UF.UnisonFileId {Map Symbol (Ann, Term Symbol Ann)
$sel:terms:UnisonFileId :: forall v a. UnisonFile v a -> Map v (a, Term v a)
terms :: Map Symbol (Ann, Term Symbol Ann)
terms, Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
$sel:watches:UnisonFileId :: forall v a. UnisonFile v a -> Map WatchKind [(v, a, Term v a)]
watches :: Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
watches} <- Maybe (UnisonFile Symbol Ann)
parsed
      Term Symbol Ann
trm <- Map Symbol (Ann, Term Symbol Ann)
terms Map Symbol (Ann, Term Symbol Ann)
-> Getting
     (First (Term Symbol Ann))
     (Map Symbol (Ann, Term Symbol Ann))
     (Term Symbol Ann)
-> Maybe (Term Symbol Ann)
forall s a. s -> Getting (First a) s a -> Maybe a
^? Index (Map Symbol (Ann, Term Symbol Ann))
-> Traversal'
     (Map Symbol (Ann, Term Symbol Ann))
     (IxValue (Map Symbol (Ann, Term Symbol Ann)))
forall m. Ixed m => Index m -> Traversal' m (IxValue m)
ix Index (Map Symbol (Ann, Term Symbol Ann))
Symbol
v (((Ann, Term Symbol Ann)
  -> Const (First (Term Symbol Ann)) (Ann, Term Symbol Ann))
 -> Map Symbol (Ann, Term Symbol Ann)
 -> Const
      (First (Term Symbol Ann)) (Map Symbol (Ann, Term Symbol Ann)))
-> ((Term Symbol Ann
     -> Const (First (Term Symbol Ann)) (Term Symbol Ann))
    -> (Ann, Term Symbol Ann)
    -> Const (First (Term Symbol Ann)) (Ann, Term Symbol Ann))
-> Getting
     (First (Term Symbol Ann))
     (Map Symbol (Ann, Term Symbol Ann))
     (Term Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Term Symbol Ann
 -> Const (First (Term Symbol Ann)) (Term Symbol Ann))
-> (Ann, Term Symbol Ann)
-> Const (First (Term Symbol Ann)) (Ann, Term Symbol Ann)
forall s t a b. Field2 s t a b => Lens s t a b
Lens
  (Ann, Term Symbol Ann)
  (Ann, Term Symbol Ann)
  (Term Symbol Ann)
  (Term Symbol Ann)
_2 Maybe (Term Symbol Ann)
-> Maybe (Term Symbol Ann) -> Maybe (Term Symbol Ann)
forall a. Maybe a -> Maybe a -> Maybe a
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
watches Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
-> Getting
     (First (Term Symbol Ann))
     (Map WatchKind [(Symbol, Ann, Term Symbol Ann)])
     (Term Symbol Ann)
-> Maybe (Term Symbol Ann)
forall s a. s -> Getting (First a) s a -> Maybe a
^? ([(Symbol, Ann, Term Symbol Ann)]
 -> Const
      (First (Term Symbol Ann)) [(Symbol, Ann, Term Symbol Ann)])
-> Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
-> Const
     (First (Term Symbol Ann))
     (Map WatchKind [(Symbol, Ann, Term Symbol Ann)])
forall (f :: * -> *) a. Foldable f => IndexedFold Int (f a) a
IndexedFold
  Int
  (Map WatchKind [(Symbol, Ann, Term Symbol Ann)])
  [(Symbol, Ann, Term Symbol Ann)]
folded (([(Symbol, Ann, Term Symbol Ann)]
  -> Const
       (First (Term Symbol Ann)) [(Symbol, Ann, Term Symbol Ann)])
 -> Map WatchKind [(Symbol, Ann, Term Symbol Ann)]
 -> Const
      (First (Term Symbol Ann))
      (Map WatchKind [(Symbol, Ann, Term Symbol Ann)]))
-> ((Term Symbol Ann
     -> Const (First (Term Symbol Ann)) (Term Symbol Ann))
    -> [(Symbol, Ann, Term Symbol Ann)]
    -> Const
         (First (Term Symbol Ann)) [(Symbol, Ann, Term Symbol Ann)])
-> Getting
     (First (Term Symbol Ann))
     (Map WatchKind [(Symbol, Ann, Term Symbol Ann)])
     (Term Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Symbol, Ann, Term Symbol Ann)
 -> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann))
-> [(Symbol, Ann, Term Symbol Ann)]
-> Const (First (Term Symbol Ann)) [(Symbol, Ann, Term Symbol Ann)]
forall (f :: * -> *) a. Foldable f => IndexedFold Int (f a) a
IndexedFold
  Int [(Symbol, Ann, Term Symbol Ann)] (Symbol, Ann, Term Symbol Ann)
folded (((Symbol, Ann, Term Symbol Ann)
  -> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann))
 -> [(Symbol, Ann, Term Symbol Ann)]
 -> Const
      (First (Term Symbol Ann)) [(Symbol, Ann, Term Symbol Ann)])
-> ((Term Symbol Ann
     -> Const (First (Term Symbol Ann)) (Term Symbol Ann))
    -> (Symbol, Ann, Term Symbol Ann)
    -> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann))
-> (Term Symbol Ann
    -> Const (First (Term Symbol Ann)) (Term Symbol Ann))
-> [(Symbol, Ann, Term Symbol Ann)]
-> Const (First (Term Symbol Ann)) [(Symbol, Ann, Term Symbol Ann)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Getting (First ()) (Symbol, Ann, Term Symbol Ann) ()
-> ((Symbol, Ann, Term Symbol Ann)
    -> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann))
-> (Symbol, Ann, Term Symbol Ann)
-> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann)
forall i (p :: * -> * -> *) (f :: * -> *) a.
(Indexable i p, Applicative f) =>
Getting (First i) a i -> p a (f a) -> a -> f a
filteredBy ((Symbol -> Const (First ()) Symbol)
-> (Symbol, Ann, Term Symbol Ann)
-> Const (First ()) (Symbol, Ann, Term Symbol Ann)
forall s t a b. Field1 s t a b => Lens s t a b
Lens
  (Symbol, Ann, Term Symbol Ann)
  (Symbol, Ann, Term Symbol Ann)
  Symbol
  Symbol
_1 ((Symbol -> Const (First ()) Symbol)
 -> (Symbol, Ann, Term Symbol Ann)
 -> Const (First ()) (Symbol, Ann, Term Symbol Ann))
-> ((() -> Const (First ()) ())
    -> Symbol -> Const (First ()) Symbol)
-> Getting (First ()) (Symbol, Ann, Term Symbol Ann) ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Symbol -> Prism' Symbol ()
forall a. Eq a => a -> Prism' a ()
only Symbol
v) (((Symbol, Ann, Term Symbol Ann)
  -> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann))
 -> (Symbol, Ann, Term Symbol Ann)
 -> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann))
-> ((Term Symbol Ann
     -> Const (First (Term Symbol Ann)) (Term Symbol Ann))
    -> (Symbol, Ann, Term Symbol Ann)
    -> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann))
-> (Term Symbol Ann
    -> Const (First (Term Symbol Ann)) (Term Symbol Ann))
-> (Symbol, Ann, Term Symbol Ann)
-> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Term Symbol Ann
 -> Const (First (Term Symbol Ann)) (Term Symbol Ann))
-> (Symbol, Ann, Term Symbol Ann)
-> Const (First (Term Symbol Ann)) (Symbol, Ann, Term Symbol Ann)
forall s t a b. Field3 s t a b => Lens s t a b
Lens
  (Symbol, Ann, Term Symbol Ann)
  (Symbol, Ann, Term Symbol Ann)
  (Term Symbol Ann)
  (Term Symbol Ann)
_3
      Type Symbol Ann
typ <- Term Symbol Ann -> Maybe (Type Symbol Ann)
forall v a. Term v a -> Maybe (Type v a)
Term.getTypeAnnotation Term Symbol Ann
trm
      pure Type Symbol Ann
typ

    -- \| If a symbol is a 'User' symbol, return (Just sym), otherwise return Nothing.
    assertUserSym :: Symbol -> Maybe Symbol
    assertUserSym :: Symbol -> Maybe Symbol
assertUserSym Symbol
sym = case Symbol
sym of
      Symbol.Symbol Word64
_ (Var.User {}) -> Symbol -> Maybe Symbol
forall a. a -> Maybe a
Just Symbol
sym
      Symbol
_ -> Maybe Symbol
forall a. Maybe a
Nothing

-- | Compute the location of user defined definitions within the file
fileDefLocations :: FileSummary -> Map Symbol (Set Ann)
fileDefLocations :: FileSummary -> Map Symbol (Set Ann)
fileDefLocations fs :: FileSummary
fs@FileSummary {Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
$sel:dataDeclsBySymbol:FileSummary :: FileSummary
-> Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclsBySymbol :: Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclsBySymbol, Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
$sel:effectDeclsBySymbol:FileSummary :: FileSummary
-> Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclsBySymbol :: Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclsBySymbol, Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
$sel:termsBySymbol:FileSummary :: FileSummary
-> Map
     Symbol
     (Ann, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann))
termsBySymbol :: Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
termsBySymbol} =
  [Map Symbol (Set Ann)] -> Map Symbol (Set Ann)
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
    [ Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
dataDeclsBySymbol Map Symbol (TermReferenceId, DataDeclaration Symbol Ann)
-> ((TermReferenceId, DataDeclaration Symbol Ann) -> Set Ann)
-> Map Symbol (Set Ann)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(TermReferenceId
_, DataDeclaration Symbol Ann
decl) ->
        DataDeclaration Symbol Ann
decl
          DataDeclaration Symbol Ann
-> (DataDeclaration Symbol Ann -> Ann) -> Ann
forall a b. a -> (a -> b) -> b
& DataDeclaration Symbol Ann -> Ann
forall v a. DataDeclaration v a -> a
DD.annotation
          Ann -> (Ann -> Set Ann) -> Set Ann
forall a b. a -> (a -> b) -> b
& Ann -> Set Ann
forall a. a -> Set a
Set.singleton,
      Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
effectDeclsBySymbol Map Symbol (TermReferenceId, EffectDeclaration Symbol Ann)
-> ((TermReferenceId, EffectDeclaration Symbol Ann) -> Set Ann)
-> Map Symbol (Set Ann)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(TermReferenceId
_, EffectDeclaration Symbol Ann
decl) ->
        EffectDeclaration Symbol Ann
decl
          EffectDeclaration Symbol Ann
-> (EffectDeclaration Symbol Ann -> DataDeclaration Symbol Ann)
-> DataDeclaration Symbol Ann
forall a b. a -> (a -> b) -> b
& EffectDeclaration Symbol Ann -> DataDeclaration Symbol Ann
forall v a. EffectDeclaration v a -> DataDeclaration v a
DD.toDataDecl
          DataDeclaration Symbol Ann
-> (DataDeclaration Symbol Ann -> Ann) -> Ann
forall a b. a -> (a -> b) -> b
& DataDeclaration Symbol Ann -> Ann
forall v a. DataDeclaration v a -> a
DD.annotation
          Ann -> (Ann -> Set Ann) -> Set Ann
forall a b. a -> (a -> b) -> b
& Ann -> Set Ann
forall a. a -> Set a
Set.singleton,
      (FileSummary
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe WatchKind)]
allWatches FileSummary
fs)
        [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)]
-> ([(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
      Maybe (Type Symbol Ann), Maybe WatchKind)]
    -> Map Symbol (Set Ann))
-> Map Symbol (Set Ann)
forall a b. a -> (a -> b) -> b
& ((Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
  Maybe (Type Symbol Ann), Maybe WatchKind)
 -> Map Symbol (Set Ann))
-> [(Ann, Maybe Symbol, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann), Maybe WatchKind)]
-> Map Symbol (Set Ann)
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap \(Ann
ann, Maybe Symbol
maySym, Maybe TermReferenceId
_id, Term Symbol Ann
_trm, Maybe (Type Symbol Ann)
_typ, Maybe WatchKind
_wk) ->
          case Maybe Symbol
maySym of
            Maybe Symbol
Nothing -> Map Symbol (Set Ann)
forall a. Monoid a => a
mempty
            Just Symbol
sym -> Symbol -> Set Ann -> Map Symbol (Set Ann)
forall k a. k -> a -> Map k a
Map.singleton Symbol
sym (Ann -> Set Ann
forall a. a -> Set a
Set.singleton Ann
ann),
      Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
termsBySymbol Map
  Symbol
  (Ann, Maybe TermReferenceId, Term Symbol Ann,
   Maybe (Type Symbol Ann))
-> ((Ann, Maybe TermReferenceId, Term Symbol Ann,
     Maybe (Type Symbol Ann))
    -> Set Ann)
-> Map Symbol (Set Ann)
forall (f :: * -> *) a b. Functor f => f a -> (a -> b) -> f b
<&> \(Ann
ann, Maybe TermReferenceId
_id, Term Symbol Ann
_trm, Maybe (Type Symbol Ann)
_typ) -> Ann -> Set Ann
forall a. a -> Set a
Set.singleton Ann
ann
    ]