Module Typedtree
Abstract syntax tree after typing
Extension points
type attribute= Parsetree.attributetype attributes= attribute list
Core language
type pattern={pat_desc : pattern_desc;pat_loc : Location.t;pat_extra : (pat_extra * Location.t * attributes) list;pat_type : Types.type_expr;mutable pat_env : Env.t;pat_attributes : attributes;}and pat_extra=|Tpat_constraint of core_typeP : T
pat_desc = P ; pat_extra = (Tpat_constraint T, _, _) :: ...|Tpat_type of Path.t * Longident.t Asttypes.loc#tconst
pat_desc = disjunction ; pat_extra = (Tpat_type (P, "tconst"), _, _) :: ...where
disjunctionis aTpat_or _representing the branches oftconst.|Tpat_open of Path.t * Longident.t Asttypes.loc * Env.t|Tpat_unpack(module P)
pat_desc = Tpat_var "P" ; pat_extra = (Tpat_unpack, _, _) :: ...and pattern_desc=|Tpat_any_
|Tpat_var of Ident.t * string Asttypes.locx
|Tpat_alias of pattern * Ident.t * string Asttypes.locP as a
|Tpat_constant of Asttypes.constant1, 'a', "true", 1.0, 1l, 1L, 1n
|Tpat_tuple of pattern list(P1, ..., Pn)
Invariant: n >= 2
|Tpat_construct of Longident.t Asttypes.loc * Types.constructor_description * pattern listC
C PPC (P1, ..., Pn)P1; ...; Pn|Tpat_variant of Asttypes.label * pattern option * Types.row_desc Stdlib.ref`A (None) `A P (Some P)
See
Types.row_descfor an explanation of the last parameter.|Tpat_record of (Longident.t Asttypes.loc * Types.label_description * pattern) list * Asttypes.closed_flagl1=P1; ...; ln=Pn(flag = Closed)l1=P1; ...; ln=Pn; _(flag = Open)Invariant: n > 0
|Tpat_array of pattern list| P1; ...; Pn ||Tpat_or of pattern * pattern * Types.row_desc optionP1 | P2
row_desc=Some _when translatingPpat_type _,Noneotherwise.|Tpat_lazy of patternlazy P
|Tpat_exception of patternexception P
and expression={exp_desc : expression_desc;exp_loc : Location.t;exp_extra : (exp_extra * Location.t * attributes) list;exp_type : Types.type_expr;exp_env : Env.t;exp_attributes : attributes;}and exp_extra=|Texp_constraint of core_typeE : T
|Texp_coerce of core_type option * core_typeE :> T
Texp_coerce (None, T)E : T0 :> TTexp_coerce (Some T0, T)|Texp_poly of core_type optionUsed for method bodies.
|Texp_newtype of stringfun (type t) ->
and expression_desc=|Texp_ident of Path.t * Longident.t Asttypes.loc * Types.value_descriptionx M.x
|Texp_constant of Asttypes.constant1, 'a', "true", 1.0, 1l, 1L, 1n
|Texp_let of Asttypes.rec_flag * value_binding list * expressionlet P1 = E1 and ... and Pn = EN in E (flag = Nonrecursive) let rec P1 = E1 and ... and Pn = EN in E (flag = Recursive)
|Texp_function of{arg_label : Asttypes.arg_label;param : Ident.t;cases : case list;partial : partial;}Pexp_funandPexp_functionboth translate toTexp_function. SeeParsetreefor more details.paramis the identifier that is to be used to name the parameter of the function.partial =
Partialif the pattern match is partialTotalotherwise.|Texp_apply of expression * (Asttypes.arg_label * expression option) listE0 ~l1:E1 ... ~ln:En
The expression can be None if the expression is abstracted over this argument. It currently appears when a label is applied.
For example: let f x ~y = x + y in f ~y:3
The resulting typedtree for the application is: Texp_apply (Texp_ident "f/1037",
(Nolabel, None); (Labelled "y", Some (Texp_constant Const_int 3)))|Texp_match of expression * case list * partialmatch E0 with | P1 -> E1 | P2 | exception P3 -> E2 | exception P4 -> E3
Texp_match (E0, [(P1, E1); (P2 | exception P3, E2); (exception P4, E3)], _)|Texp_try of expression * case listtry E with P1 -> E1 | ... | PN -> EN
|Texp_tuple of expression list(E1, ..., EN)
|Texp_construct of Longident.t Asttypes.loc * Types.constructor_description * expression listC
C EEC (E1, ..., En)E1;...;En|Texp_variant of Asttypes.label * expression option|Texp_record of{fields : (Types.label_description * record_label_definition) array;representation : Types.record_representation;extended_expression : expression option;}l1=P1; ...; ln=Pn(extended_expression = None)E0 with l1=P1; ...; ln=Pn(extended_expression = Some E0)Invariant: n > 0
If the type is
l1: t1; l2: t2, the expressionE0 with t2=P2is represented as Texp_recordfields = [| l1, Kept t1; l2 Override P2 |]; representation; extended_expression = Some E0|Texp_field of expression * Longident.t Asttypes.loc * Types.label_description|Texp_setfield of expression * Longident.t Asttypes.loc * Types.label_description * expression|Texp_array of expression list|Texp_ifthenelse of expression * expression * expression option|Texp_sequence of expression * expression|Texp_while of expression * expression|Texp_for of Ident.t * Parsetree.pattern * expression * expression * Asttypes.direction_flag * expression|Texp_send of expression * meth * expression option|Texp_new of Path.t * Longident.t Asttypes.loc * Types.class_declaration|Texp_instvar of Path.t * Path.t * string Asttypes.loc|Texp_setinstvar of Path.t * Path.t * string Asttypes.loc * expression|Texp_override of Path.t * (Path.t * string Asttypes.loc * expression) list|Texp_letmodule of Ident.t * string Asttypes.loc * Types.module_presence * module_expr * expression|Texp_letexception of extension_constructor * expression|Texp_assert of expression|Texp_lazy of expression|Texp_object of class_structure * string list|Texp_pack of module_expr|Texp_letop of{let_ : binding_op;ands : binding_op list;param : Ident.t;body : case;partial : partial;}|Texp_unreachable|Texp_extension_constructor of Longident.t Asttypes.loc * Path.t|Texp_open of open_declaration * expressionlet open
!M in eand meth=|Tmeth_name of string|Tmeth_val of Ident.tand case={c_lhs : pattern;c_guard : expression option;c_rhs : expression;}and record_label_definition=|Kept of Types.type_expr|Overridden of Longident.t Asttypes.loc * expressionand binding_op={bop_op_path : Path.t;bop_op_name : string Asttypes.loc;bop_op_val : Types.value_description;bop_op_type : Types.type_expr;bop_exp : expression;bop_loc : Location.t;}and class_expr={cl_desc : class_expr_desc;cl_loc : Location.t;cl_type : Types.class_type;cl_env : Env.t;cl_attributes : attributes;}and class_expr_desc=|Tcl_ident of Path.t * Longident.t Asttypes.loc * core_type list|Tcl_structure of class_structure|Tcl_fun of Asttypes.arg_label * pattern * (Ident.t * expression) list * class_expr * partial|Tcl_apply of class_expr * (Asttypes.arg_label * expression option) list|Tcl_let of Asttypes.rec_flag * value_binding list * (Ident.t * expression) list * class_expr|Tcl_constraint of class_expr * class_type option * string list * string list * Types.Concr.t|Tcl_open of open_description * class_exprand class_structure={cstr_self : pattern;cstr_fields : class_field list;cstr_type : Types.class_signature;cstr_meths : Ident.t Types.Meths.t;}and class_field={cf_desc : class_field_desc;cf_loc : Location.t;cf_attributes : attributes;}and class_field_kind=|Tcfk_virtual of core_type|Tcfk_concrete of Asttypes.override_flag * expressionand class_field_desc=|Tcf_inherit of Asttypes.override_flag * class_expr * string option * (string * Ident.t) list * (string * Ident.t) list|Tcf_val of string Asttypes.loc * Asttypes.mutable_flag * Ident.t * class_field_kind * bool|Tcf_method of string Asttypes.loc * Asttypes.private_flag * class_field_kind|Tcf_constraint of core_type * core_type|Tcf_initializer of expression|Tcf_attribute of attributeand module_expr={mod_desc : module_expr_desc;mod_loc : Location.t;mod_type : Types.module_type;mod_env : Env.t;mod_attributes : attributes;}and module_type_constraint=|Tmodtype_implicitThe module type constraint has been synthesized during typechecking.
|Tmodtype_explicit of module_typeThe module type was in the source file.
Annotations for
Tmod_constraint.
and module_expr_desc=|Tmod_ident of Path.t * Longident.t Asttypes.loc|Tmod_structure of structure|Tmod_functor of Ident.t * string Asttypes.loc * module_type option * module_expr|Tmod_apply of module_expr * module_expr * module_coercion|Tmod_constraint of module_expr * Types.module_type * module_type_constraint * module_coercionME (constraint = Tmodtype_implicit) (ME : MT) (constraint = Tmodtype_explicit MT)
|Tmod_unpack of expression * Types.module_typeand structure={str_items : structure_item list;str_type : Types.signature;str_final_env : Env.t;}and structure_item={str_desc : structure_item_desc;str_loc : Location.t;str_env : Env.t;}and structure_item_desc=|Tstr_eval of expression * attributes|Tstr_value of Asttypes.rec_flag * value_binding list|Tstr_primitive of value_description|Tstr_type of Asttypes.rec_flag * type_declaration list|Tstr_typext of type_extension|Tstr_exception of type_exception|Tstr_module of module_binding|Tstr_recmodule of module_binding list|Tstr_modtype of module_type_declaration|Tstr_open of open_declaration|Tstr_class of (class_declaration * string list) list|Tstr_class_type of (Ident.t * string Asttypes.loc * class_type_declaration) list|Tstr_include of include_declaration|Tstr_attribute of attributeand module_binding={mb_id : Ident.t;mb_name : string Asttypes.loc;mb_presence : Types.module_presence;mb_expr : module_expr;mb_attributes : attributes;mb_loc : Location.t;}and value_binding={vb_pat : pattern;vb_expr : expression;vb_attributes : attributes;vb_loc : Location.t;}and module_coercion=|Tcoerce_none|Tcoerce_structure of (int * module_coercion) list * (Ident.t * int * module_coercion) list|Tcoerce_functor of module_coercion * module_coercion|Tcoerce_primitive of primitive_coercion|Tcoerce_alias of Env.t * Path.t * module_coercionand module_type={mty_desc : module_type_desc;mty_type : Types.module_type;mty_env : Env.t;mty_loc : Location.t;mty_attributes : attributes;}and module_type_desc=|Tmty_ident of Path.t * Longident.t Asttypes.loc|Tmty_signature of signature|Tmty_functor of Ident.t * string Asttypes.loc * module_type option * module_type|Tmty_with of module_type * (Path.t * Longident.t Asttypes.loc * with_constraint) list|Tmty_typeof of module_expr|Tmty_alias of Path.t * Longident.t Asttypes.locand primitive_coercion={pc_desc : Primitive.description;pc_type : Types.type_expr;pc_env : Env.t;pc_loc : Location.t;}and signature={sig_items : signature_item list;sig_type : Types.signature;sig_final_env : Env.t;}and signature_item={sig_desc : signature_item_desc;sig_env : Env.t;sig_loc : Location.t;}and signature_item_desc=|Tsig_value of value_description|Tsig_type of Asttypes.rec_flag * type_declaration list|Tsig_typesubst of type_declaration list|Tsig_typext of type_extension|Tsig_exception of type_exception|Tsig_module of module_declaration|Tsig_modsubst of module_substitution|Tsig_recmodule of module_declaration list|Tsig_modtype of module_type_declaration|Tsig_open of open_description|Tsig_include of include_description|Tsig_class of class_description list|Tsig_class_type of class_type_declaration list|Tsig_attribute of attributeand module_declaration={md_id : Ident.t;md_name : string Asttypes.loc;md_presence : Types.module_presence;md_type : module_type;md_attributes : attributes;md_loc : Location.t;}and module_substitution={ms_id : Ident.t;ms_name : string Asttypes.loc;ms_manifest : Path.t;ms_txt : Longident.t Asttypes.loc;ms_attributes : attributes;ms_loc : Location.t;}and module_type_declaration={mtd_id : Ident.t;mtd_name : string Asttypes.loc;mtd_type : module_type option;mtd_attributes : attributes;mtd_loc : Location.t;}and 'a open_infos={open_expr : 'a;open_bound_items : Types.signature;open_override : Asttypes.override_flag;open_env : Env.t;open_loc : Location.t;open_attributes : attribute list;}and open_description= (Path.t * Longident.t Asttypes.loc) open_infosand open_declaration= module_expr open_infosand 'a include_infos={incl_mod : 'a;incl_type : Types.signature;incl_loc : Location.t;incl_attributes : attribute list;}and include_description= module_type include_infosand include_declaration= module_expr include_infosand with_constraint=|Twith_type of type_declaration|Twith_module of Path.t * Longident.t Asttypes.loc|Twith_typesubst of type_declaration|Twith_modsubst of Path.t * Longident.t Asttypes.locand core_type={mutable ctyp_desc : core_type_desc;mutable because of
Typeclass.declare_methodmutable ctyp_type : Types.type_expr;mutable because of
Typeclass.declare_methodctyp_env : Env.t;ctyp_loc : Location.t;ctyp_attributes : attributes;}and core_type_desc=|Ttyp_any|Ttyp_var of string|Ttyp_arrow of Asttypes.arg_label * core_type * core_type|Ttyp_tuple of core_type list|Ttyp_constr of Path.t * Longident.t Asttypes.loc * core_type list|Ttyp_object of object_field list * Asttypes.closed_flag|Ttyp_class of Path.t * Longident.t Asttypes.loc * core_type list|Ttyp_alias of core_type * string|Ttyp_variant of row_field list * Asttypes.closed_flag * Asttypes.label list option|Ttyp_poly of string list * core_type|Ttyp_package of package_typeand package_type={pack_path : Path.t;pack_fields : (Longident.t Asttypes.loc * core_type) list;pack_type : Types.module_type;pack_txt : Longident.t Asttypes.loc;}and row_field={rf_desc : row_field_desc;rf_loc : Location.t;rf_attributes : attributes;}and row_field_desc=|Ttag of string Asttypes.loc * bool * core_type list|Tinherit of core_typeand object_field={of_desc : object_field_desc;of_loc : Location.t;of_attributes : attributes;}and object_field_desc=|OTtag of string Asttypes.loc * core_type|OTinherit of core_typeand value_description={val_id : Ident.t;val_name : string Asttypes.loc;val_desc : core_type;val_val : Types.value_description;val_prim : string list;val_loc : Location.t;val_attributes : attributes;}and type_declaration={typ_id : Ident.t;typ_name : string Asttypes.loc;typ_params : (core_type * Asttypes.variance) list;typ_type : Types.type_declaration;typ_cstrs : (core_type * core_type * Location.t) list;typ_kind : type_kind;typ_private : Asttypes.private_flag;typ_manifest : core_type option;typ_loc : Location.t;typ_attributes : attributes;}and type_kind=|Ttype_abstract|Ttype_variant of constructor_declaration list|Ttype_record of label_declaration list|Ttype_openand label_declaration={ld_id : Ident.t;ld_name : string Asttypes.loc;ld_mutable : Asttypes.mutable_flag;ld_type : core_type;ld_loc : Location.t;ld_attributes : attributes;}and constructor_declaration={cd_id : Ident.t;cd_name : string Asttypes.loc;cd_args : constructor_arguments;cd_res : core_type option;cd_loc : Location.t;cd_attributes : attributes;}and constructor_arguments=|Cstr_tuple of core_type list|Cstr_record of label_declaration listand type_extension={tyext_path : Path.t;tyext_txt : Longident.t Asttypes.loc;tyext_params : (core_type * Asttypes.variance) list;tyext_constructors : extension_constructor list;tyext_private : Asttypes.private_flag;tyext_loc : Location.t;tyext_attributes : attributes;}and type_exception={tyexn_constructor : extension_constructor;tyexn_loc : Location.t;tyexn_attributes : attribute list;}and extension_constructor={ext_id : Ident.t;ext_name : string Asttypes.loc;ext_type : Types.extension_constructor;ext_kind : extension_constructor_kind;ext_loc : Location.t;ext_attributes : attributes;}and extension_constructor_kind=|Text_decl of constructor_arguments * core_type option|Text_rebind of Path.t * Longident.t Asttypes.locand class_type={cltyp_desc : class_type_desc;cltyp_type : Types.class_type;cltyp_env : Env.t;cltyp_loc : Location.t;cltyp_attributes : attributes;}and class_type_desc=|Tcty_constr of Path.t * Longident.t Asttypes.loc * core_type list|Tcty_signature of class_signature|Tcty_arrow of Asttypes.arg_label * core_type * class_type|Tcty_open of open_description * class_typeand class_signature={csig_self : core_type;csig_fields : class_type_field list;csig_type : Types.class_signature;}and class_type_field={ctf_desc : class_type_field_desc;ctf_loc : Location.t;ctf_attributes : attributes;}and class_type_field_desc=|Tctf_inherit of class_type|Tctf_val of string * Asttypes.mutable_flag * Asttypes.virtual_flag * core_type|Tctf_method of string * Asttypes.private_flag * Asttypes.virtual_flag * core_type|Tctf_constraint of core_type * core_type|Tctf_attribute of attributeand class_declaration= class_expr class_infosand class_description= class_type class_infosand class_type_declaration= class_type class_infosand 'a class_infos={ci_virt : Asttypes.virtual_flag;ci_params : (core_type * Asttypes.variance) list;ci_id_name : string Asttypes.loc;ci_id_class : Ident.t;ci_id_class_type : Ident.t;ci_id_object : Ident.t;ci_id_typehash : Ident.t;ci_expr : 'a;ci_decl : Types.class_declaration;ci_type_decl : Types.class_type_declaration;ci_loc : Location.t;ci_attributes : attributes;}
val iter_pattern_desc : (pattern -> unit) -> pattern_desc -> unitval map_pattern_desc : (pattern -> pattern) -> pattern_desc -> pattern_descval let_bound_idents : value_binding list -> Ident.t listval rev_let_bound_idents : value_binding list -> Ident.t listval let_bound_idents_with_loc : value_binding list -> (Ident.t * string Asttypes.loc * Types.type_expr) listval alpha_pat : (Ident.t * Ident.t) list -> pattern -> patternAlpha conversion of patterns
val mknoloc : 'a -> 'a Asttypes.locval mkloc : 'a -> Location.t -> 'a Asttypes.locval pat_bound_idents : pattern -> Ident.t listval pat_bound_idents_full : pattern -> (Ident.t * string Asttypes.loc * Types.type_expr) listval split_pattern : pattern -> pattern option * pattern optionSplits an or pattern into its value (left) and exception (right) parts.