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.tclass of the object and whether parameterised, type of field
val string_of_id : identifier -> string
type expr=|Integer of Ast.Ast_types.loc * intno need for type_expr annotation as obviously TEInt
|Boolean of Ast.Ast_types.loc * boolno need for type_expr annotation as obviously TEBool
|Identifier of Ast.Ast_types.loc * identifierType information associated with identifier
|BlockExpr of Ast.Ast_types.loc * block_exprused 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 listThe 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 * identifierType 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 listno need for type_expr annotation as obviously TEVoid
|FinishAsync of Ast.Ast_types.loc * Ast.Ast_types.type_expr * async_expr list * block_exproverall 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_exprIf ___ then ___ else ___ - type is that of the branch exprs
|While of Ast.Ast_types.loc * expr * block_exprWhile ___ 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 * exprSimilar 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 listtype is of the final expr in block
and async_expr=|AsyncExpr of block_exprand constructor_arg=|ConstructorArg of Ast.Ast_types.type_expr * Ast.Ast_types.Field_name.t * exprConstructor 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_exprFunction 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_exprMethod 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 listClass 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_exprEach bolt program defines the classes,followed by functions, followed by the main expression to execute.