@@ -6,7 +6,9 @@ module Share.Codebase.CodeCache
66 termsForRefsOf ,
77 typesOfReferentsOf ,
88 getTermsAndTypesByRefIdsOf ,
9+ expectTermsAndTypesByRefIdsOf ,
910 getTypeDeclsByRefIdsOf ,
11+ expectTypeDeclsByRefIdsOf ,
1012 getTypeDeclsByRefsOf ,
1113 cacheTermAndTypes ,
1214 cacheDecls ,
@@ -34,6 +36,7 @@ import Unison.DataDeclaration qualified as V1
3436import Unison.DataDeclaration.ConstructorId qualified as V1Decl
3537import Unison.Hash (Hash )
3638import Unison.Parser.Ann
39+ import Unison.Reference (TermReferenceId , TypeReferenceId )
3740import Unison.Reference qualified as Reference
3841import Unison.Referent qualified as V1Referent
3942import Unison.Runtime.IOSource qualified as IOSource
@@ -43,6 +46,9 @@ import Unison.Term qualified as V1
4346import Unison.Type qualified as Type
4447import Unison.Type qualified as V1
4548
49+ type TermAndType =
50+ (V1. Term Symbol Ann , V1. Type Symbol Ann )
51+
4652withCodeCache :: (QueryM m ) => CodebaseEnv -> (forall s . CodeCache s -> m r ) -> m r
4753withCodeCache codeCacheCodebaseEnv action = do
4854 codeCacheVar <- PG. transactionUnsafeIO (newTVarIO (CodeCacheData Map. empty Map. empty))
@@ -52,30 +58,24 @@ withCodeCache codeCacheCodebaseEnv action = do
5258readCodeCache :: (QueryM m ) => CodeCache s -> m CodeCacheData
5359readCodeCache CodeCache {codeCacheVar} = PG. transactionUnsafeIO (readTVarIO codeCacheVar)
5460
55- cacheTermAndTypes ::
56- (QueryM m ) =>
57- CodeCache s ->
58- [(Reference. Id , (V1. Term Symbol Ann , V1. Type Symbol Ann ))] ->
59- m ()
61+ cacheTermAndTypes :: (QueryM m ) => CodeCache s -> Map TermReferenceId TermAndType -> m ()
6062cacheTermAndTypes CodeCache {codeCacheVar} termAndTypes = do
6163 PG. transactionUnsafeIO do
6264 atomically do
6365 modifyTVar' codeCacheVar \ CodeCacheData {termCache, .. } ->
64- let newTermMap = Map. fromList termAndTypes
65- termCache' = Map. union termCache newTermMap
66+ let ! termCache' = Map. union termCache termAndTypes
6667 in CodeCacheData {termCache = termCache', .. }
6768
6869cacheDecls ::
6970 (QueryM m ) =>
7071 CodeCache s ->
71- [( Reference. Id , V1. Decl Symbol Ann )] ->
72+ Map TypeReferenceId ( V1. Decl Symbol Ann ) ->
7273 m ()
7374cacheDecls CodeCache {codeCacheVar} decls = do
7475 PG. transactionUnsafeIO do
7576 atomically do
7677 modifyTVar' codeCacheVar \ CodeCacheData {typeCache, .. } ->
77- let newDeclsMap = Map. fromList decls
78- typeCache' = Map. union typeCache newDeclsMap
78+ let ! typeCache' = Map. union typeCache decls
7979 in CodeCacheData {typeCache = typeCache', .. }
8080
8181builtinsCodeLookup :: (Monad m ) => CL. CodeLookup Symbol m Ann
@@ -97,7 +97,7 @@ toCodeLookup codeCache = do
9797getTermsAndTypesByRefIdsOf ::
9898 (QueryM m ) =>
9999 CodeCache scope ->
100- Traversal s t Reference. Id (Maybe ( V1. Term Symbol Ann , V1. Type Symbol Ann ) ) ->
100+ Traversal s t TermReferenceId (Maybe TermAndType ) ->
101101 s ->
102102 m t
103103getTermsAndTypesByRefIdsOf codeCache@ (CodeCache {codeCacheCodebaseEnv}) trav s = do
@@ -123,19 +123,34 @@ getTermsAndTypesByRefIdsOf codeCache@(CodeCache {codeCacheCodebaseEnv}) trav s =
123123 Nothing -> (mempty , Nothing )
124124 Right tt -> (mempty , Just tt)
125125
126- cacheTermAndTypes codeCache cacheable
127- pure $ hydrated'
128- where
129- findBuiltinTT :: Reference. Id -> Maybe (V1. Term Symbol Ann , V1. Type Symbol Ann )
130- findBuiltinTT refId = do
131- tm <- runIdentity $ CL. getTerm builtinsCodeLookup refId
132- typ <- runIdentity $ CL. getTypeOfTerm builtinsCodeLookup refId
133- pure (tm, typ)
126+ cacheTermAndTypes codeCache (Map. fromList cacheable)
127+ pure hydrated'
128+
129+ -- | Like 'getTermsAndTypesByRefIdsOf', but throws an unrecoverable error when the term isn't in the database.
130+ expectTermsAndTypesByRefIdsOf ::
131+ forall m scope s t .
132+ (QueryM m ) =>
133+ CodeCache scope ->
134+ Traversal s t TermReferenceId TermAndType ->
135+ s ->
136+ m t
137+ expectTermsAndTypesByRefIdsOf codeCache trav =
138+ asListOf trav %%~ \ refs -> do
139+ termsAndTypes <- getTermsAndTypesByRefIdsOf codeCache traverse refs
140+ for (zip refs termsAndTypes) \ case
141+ (_, Just tt) -> pure tt
142+ (ref, Nothing ) -> PG. unrecoverableError (Codebase. MissingTerm ref)
143+
144+ findBuiltinTT :: TermReferenceId -> Maybe TermAndType
145+ findBuiltinTT refId = do
146+ tm <- runIdentity $ CL. getTerm builtinsCodeLookup refId
147+ typ <- runIdentity $ CL. getTypeOfTerm builtinsCodeLookup refId
148+ pure (tm, typ)
134149
135150getTypeDeclsByRefIdsOf ::
136151 (QueryM m ) =>
137152 CodeCache scope ->
138- Traversal s t Reference. Id (Maybe (V1. Decl Symbol Ann )) ->
153+ Traversal s t TypeReferenceId (Maybe (V1. Decl Symbol Ann )) ->
139154 s ->
140155 m t
141156getTypeDeclsByRefIdsOf codeCache@ (CodeCache {codeCacheCodebaseEnv}) trav s = do
@@ -161,12 +176,25 @@ getTypeDeclsByRefIdsOf codeCache@(CodeCache {codeCacheCodebaseEnv}) trav s = do
161176 Nothing -> (mempty , Nothing )
162177 Right decl -> (mempty , Just decl)
163178
164- cacheDecls codeCache cacheable
165- pure $ hydrated'
166- where
167- findBuiltinDecl :: Reference. Id -> Maybe (V1. Decl Symbol Ann )
168- findBuiltinDecl refId = do
169- runIdentity $ CL. getTypeDeclaration builtinsCodeLookup refId
179+ cacheDecls codeCache (Map. fromList cacheable)
180+ pure hydrated'
181+
182+ expectTypeDeclsByRefIdsOf ::
183+ (QueryM m ) =>
184+ CodeCache scope ->
185+ Traversal s t TypeReferenceId (V1. Decl Symbol Ann ) ->
186+ s ->
187+ m t
188+ expectTypeDeclsByRefIdsOf codeCache trav =
189+ asListOf trav %%~ \ refs -> do
190+ decls <- getTypeDeclsByRefIdsOf codeCache traverse refs
191+ for (zip refs decls) \ case
192+ (_, Just decl) -> pure decl
193+ (ref, Nothing ) -> PG. unrecoverableError (Codebase. MissingDecl ref)
194+
195+ findBuiltinDecl :: Reference. Id -> Maybe (V1. Decl Symbol Ann )
196+ findBuiltinDecl refId = do
197+ runIdentity $ CL. getTypeDeclaration builtinsCodeLookup refId
170198
171199getTypeDeclsByRefsOf ::
172200 (QueryM m ) =>
@@ -196,7 +224,7 @@ termsForRefsOf codeCache trav s = do
196224 s
197225 & asListOf trav %%~ \ refs ->
198226 do
199- let trav :: Traversal Reference (Maybe (V1. Term Symbol () )) Reference. Id (Maybe ( V1. Term Symbol Ann , V1. Type Symbol Ann ) )
227+ let trav :: Traversal Reference (Maybe (V1. Term Symbol () )) Reference. Id (Maybe TermAndType )
200228 trav f = \ case
201229 -- Builtins are their own terms
202230 ref@ (Reference. Builtin _) -> pure (Just (Term. ref () ref))
@@ -241,7 +269,7 @@ typesOfReferentsOf codeCache trav s = do
241269 [ Either
242270 (V1. Type Symbol () )
243271 ( Either
244- (Maybe ( V1. Term Symbol Ann , V1. Type Symbol Ann ) )
272+ (Maybe TermAndType )
245273 (Reference. Id' Hash , V1Decl. ConstructorId )
246274 )
247275 ] <-
@@ -250,7 +278,7 @@ typesOfReferentsOf codeCache trav s = do
250278 [ Either
251279 (V1. Type Symbol () )
252280 ( Either
253- (Maybe ( V1. Term Symbol Ann , V1. Type Symbol Ann ) )
281+ (Maybe TermAndType )
254282 (Maybe (V1. Decl Symbol Ann ), V1Decl. ConstructorId )
255283 )
256284 ] <-
0 commit comments