ligo/src/main/compile/of_core.ml

46 lines
2.0 KiB
OCaml
Raw Normal View History

open Main_errors
2019-09-10 15:19:15 +02:00
open Trace
type form =
| Contract of string
| Env
let compile (cform: form) (program : Ast_core.program) : (Ast_typed.program * Typesystem.Solver_types.typer_state , _) result =
let%bind (prog_typed , state) = trace typer_tracer @@ Typer.type_program program in
let () = Typer.Solver.discard_state state in
let%bind applied = trace self_ast_typed_tracer @@
let%bind selfed = Self_ast_typed.all_program prog_typed in
match cform with
| Contract entrypoint -> Self_ast_typed.all_contract entrypoint selfed
| Env -> ok selfed in
ok @@ (applied, state)
2019-09-20 18:56:55 +02:00
let compile_expression ?(env = Ast_typed.Environment.empty) ~(state : Typesystem.Solver_types.typer_state) (e : Ast_core.expression)
: (Ast_typed.expression * Typesystem.Solver_types.typer_state , _) result =
let%bind (ae_typed,state) = trace typer_tracer @@ Typer.type_expression_subst env state e in
let%bind ae_typed' = trace self_ast_typed_tracer @@ Self_ast_typed.all_expression ae_typed in
2020-03-02 19:26:23 +01:00
ok @@ (ae_typed',state)
2019-12-12 11:00:04 +01:00
let apply (entry_point : string) (param : Ast_core.expression) : (Ast_core.expression , _) result =
2020-06-30 19:15:04 +02:00
let name = Location.wrap @@ Var.of_name entry_point in
let entry_point_var : Ast_core.expression =
2020-06-29 13:05:34 +00:00
{ content = Ast_core.E_variable name ;
sugar = None ;
2019-12-11 19:15:25 +01:00
location = Virtual "generated entry-point variable" } in
let applied : Ast_core.expression =
2020-06-29 13:05:34 +00:00
{ content = Ast_core.E_application {lamb=entry_point_var; args=param} ;
sugar = None ;
2019-12-11 19:15:25 +01:00
location = Virtual "generated application" } in
ok applied
let list_declarations (program : Ast_core.program) : string list =
List.fold_left
(fun prev el ->
let open Location in
let open Ast_core in
match el.wrap_content with
2020-06-30 19:15:04 +02:00
| Declaration_constant (var,_,_,_) -> (Var.to_name var.wrap_content)::prev
| _ -> prev)
[] program
let evaluate_type (env : Ast_typed.Environment.t) (t: Ast_core.type_expression) = trace typer_tracer @@ Typer.evaluate_type env t