summaryrefslogtreecommitdiff
path: root/src/monoize.sml
diff options
context:
space:
mode:
Diffstat (limited to 'src/monoize.sml')
-rw-r--r--src/monoize.sml38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/monoize.sml b/src/monoize.sml
index 25ea87f5..e6c91abd 100644
--- a/src/monoize.sml
+++ b/src/monoize.sml
@@ -2580,6 +2580,8 @@ fun monoExp (env, st, fm) (all as (e, loc)) =
"octet_length"
else
"length")), loc), fm)
+ | L.ECApp ((L.EFfi ("Basis", "sql_known"), _), _) =>
+ ((L'.EFfi ("Basis", "sql_known"), loc), fm)
| (L.ECApp (
(L.ECApp (
@@ -3738,6 +3740,42 @@ fun monoDecl (env, fm) (all as (d, loc)) =
fm,
[(L'.DTask (e1, e2), loc)])
end
+ | L.DPolicy e =>
+ let
+ fun policies (e, fm) =
+ case #1 e of
+ L.EFfiApp ("Basis", "also", [e1, e2]) =>
+ let
+ val (ps1, fm) = policies (e1, fm)
+ val (ps2, fm) = policies (e2, fm)
+ in
+ (ps1 @ ps2, fm)
+ end
+ | _ =>
+ let
+ val (e, make) =
+ case #1 e of
+ L.EApp ((L.ECApp ((L.ECApp ((L.EFfi ("Basis", "sendClient"), _), _), _), _), _), e) =>
+ (e, L'.PolClient)
+ | L.EApp ((L.ECApp ((L.ECApp ((L.EFfi ("Basis", "mayInsert"), _), _), _), _), _), e) =>
+ (e, L'.PolInsert)
+ | L.EApp ((L.ECApp ((L.ECApp ((L.EFfi ("Basis", "mayDelete"), _), _), _), _), _), e) =>
+ (e, L'.PolDelete)
+ | L.EApp ((L.ECApp ((L.ECApp ((L.EFfi ("Basis", "mayUpdate"), _), _), _), _), _), e) =>
+ (e, L'.PolUpdate)
+ | L.EFfiApp ("Basis", "sendOwnIds", [e]) =>
+ (e, L'.PolSequence)
+ | _ => (poly (); (e, L'.PolClient))
+
+ val (e, fm) = monoExp (env, St.empty, fm) e
+ in
+ ([(L'.DPolicy (make e), loc)], fm)
+ end
+
+ val (ps, fm) = policies (e, fm)
+ in
+ SOME (env, fm, ps)
+ end
end
datatype expungable = Client | Channel