102 lines
3.2 KiB
OCaml
Raw Normal View History

open Errors
2020-03-12 23:20:39 +01:00
open Ast_imperative
2019-09-24 13:54:34 +02:00
open Trace
open Proto_alpha_utils
2019-09-24 13:54:34 +02:00
let peephole_expression : expression -> (expression , self_ast_imperative_error) result = fun e ->
2019-12-04 18:30:52 +01:00
let return expression_content = ok { e with expression_content } in
match e.expression_content with
2020-01-06 22:52:30 +01:00
| E_literal (Literal_key_hash s) as l -> (
let open Tezos_crypto in
let%bind (_pkh:Crypto.Signature.public_key_hash) =
Trace.trace_tzresult (bad_format e) @@
Signature.Public_key_hash.of_b58check s in
return l
)
2020-01-02 15:11:02 +01:00
| E_literal (Literal_address s) as l -> (
let open Memory_proto_alpha in
let%bind (_contract:Protocol.Alpha_context.Contract.t) =
2020-01-06 22:52:30 +01:00
Trace.trace_alpha_tzresult (bad_format e) @@
Protocol.Alpha_context.Contract.of_b58check s in
2020-01-02 15:11:02 +01:00
return l
)
2020-01-13 11:37:10 +01:00
| E_literal (Literal_signature s) as l -> (
let open Tezos_crypto in
let%bind (_sig:Crypto.Signature.t) =
Trace.trace_tzresult (bad_format e) @@
Signature.of_b58check s in
return l
)
| E_literal (Literal_key s) as l -> (
let open Tezos_crypto in
let%bind (_k:Crypto.Signature.public_key) =
Trace.trace_tzresult (bad_format e) @@
Signature.Public_key.of_b58check s in
return l
)
2019-12-04 18:30:52 +01:00
| E_constant {cons_name=C_BIG_MAP_LITERAL as cst; arguments=lst} -> (
let%bind elt =
trace_option (bad_single_arity cst e) @@
List.to_singleton lst
in
let%bind lst =
trace_option (bad_map_param_type cst e) @@
2019-12-04 18:30:52 +01:00
get_e_list elt.expression_content
in
2019-12-04 18:30:52 +01:00
let aux = fun (e : expression) ->
trace_option (bad_map_param_type cst e) @@
Option.(get_e_tuple e.expression_content >>= fun t ->
List.to_pair t)
in
let%bind pairs = bind_map_list aux lst in
return @@ E_big_map pairs
)
2019-12-04 18:30:52 +01:00
| E_constant {cons_name=C_MAP_LITERAL as cst; arguments=lst} -> (
2019-09-24 13:54:34 +02:00
let%bind elt =
trace_option (bad_single_arity cst e) @@
2019-09-24 13:54:34 +02:00
List.to_singleton lst
in
let%bind lst =
trace_option (bad_map_param_type cst e) @@
2019-12-04 18:30:52 +01:00
get_e_list elt.expression_content
2019-09-24 13:54:34 +02:00
in
2019-12-04 18:30:52 +01:00
let aux = fun (e : expression) ->
trace_option (bad_map_param_type cst e) @@
Option.(get_e_tuple e.expression_content >>= fun t ->
List.to_pair t)
2019-09-24 13:54:34 +02:00
in
let%bind pairs = bind_map_list aux lst in
return @@ E_map pairs
)
2019-12-04 18:30:52 +01:00
| E_constant {cons_name=C_BIG_MAP_EMPTY as cst; arguments=lst} -> (
let%bind () =
Assert.assert_list_empty (bad_empty_arity cst e) lst
in
return @@ E_big_map []
)
2019-12-04 18:30:52 +01:00
| E_constant {cons_name=C_MAP_EMPTY as cst; arguments=lst} -> (
2019-09-24 13:54:34 +02:00
let%bind () =
Assert.assert_list_empty (bad_empty_arity cst e) lst
2019-09-24 13:54:34 +02:00
in
return @@ E_map []
)
2019-12-04 18:30:52 +01:00
| E_constant {cons_name=C_SET_LITERAL as cst; arguments=lst} -> (
2019-09-24 14:00:43 +02:00
let%bind elt =
trace_option (bad_single_arity cst e) @@
2019-09-24 14:00:43 +02:00
List.to_singleton lst
in
let%bind lst =
trace_option (bad_set_param_type cst e) @@
2019-12-04 18:30:52 +01:00
get_e_list elt.expression_content
2019-09-24 14:00:43 +02:00
in
return @@ E_set lst
)
2019-12-04 18:30:52 +01:00
| E_constant {cons_name=C_SET_EMPTY as cst; arguments=lst} -> (
2019-09-24 14:00:43 +02:00
let%bind () =
Assert.assert_list_empty (bad_empty_arity cst e) lst
2019-09-24 14:00:43 +02:00
in
return @@ E_set []
)
2019-09-24 13:54:34 +02:00
| e -> return e