@@ -32,8 +32,7 @@ import UntypedPlutusCore qualified as UPLC
32
32
import UntypedPlutusCore.Check.Uniques qualified as UPLC
33
33
34
34
import Control.Lens hiding ((%~) )
35
- import Control.Monad.Error.Lens
36
- import Control.Monad.Except (MonadError )
35
+ import Control.Monad.Except
37
36
import Control.Monad.Reader
38
37
import Data.Singletons.Decide
39
38
import Data.Text
@@ -61,14 +60,14 @@ compileProgram = curry $ \case
61
60
-- TODO: optimise
62
61
>=> pirToOutName n1 n2
63
62
>=> toOutAnn a1 a2
64
- (SPlc n1 a1, SPlc n2 a2) ->
65
- through (modifyError (fmap PIR. Original . PIR. PLCError ) . plcTypecheck n1 a1)
66
- >=> plcToOutName n1 n2
63
+ (SPlc n1 a1, SPlc n2 a2) -> -- TODO: modifyError ... is repeated multiple times
64
+ through (modifyError (fmap PIR. Original ) . plcTypecheck n1 a1)
65
+ >=> modifyError ( fmap PIR. Original . PIR. PLCError . PLC. FreeVariableErrorE ) . plcToOutName n1 n2
67
66
>=> toOutAnn a1 a2
68
67
(SUplc n1 a1, SUplc n2 a2) ->
69
- through (modifyError (fmap PIR. Original ) . uplcTypecheck n1 a1)
70
- >=> uplcOptimise n1
71
- >=> uplcToOutName n1 n2
68
+ through (modifyError (fmap PIR. Original . PIR. PLCError ) . uplcTypecheck n1 a1)
69
+ >=> modifyError ( fmap PIR. Original ) . uplcOptimise n1
70
+ >=> modifyError ( fmap PIR. Original . PIR. PLCError . PLC. FreeVariableErrorE ) . uplcToOutName n1 n2
72
71
>=> toOutAnn a1 a2
73
72
-- nothing to be done; seems silly, but can be used for later changing format of Data
74
73
(SData , SData ) -> pure
@@ -82,13 +81,13 @@ compileProgram = curry $ \case
82
81
withA @ Ord a1 $ withA @ Pretty a1 $ withA @ AnnInline a1 $
83
82
-- Note: PIR.compileProgram subsumes pir typechecking
84
83
(PLC. runQuoteT . flip runReaderT compCtx . PIR. compileProgram)
85
- >=> plcToOutName n1 n2
84
+ >=> modifyError ( fmap PIR. Original . PIR. PLCError . PLC. FreeVariableErrorE ) . plcToOutName n1 n2
86
85
-- completely drop annotations for now
87
86
>=> pure . void
88
87
where
89
88
compCtx = PIR. toDefaultCompilationCtx $
90
89
unsafeFromRight @ (PIR. Error DefaultUni DefaultFun () ) $
91
- PLC. getDefTypeCheckConfig ()
90
+ modifyError ( PIR. PLCError . TypeErrorE ) $ PLC. getDefTypeCheckConfig ()
92
91
93
92
-- note to self: this restriction is because of PIR.Provenance appearing in the output
94
93
(SPir _n1@ SName _, SPlc _ _) -> throwingPIR " only support unit-ann output for now"
@@ -139,7 +138,7 @@ compileProgram = curry $ \case
139
138
embedProgram :: PLC. Program tyname name uni fun ann -> PIR. Program tyname name uni fun ann
140
139
embedProgram (PLC. Program a v t) = PIR. Program a v $ embedTerm t
141
140
142
- toOutAnn :: (Functor f , PIR. AsError e uni fun a , MonadError e m )
141
+ toOutAnn :: (Functor f , MonadError ( PIR. Error uni fun a ) m )
143
142
=> SAnn s1
144
143
-> SAnn s2
145
144
-> f (FromAnn s1 )
@@ -152,76 +151,67 @@ toOutAnn _ _ = throwingPIR "cannot convert annotatio
152
151
-- or by some singletons type-level programming
153
152
154
153
pirTypecheck
155
- :: ( PIR. AsTypeErrorExt e DefaultUni (FromAnn a )
156
- , PIR. AsTypeError e (PIR. Term UPLC. TyName UPLC. Name DefaultUni DefaultFun () )
157
- DefaultUni DefaultFun (FromAnn a ), MonadError e m
158
- )
154
+ :: (MonadError (PIR. Error DefaultUni DefaultFun (FromAnn a )) m )
159
155
=> SAnn a
160
156
-> PIR. Program PLC. TyName PLC. Name DefaultUni DefaultFun (FromAnn a )
161
157
-> m ()
162
158
pirTypecheck sngA p = PLC. runQuoteT $ do
163
- tcConfig <- withA @ Monoid sngA $ PIR. getDefTypeCheckConfig mempty
159
+ tcConfig <- withA @ Monoid sngA $ modifyError ( PIR. PLCError . PLC. TypeErrorE ) $ PIR. getDefTypeCheckConfig mempty
164
160
void $ PIR. inferTypeOfProgram tcConfig p
165
161
166
- plcToUplcViaName :: (PLC. MonadQuote m , PLC. AsFreeVariableError e , MonadError e m )
162
+ plcToUplcViaName :: (PLC. MonadQuote m , MonadError ( PIR. Error uni fun ann ) m )
167
163
=> SNaming n
168
164
-> (PLC. Program PLC. TyName PLC. Name uni fun a -> m (UPLC. Program PLC. Name uni fun a ))
169
165
-> PLC. Program (FromNameTy n ) (FromName n ) uni fun a
170
166
-> m (UPLC. Program (FromName n ) uni fun a )
171
167
plcToUplcViaName sngN act = case sngN of
172
168
SName -> act
173
- SNamedDeBruijn -> plcToName sngN act
174
- >=> UPLC. progTerm UPLC. deBruijnTerm
175
- SDeBruijn -> plcToName sngN act
176
- >=> UPLC. progTerm UPLC. deBruijnTerm
169
+ SNamedDeBruijn ->
170
+ plcToName sngN act >=>
171
+ UPLC. progTerm (modifyError (PIR. PLCError . PLC. FreeVariableErrorE ) . UPLC. deBruijnTerm)
172
+ SDeBruijn ->
173
+ plcToName sngN act
174
+ >=> UPLC. progTerm (modifyError (PIR. PLCError . PLC. FreeVariableErrorE ) . UPLC. deBruijnTerm)
177
175
>=> pure . UPLC. programMapNames PLC. unNameDeBruijn
178
176
179
- plcToName :: (PLC. MonadQuote m , PLC. AsFreeVariableError e , MonadError e m )
177
+ plcToName :: (PLC. MonadQuote m , MonadError ( PIR. Error uni fun ann ) m )
180
178
=> SNaming n
181
179
-> (PLC. Program PLC. TyName PLC. Name uni fun a -> m x )
182
180
-> (PLC. Program (FromNameTy n ) (FromName n ) uni fun a -> m x )
183
181
plcToName sngN act = case sngN of
184
182
SName -> act
185
- SNamedDeBruijn -> PLC. progTerm PLC. unDeBruijnTerm
183
+ SNamedDeBruijn -> PLC. progTerm (modifyError ( PIR. PLCError . PLC. FreeVariableErrorE ) . PLC. unDeBruijnTerm)
186
184
>=> act
187
185
SDeBruijn -> pure . PLC. programMapNames PLC. fakeTyNameDeBruijn PLC. fakeNameDeBruijn
188
186
>=> plcToName SNamedDeBruijn act
189
187
190
- uplcViaName :: (PLC. MonadQuote m , PLC. AsFreeVariableError e , MonadError e m )
188
+ uplcViaName :: (PLC. MonadQuote m , MonadError ( PIR. Error uni fun ann ) m )
191
189
=> (UPLC. Program PLC. Name uni fun a -> m (UPLC. Program PLC. Name uni fun a ))
192
190
-> SNaming n
193
191
-> UPLC. Program (FromName n ) uni fun a
194
192
-> m (UPLC. Program (FromName n ) uni fun a )
195
193
uplcViaName act sngN = case sngN of
196
194
SName -> act
197
- SNamedDeBruijn -> UPLC. progTerm UPLC. unDeBruijnTerm
195
+ SNamedDeBruijn -> UPLC. progTerm (modifyError ( PIR. PLCError . PLC. FreeVariableErrorE ) . UPLC. unDeBruijnTerm)
198
196
>=> act
199
- >=> UPLC. progTerm UPLC. deBruijnTerm
197
+ >=> UPLC. progTerm (modifyError ( PIR. PLCError . PLC. FreeVariableErrorE ) . UPLC. deBruijnTerm)
200
198
SDeBruijn -> pure . UPLC. programMapNames UPLC. fakeNameDeBruijn
201
199
>=> uplcViaName act SNamedDeBruijn
202
200
>=> pure . UPLC. programMapNames UPLC. unNameDeBruijn
203
201
204
- plcTypecheck :: (PLC. AsTypeError
205
- e
206
- -- errors remain with names
207
- (PLC. Term PLC. TyName PLC. Name DefaultUni DefaultFun () )
208
- DefaultUni
209
- DefaultFun
210
- (FromAnn a )
211
- , PLC. AsFreeVariableError e
212
- , MonadError e m
213
- )
202
+ plcTypecheck :: (MonadError (PIR. Error DefaultUni DefaultFun (FromAnn a )) m )
214
203
=> SNaming n
215
204
-> SAnn a
216
205
-> PLC. Program (FromNameTy n ) (FromName n ) DefaultUni DefaultFun (FromAnn a )
217
206
-> m ()
218
- plcTypecheck sngN sngA p = PLC. runQuoteT $ do
219
- tcConfig <- withA @ Monoid sngA $ PLC. getDefTypeCheckConfig mempty
220
- void $ plcToName sngN (PLC. inferTypeOfProgram tcConfig) p
207
+ plcTypecheck sngN sngA p = PLC. runQuoteT $ do
208
+ tcConfig <-
209
+ withA @ Monoid sngA $
210
+ modifyError (PIR. PLCError . PLC. TypeErrorE ) $ PLC. getDefTypeCheckConfig mempty
211
+ void $ plcToName sngN (modifyError (PIR. PLCError . PLC. TypeErrorE ) . PLC. inferTypeOfProgram tcConfig) p
221
212
222
213
uplcOptimise :: (? opts :: Opts
223
- , PLC. AsFreeVariableError e
224
- , MonadError e m
214
+ , MonadError (PIR. Error DefaultUni DefaultFun a ) m
225
215
)
226
216
=> SNaming n1
227
217
-> UPLC. UnrestrictedProgram (FromName n1 ) DefaultUni DefaultFun a
@@ -238,31 +228,32 @@ uplcOptimise =
238
228
. _Wrapped
239
229
. uplcViaName (UPLC. simplifyProgram sOpts def)
240
230
241
-
242
231
-- | We do not have a typechecker for uplc, but we could pretend that scopecheck is a "typechecker"
243
- uplcTypecheck :: forall sN sA uni fun e m
244
- . (PLC. AsFreeVariableError e , PLC. AsUniqueError e (FromAnn sA ), MonadError e m )
232
+ uplcTypecheck :: forall sN sA uni fun m
233
+ . (MonadError ( PLC. Error uni fun (FromAnn sA )) m )
245
234
=> SNaming sN
246
235
-> SAnn sA
247
236
-> UPLC. UnrestrictedProgram (FromName sN ) uni fun (FromAnn sA )
248
237
-> m ()
249
238
uplcTypecheck sngN sngA ast = case sngN of
250
- SName -> withA @ Ord sngA $ UPLC. checkProgram (const True ) (ast ^. _Wrapped)
239
+ SName ->
240
+ modifyError PLC. UniqueCoherencyErrorE $
241
+ withA @ Ord sngA $ UPLC. checkProgram (const True ) (ast ^. _Wrapped)
251
242
-- TODO: deduplicate
252
- SDeBruijn -> UPLC. checkScope (ast ^. _Wrapped. UPLC. progTerm)
253
- SNamedDeBruijn -> UPLC. checkScope (ast ^. _Wrapped. UPLC. progTerm)
243
+ SDeBruijn -> modifyError PLC. FreeVariableErrorE $ UPLC. checkScope (ast ^. _Wrapped. UPLC. progTerm)
244
+ SNamedDeBruijn -> modifyError PLC. FreeVariableErrorE $ UPLC. checkScope (ast ^. _Wrapped. UPLC. progTerm)
254
245
255
246
256
247
-- | Placed here just for uniformity, not really needed
257
- pirToOutName :: (PIR. AsError e uni fun a , MonadError e m )
248
+ pirToOutName :: (MonadError ( PIR. Error uni fun a ) m )
258
249
=> SNaming s1
259
250
-> SNaming s2
260
251
-> PIR. Program (FromNameTy s1 ) (FromName s1 ) uni fun ann
261
252
-> m (PIR. Program (FromNameTy s2 ) (FromName s2 ) uni fun ann )
262
253
pirToOutName sng1 ((sng1 %~ ) -> Proved Refl ) = pure
263
254
pirToOutName _ _ = throwingPIR " we do not support name conversion for PIR atm"
264
255
265
- plcToOutName :: (PLC. AsFreeVariableError e , MonadError e m )
256
+ plcToOutName :: (MonadError FreeVariableError m )
266
257
=> SNaming s1
267
258
-> SNaming s2
268
259
-> PLC. Program (FromNameTy s1 ) (FromName s1 ) uni fun ann
@@ -280,14 +271,14 @@ plcToOutName SDeBruijn SName = plcToOutName SDeBruijn SNamedDeBruijn
280
271
>=> plcToOutName SNamedDeBruijn SName
281
272
plcToOutName _ _ = error " this is complete, but i don't want to use -fno-warn-incomplete-patterns"
282
273
283
- uplcToOutName :: (PLC. AsFreeVariableError e , MonadError e m )
274
+ uplcToOutName :: (MonadError FreeVariableError m )
284
275
=> SNaming s1
285
276
-> SNaming s2
286
277
-> UPLC. UnrestrictedProgram (FromName s1 ) uni fun ann
287
278
-> m (UPLC. UnrestrictedProgram (FromName s2 ) uni fun ann )
288
279
uplcToOutName = fmap _Wrapped . uplcToOutName'
289
280
290
- uplcToOutName' :: (PLC. AsFreeVariableError e , MonadError e m )
281
+ uplcToOutName' :: (MonadError FreeVariableError m )
291
282
=> SNaming s1
292
283
-> SNaming s2
293
284
-> UPLC. Program (FromName s1 ) uni fun ann
@@ -304,18 +295,18 @@ uplcToOutName' SDeBruijn SName = uplcToOutName' SDeBruijn SNamedDeBruijn
304
295
uplcToOutName' _ _ = error " this is complete, but i don't want to use -fno-warn-incomplete-patterns"
305
296
306
297
-- TODO: use better, more detailed erroring
307
- throwingPIR :: (PIR. AsError e uni fun a , MonadError e m )
298
+ throwingPIR :: (MonadError ( PIR. Error uni fun a ) m )
308
299
=> Text -> b -> m c
309
- throwingPIR = const . throwing PIR. _Error . PIR. OptionsError
300
+ throwingPIR = const . throwError . PIR. OptionsError
310
301
311
302
checkProgram :: (e ~ PIR. Provenance (FromAnn (US_ann s )),
312
303
MonadError (PIR. Error DefaultUni DefaultFun e ) m )
313
304
=> SLang s
314
305
-> FromLang s
315
306
-> m ()
316
307
checkProgram sng p = modifyError (fmap PIR. Original ) $ case sng of
317
- SPlc n a -> modifyError PIR. PLCError $ plcTypecheck n a p
318
- SUplc n a -> uplcTypecheck n a p
308
+ SPlc n a -> plcTypecheck n a p
309
+ SUplc n a -> modifyError PIR. PLCError $ uplcTypecheck n a p
319
310
SPir SName a -> pirTypecheck a p
320
311
SData -> pure () -- data is type correct by construction
321
312
SPir {} -> throwingPIR " PIR: Cannot typecheck non-names" ()
0 commit comments