Module Typing.Typed_ast

type identifier =
| Variable of Ast.Ast_types.type_expr * Ast.Ast_types.Var_name.t
| ObjField of Ast.Ast_types.Class_name.t * Ast.Ast_types.type_expr option * Ast.Ast_types.Var_name.t * Ast.Ast_types.type_expr * Ast.Ast_types.Field_name.t

class of the object and whether parameterised, type of field

val string_of_id : identifier -> string
type expr =
| Integer of Ast.Ast_types.loc * int

no need for type_expr annotation as obviously TEInt

| Boolean of Ast.Ast_types.loc * bool

no need for type_expr annotation as obviously TEBool

| Identifier of Ast.Ast_types.loc * identifier

Type information associated with identifier

| BlockExpr of Ast.Ast_types.loc * block_expr

used to interconvert with block expr

| Constructor of Ast.Ast_types.loc * Ast.Ast_types.Class_name.t * Ast.Ast_types.type_expr option * constructor_arg list

The type of the object created can be inferred from class name and any type param

| Let of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.Var_name.t * expr
| Assign of Ast.Ast_types.loc * Ast.Ast_types.type_expr * identifier * expr
| Consume of Ast.Ast_types.loc * identifier

Type is associated with the identifier

| MethodApp of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.type_expr list * Ast.Ast_types.Var_name.t * Ast.Ast_types.Class_name.t * Ast.Ast_types.type_expr option * Ast.Ast_types.Method_name.t * expr list
| FunctionApp of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.type_expr list * Ast.Ast_types.Function_name.t * expr list
| Printf of Ast.Ast_types.loc * string * expr list

no need for type_expr annotation as obviously TEVoid

| FinishAsync of Ast.Ast_types.loc * Ast.Ast_types.type_expr * async_expr list * block_expr

overall type is that of the expr on the current thread - since forked exprs' values are ignored

| If of Ast.Ast_types.loc * Ast.Ast_types.type_expr * expr * block_expr * block_expr

If ___ then ___ else ___ - type is that of the branch exprs

| While of Ast.Ast_types.loc * expr * block_expr

While ___ do ___ ; - no need for type_expr annotation as type of a loop is TEVoid

| BinOp of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.bin_op * expr * expr
| UnOp of Ast.Ast_types.loc * Ast.Ast_types.type_expr * Ast.Ast_types.un_op * expr

Similar to Parsed AST, only we add an extra type_expr annotation to denote the overall type of the expression. For loop is desugared to while loop

and block_expr =
| Block of Ast.Ast_types.loc * Ast.Ast_types.type_expr * expr list

type is of the final expr in block

and async_expr =
| AsyncExpr of block_expr
and constructor_arg =
| ConstructorArg of Ast.Ast_types.type_expr * Ast.Ast_types.Field_name.t * expr

Constructor arg consists of a field and the expression being assigned to it (annotated with the type of the expression)

type function_defn =
| TFunction of Ast.Ast_types.Function_name.t * Ast.Ast_types.borrowed_ref option * Ast.Ast_types.type_expr * Ast.Ast_types.param list * block_expr

Function defn consists of the function name, return type (and whether it returns a borrowed ref), the list of params, and the body expr of the function

type method_defn =
| TMethod of Ast.Ast_types.Method_name.t * Ast.Ast_types.borrowed_ref option * Ast.Ast_types.type_expr * Ast.Ast_types.param list * Ast.Ast_types.capability list * block_expr

Method defn consists the method name, return type (and whether it returns a borrowed ref), the list of params, the capabilities used and the body expr of the function

type class_defn =
| TClass of Ast.Ast_types.Class_name.t * Ast.Ast_types.generic_type option * Ast.Ast_types.Class_name.t option * Ast.Ast_types.capability list * Ast.Ast_types.field_defn list * method_defn list

Class definitions consist of the class name and optionally specifying if generic and if it inherits from another class, its capabilities and the fields and methods in the class

type program =
| Prog of class_defn list * function_defn list * block_expr

Each bolt program defines the classes,followed by functions, followed by the main expression to execute.