(**************************************************************************) (* *) (* OCaml *) (* *) (* Fabrice Le Fessant, INRIA Saclay *) (* *) (* Copyright 1999 Institut National de Recherche en Informatique et *) (* en Automatique. *) (* *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Lesser General Public License version 2.1, with the *) (* special exception on linking described in the file LICENSE. *) (* *) (**************************************************************************) open Asttypes;; open Format;; open Lexing;; open Location;; open Typedtree;; let fmt_position f l = if l.pos_lnum = -1 then fprintf f "%s[%d]" l.pos_fname l.pos_cnum else fprintf f "%s[%d,%d+%d]" l.pos_fname l.pos_lnum l.pos_bol (l.pos_cnum - l.pos_bol) ;; let fmt_location f loc = if not !Clflags.locations then () else begin fprintf f "(%a..%a)" fmt_position loc.loc_start fmt_position loc.loc_end; if loc.loc_ghost then fprintf f " ghost"; end ;; let rec fmt_longident_aux f x = match x with | Longident.Lident (s) -> fprintf f "%s" s; | Longident.Ldot (y, s) -> fprintf f "%a.%s" fmt_longident_aux y s; | Longident.Lapply (y, z) -> fprintf f "%a(%a)" fmt_longident_aux y fmt_longident_aux z; ;; let fmt_longident f x = fprintf f "\"%a\"" fmt_longident_aux x.txt;; let fmt_ident = Ident.print let fmt_modname f = function | None -> fprintf f "_"; | Some id -> Ident.print f id let rec fmt_path_aux f x = match x with | Path.Pident (s) -> fprintf f "%a" fmt_ident s; | Path.Pdot (y, s) -> fprintf f "%a.%s" fmt_path_aux y s; | Path.Papply (y, z) -> fprintf f "%a(%a)" fmt_path_aux y fmt_path_aux z; ;; let fmt_path f x = fprintf f "\"%a\"" fmt_path_aux x;; let fmt_constant f x = match x with | Const_int (i) -> fprintf f "Const_int %d" i; | Const_char (c) -> fprintf f "Const_char %02x" (Char.code c); | Const_string (s, strloc, None) -> fprintf f "Const_string(%S,%a,None)" s fmt_location strloc; | Const_string (s, strloc, Some delim) -> fprintf f "Const_string (%S,%a,Some %S)" s fmt_location strloc delim; | Const_float (s) -> fprintf f "Const_float %s" s; | Const_int32 (i) -> fprintf f "Const_int32 %ld" i; | Const_int64 (i) -> fprintf f "Const_int64 %Ld" i; | Const_nativeint (i) -> fprintf f "Const_nativeint %nd" i; ;; let fmt_mutable_flag f x = match x with | Immutable -> fprintf f "Immutable"; | Mutable -> fprintf f "Mutable"; ;; let fmt_virtual_flag f x = match x with | Virtual -> fprintf f "Virtual"; | Concrete -> fprintf f "Concrete"; ;; let fmt_override_flag f x = match x with | Override -> fprintf f "Override"; | Fresh -> fprintf f "Fresh"; ;; let fmt_closed_flag f x = match x with | Closed -> fprintf f "Closed" | Open -> fprintf f "Open" let fmt_rec_flag f x = match x with | Nonrecursive -> fprintf f "Nonrec"; | Recursive -> fprintf f "Rec"; ;; let fmt_direction_flag f x = match x with | Upto -> fprintf f "Up"; | Downto -> fprintf f "Down"; ;; let fmt_private_flag f x = match x with | Public -> fprintf f "Public"; | Private -> fprintf f "Private"; ;; let line i f s (*...*) = fprintf f "%s" (String.make (2*i) ' '); fprintf f s (*...*) ;; let list i f ppf l = match l with | [] -> line i ppf "[]\n"; | _ :: _ -> line i ppf "[\n"; List.iter (f (i+1) ppf) l; line i ppf "]\n"; ;; let array i f ppf a = if Array.length a = 0 then line i ppf "[]\n" else begin line i ppf "[\n"; Array.iter (f (i+1) ppf) a; line i ppf "]\n" end ;; let option i f ppf x = match x with | None -> line i ppf "None\n"; | Some x -> line i ppf "Some\n"; f (i+1) ppf x; ;; let longident i ppf li = line i ppf "%a\n" fmt_longident li;; let string i ppf s = line i ppf "\"%s\"\n" s;; let arg_label i ppf = function | Nolabel -> line i ppf "Nolabel\n" | Optional s -> line i ppf "Optional \"%s\"\n" s | Labelled s -> line i ppf "Labelled \"%s\"\n" s ;; let record_representation i ppf = let open Types in function | Record_regular -> line i ppf "Record_regular\n" | Record_float -> line i ppf "Record_float\n" | Record_unboxed b -> line i ppf "Record_unboxed %b\n" b | Record_inlined i -> line i ppf "Record_inlined %d\n" i | Record_extension p -> line i ppf "Record_extension %a\n" fmt_path p let attribute i ppf k a = line i ppf "%s \"%s\"\n" k a.Parsetree.attr_name.txt; Printast.payload i ppf a.Parsetree.attr_payload let attributes i ppf l = let i = i + 1 in List.iter (fun a -> line i ppf "attribute \"%s\"\n" a.Parsetree.attr_name.txt; Printast.payload (i + 1) ppf a.Parsetree.attr_payload ) l let rec core_type i ppf x = line i ppf "core_type %a\n" fmt_location x.ctyp_loc; attributes i ppf x.ctyp_attributes; let i = i+1 in match x.ctyp_desc with | Ttyp_any -> line i ppf "Ttyp_any\n"; | Ttyp_var (s) -> line i ppf "Ttyp_var %s\n" s; | Ttyp_arrow (l, ct1, ct2) -> line i ppf "Ttyp_arrow\n"; arg_label i ppf l; core_type i ppf ct1; core_type i ppf ct2; | Ttyp_tuple l -> line i ppf "Ttyp_tuple\n"; list i core_type ppf l; | Ttyp_constr (li, _, l) -> line i ppf "Ttyp_constr %a\n" fmt_path li; list i core_type ppf l; | Ttyp_variant (l, closed, low) -> line i ppf "Ttyp_variant closed=%a\n" fmt_closed_flag closed; list i label_x_bool_x_core_type_list ppf l; option i (fun i -> list i string) ppf low | Ttyp_object (l, c) -> line i ppf "Ttyp_object %a\n" fmt_closed_flag c; let i = i + 1 in List.iter (fun {of_desc; of_attributes; _} -> match of_desc with | OTtag (s, t) -> line i ppf "method %s\n" s.txt; attributes i ppf of_attributes; core_type (i + 1) ppf t | OTinherit ct -> line i ppf "OTinherit\n"; core_type (i + 1) ppf ct ) l | Ttyp_class (li, _, l) -> line i ppf "Ttyp_class %a\n" fmt_path li; list i core_type ppf l; | Ttyp_alias (ct, s) -> line i ppf "Ttyp_alias \"%s\"\n" s; core_type i ppf ct; | Ttyp_poly (sl, ct) -> line i ppf "Ttyp_poly%a\n" (fun ppf -> List.iter (fun x -> fprintf ppf " '%s" x)) sl; core_type i ppf ct; | Ttyp_package { pack_path = s; pack_fields = l } -> line i ppf "Ttyp_package %a\n" fmt_path s; list i package_with ppf l; and package_with i ppf (s, t) = line i ppf "with type %a\n" fmt_longident s; core_type i ppf t and pattern : type k . _ -> _ -> k general_pattern -> unit = fun i ppf x -> line i ppf "pattern %a\n" fmt_location x.pat_loc; attributes i ppf x.pat_attributes; let i = i+1 in match x.pat_extra with | extra :: rem -> pattern_extra i ppf extra; pattern i ppf { x with pat_extra = rem } | [] -> match x.pat_desc with | Tpat_any -> line i ppf "Tpat_any\n"; | Tpat_var (s,_) -> line i ppf "Tpat_var \"%a\"\n" fmt_ident s; | Tpat_alias (p, s,_) -> line i ppf "Tpat_alias \"%a\"\n" fmt_ident s; pattern i ppf p; | Tpat_constant (c) -> line i ppf "Tpat_constant %a\n" fmt_constant c; | Tpat_tuple (l) -> line i ppf "Tpat_tuple\n"; list i pattern ppf l; | Tpat_construct (li, _, po) -> line i ppf "Tpat_construct %a\n" fmt_longident li; list i pattern ppf po; | Tpat_variant (l, po, _) -> line i ppf "Tpat_variant \"%s\"\n" l; option i pattern ppf po; | Tpat_record (l, _c) -> line i ppf "Tpat_record\n"; list i longident_x_pattern ppf l; | Tpat_array (l) -> line i ppf "Tpat_array\n"; list i pattern ppf l; | Tpat_lazy p -> line i ppf "Tpat_lazy\n"; pattern i ppf p; | Tpat_exception p -> line i ppf "Tpat_exception\n"; pattern i ppf p; | Tpat_value p -> line i ppf "Tpat_value\n"; pattern i ppf (p :> pattern); | Tpat_or (p1, p2, _) -> line i ppf "Tpat_or\n"; pattern i ppf p1; pattern i ppf p2; and pattern_extra i ppf (extra_pat, _, attrs) = match extra_pat with | Tpat_unpack -> line i ppf "Tpat_extra_unpack\n"; attributes i ppf attrs; | Tpat_constraint cty -> line i ppf "Tpat_extra_constraint\n"; attributes i ppf attrs; core_type i ppf cty; | Tpat_type (id, _) -> line i ppf "Tpat_extra_type %a\n" fmt_path id; attributes i ppf attrs; | Tpat_open (id,_,_) -> line i ppf "Tpat_extra_open \"%a\"\n" fmt_path id; attributes i ppf attrs; and expression_extra i ppf x attrs = match x with | Texp_constraint ct -> line i ppf "Texp_constraint\n"; attributes i ppf attrs; core_type i ppf ct; | Texp_coerce (cto1, cto2) -> line i ppf "Texp_coerce\n"; attributes i ppf attrs; option i core_type ppf cto1; core_type i ppf cto2; | Texp_poly cto -> line i ppf "Texp_poly\n"; attributes i ppf attrs; option i core_type ppf cto; | Texp_newtype s -> line i ppf "Texp_newtype \"%s\"\n" s; attributes i ppf attrs; and expression i ppf x = line i ppf "expression %a\n" fmt_location x.exp_loc; attributes i ppf x.exp_attributes; let i = List.fold_left (fun i (extra,_,attrs) -> expression_extra i ppf extra attrs; i+1) (i+1) x.exp_extra in match x.exp_desc with | Texp_ident (li,_,_) -> line i ppf "Texp_ident %a\n" fmt_path li; | Texp_instvar (_, li,_) -> line i ppf "Texp_instvar %a\n" fmt_path li; | Texp_constant (c) -> line i ppf "Texp_constant %a\n" fmt_constant c; | Texp_let (rf, l, e) -> line i ppf "Texp_let %a\n" fmt_rec_flag rf; list i value_binding ppf l; expression i ppf e; | Texp_function { arg_label = p; param = _; cases; partial = _; } -> line i ppf "Texp_function\n"; arg_label i ppf p; list i case ppf cases; | Texp_apply (e, l) -> line i ppf "Texp_apply\n"; expression i ppf e; list i label_x_expression ppf l; | Texp_match (e, l, _partial) -> line i ppf "Texp_match\n"; expression i ppf e; list i case ppf l; | Texp_try (e, l) -> line i ppf "Texp_try\n"; expression i ppf e; list i case ppf l; | Texp_tuple (l) -> line i ppf "Texp_tuple\n"; list i expression ppf l; | Texp_construct (li, _, eo) -> line i ppf "Texp_construct %a\n" fmt_longident li; list i expression ppf eo; | Texp_variant (l, eo) -> line i ppf "Texp_variant \"%s\"\n" l; option i expression ppf eo; | Texp_record { fields; representation; extended_expression } -> line i ppf "Texp_record\n"; let i = i+1 in line i ppf "fields =\n"; array (i+1) record_field ppf fields; line i ppf "representation =\n"; record_representation (i+1) ppf representation; line i ppf "extended_expression =\n"; option (i+1) expression ppf extended_expression; | Texp_field (e, li, _) -> line i ppf "Texp_field\n"; expression i ppf e; longident i ppf li; | Texp_setfield (e1, li, _, e2) -> line i ppf "Texp_setfield\n"; expression i ppf e1; longident i ppf li; expression i ppf e2; | Texp_array (l) -> line i ppf "Texp_array\n"; list i expression ppf l; | Texp_ifthenelse (e1, e2, eo) -> line i ppf "Texp_ifthenelse\n"; expression i ppf e1; expression i ppf e2; option i expression ppf eo; | Texp_sequence (e1, e2) -> line i ppf "Texp_sequence\n"; expression i ppf e1; expression i ppf e2; | Texp_while (e1, e2) -> line i ppf "Texp_while\n"; expression i ppf e1; expression i ppf e2; | Texp_for (s, _, e1, e2, df, e3) -> line i ppf "Texp_for \"%a\" %a\n" fmt_ident s fmt_direction_flag df; expression i ppf e1; expression i ppf e2; expression i ppf e3; | Texp_send (e, Tmeth_name s, eo) -> line i ppf "Texp_send \"%s\"\n" s; expression i ppf e; option i expression ppf eo | Texp_send (e, Tmeth_val s, eo) -> line i ppf "Texp_send \"%a\"\n" fmt_ident s; expression i ppf e; option i expression ppf eo | Texp_new (li, _, _) -> line i ppf "Texp_new %a\n" fmt_path li; | Texp_setinstvar (_, s, _, e) -> line i ppf "Texp_setinstvar \"%a\"\n" fmt_path s; expression i ppf e; | Texp_override (_, l) -> line i ppf "Texp_override\n"; list i string_x_expression ppf l; | Texp_letmodule (s, _, _, me, e) -> line i ppf "Texp_letmodule \"%a\"\n" fmt_modname s; module_expr i ppf me; expression i ppf e; | Texp_letexception (cd, e) -> line i ppf "Texp_letexception\n"; extension_constructor i ppf cd; expression i ppf e; | Texp_assert (e) -> line i ppf "Texp_assert"; expression i ppf e; | Texp_lazy (e) -> line i ppf "Texp_lazy"; expression i ppf e; | Texp_object (s, _) -> line i ppf "Texp_object"; class_structure i ppf s | Texp_pack me -> line i ppf "Texp_pack"; module_expr i ppf me | Texp_letop {let_; ands; param = _; body; partial = _} -> line i ppf "Texp_letop"; binding_op (i+1) ppf let_; list (i+1) binding_op ppf ands; case i ppf body | Texp_unreachable -> line i ppf "Texp_unreachable" | Texp_extension_constructor (li, _) -> line i ppf "Texp_extension_constructor %a" fmt_longident li | Texp_open (o, e) -> line i ppf "Texp_open %a\n" fmt_override_flag o.open_override; module_expr i ppf o.open_expr; attributes i ppf o.open_attributes; expression i ppf e; and value_description i ppf x = line i ppf "value_description %a %a\n" fmt_ident x.val_id fmt_location x.val_loc; attributes i ppf x.val_attributes; core_type (i+1) ppf x.val_desc; list (i+1) string ppf x.val_prim; and binding_op i ppf x = line i ppf "binding_op %a %a\n" fmt_path x.bop_op_path fmt_location x.bop_loc; expression i ppf x.bop_exp and type_parameter i ppf (x, _variance) = core_type i ppf x and type_declaration i ppf x = line i ppf "type_declaration %a %a\n" fmt_ident x.typ_id fmt_location x.typ_loc; attributes i ppf x.typ_attributes; let i = i+1 in line i ppf "ptype_params =\n"; list (i+1) type_parameter ppf x.typ_params; line i ppf "ptype_cstrs =\n"; list (i+1) core_type_x_core_type_x_location ppf x.typ_cstrs; line i ppf "ptype_kind =\n"; type_kind (i+1) ppf x.typ_kind; line i ppf "ptype_private = %a\n" fmt_private_flag x.typ_private; line i ppf "ptype_manifest =\n"; option (i+1) core_type ppf x.typ_manifest; and type_kind i ppf x = match x with | Ttype_abstract -> line i ppf "Ttype_abstract\n" | Ttype_variant l -> line i ppf "Ttype_variant\n"; list (i+1) constructor_decl ppf l; | Ttype_record l -> line i ppf "Ttype_record\n"; list (i+1) label_decl ppf l; | Ttype_open -> line i ppf "Ttype_open\n" and type_extension i ppf x = line i ppf "type_extension\n"; attributes i ppf x.tyext_attributes; let i = i+1 in line i ppf "ptyext_path = %a\n" fmt_path x.tyext_path; line i ppf "ptyext_params =\n"; list (i+1) type_parameter ppf x.tyext_params; line i ppf "ptyext_constructors =\n"; list (i+1) extension_constructor ppf x.tyext_constructors; line i ppf "ptyext_private = %a\n" fmt_private_flag x.tyext_private; and type_exception i ppf x = line i ppf "type_exception\n"; attributes i ppf x.tyexn_attributes; let i = i+1 in line i ppf "ptyext_constructor =\n"; let i = i+1 in extension_constructor i ppf x.tyexn_constructor and extension_constructor i ppf x = line i ppf "extension_constructor %a\n" fmt_location x.ext_loc; attributes i ppf x.ext_attributes; let i = i + 1 in line i ppf "pext_name = \"%a\"\n" fmt_ident x.ext_id; line i ppf "pext_kind =\n"; extension_constructor_kind (i + 1) ppf x.ext_kind; and extension_constructor_kind i ppf x = match x with Text_decl(a, r) -> line i ppf "Text_decl\n"; constructor_arguments (i+1) ppf a; option (i+1) core_type ppf r; | Text_rebind(p, _) -> line i ppf "Text_rebind\n"; line (i+1) ppf "%a\n" fmt_path p; and class_type i ppf x = line i ppf "class_type %a\n" fmt_location x.cltyp_loc; attributes i ppf x.cltyp_attributes; let i = i+1 in match x.cltyp_desc with | Tcty_constr (li, _, l) -> line i ppf "Tcty_constr %a\n" fmt_path li; list i core_type ppf l; | Tcty_signature (cs) -> line i ppf "Tcty_signature\n"; class_signature i ppf cs; | Tcty_arrow (l, co, cl) -> line i ppf "Tcty_arrow\n"; arg_label i ppf l; core_type i ppf co; class_type i ppf cl; | Tcty_open (o, e) -> line i ppf "Tcty_open %a %a\n" fmt_override_flag o.open_override fmt_path (fst o.open_expr); class_type i ppf e and class_signature i ppf { csig_self = ct; csig_fields = l } = line i ppf "class_signature\n"; core_type (i+1) ppf ct; list (i+1) class_type_field ppf l; and class_type_field i ppf x = line i ppf "class_type_field %a\n" fmt_location x.ctf_loc; let i = i+1 in attributes i ppf x.ctf_attributes; match x.ctf_desc with | Tctf_inherit (ct) -> line i ppf "Tctf_inherit\n"; class_type i ppf ct; | Tctf_val (s, mf, vf, ct) -> line i ppf "Tctf_val \"%s\" %a %a\n" s fmt_mutable_flag mf fmt_virtual_flag vf; core_type (i+1) ppf ct; | Tctf_method (s, pf, vf, ct) -> line i ppf "Tctf_method \"%s\" %a %a\n" s fmt_private_flag pf fmt_virtual_flag vf; core_type (i+1) ppf ct; | Tctf_constraint (ct1, ct2) -> line i ppf "Tctf_constraint\n"; core_type (i+1) ppf ct1; core_type (i+1) ppf ct2; | Tctf_attribute a -> attribute i ppf "Tctf_attribute" a and class_description i ppf x = line i ppf "class_description %a\n" fmt_location x.ci_loc; attributes i ppf x.ci_attributes; let i = i+1 in line i ppf "pci_virt = %a\n" fmt_virtual_flag x.ci_virt; line i ppf "pci_params =\n"; list (i+1) type_parameter ppf x.ci_params; line i ppf "pci_name = \"%s\"\n" x.ci_id_name.txt; line i ppf "pci_expr =\n"; class_type (i+1) ppf x.ci_expr; and class_type_declaration i ppf x = line i ppf "class_type_declaration %a\n" fmt_location x.ci_loc; let i = i+1 in line i ppf "pci_virt = %a\n" fmt_virtual_flag x.ci_virt; line i ppf "pci_params =\n"; list (i+1) type_parameter ppf x.ci_params; line i ppf "pci_name = \"%s\"\n" x.ci_id_name.txt; line i ppf "pci_expr =\n"; class_type (i+1) ppf x.ci_expr; and class_expr i ppf x = line i ppf "class_expr %a\n" fmt_location x.cl_loc; attributes i ppf x.cl_attributes; let i = i+1 in match x.cl_desc with | Tcl_ident (li, _, l) -> line i ppf "Tcl_ident %a\n" fmt_path li; list i core_type ppf l; | Tcl_structure (cs) -> line i ppf "Tcl_structure\n"; class_structure i ppf cs; | Tcl_fun (l, p, _, ce, _) -> line i ppf "Tcl_fun\n"; arg_label i ppf l; pattern i ppf p; class_expr i ppf ce | Tcl_apply (ce, l) -> line i ppf "Tcl_apply\n"; class_expr i ppf ce; list i label_x_expression ppf l; | Tcl_let (rf, l1, l2, ce) -> line i ppf "Tcl_let %a\n" fmt_rec_flag rf; list i value_binding ppf l1; list i ident_x_expression_def ppf l2; class_expr i ppf ce; | Tcl_constraint (ce, Some ct, _, _, _) -> line i ppf "Tcl_constraint\n"; class_expr i ppf ce; class_type i ppf ct | Tcl_constraint (ce, None, _, _, _) -> class_expr i ppf ce | Tcl_open (o, e) -> line i ppf "Tcl_open %a %a\n" fmt_override_flag o.open_override fmt_path (fst o.open_expr); class_expr i ppf e and class_structure i ppf { cstr_self = p; cstr_fields = l } = line i ppf "class_structure\n"; pattern (i+1) ppf p; list (i+1) class_field ppf l; and class_field i ppf x = line i ppf "class_field %a\n" fmt_location x.cf_loc; let i = i + 1 in attributes i ppf x.cf_attributes; match x.cf_desc with | Tcf_inherit (ovf, ce, so, _, _) -> line i ppf "Tcf_inherit %a\n" fmt_override_flag ovf; class_expr (i+1) ppf ce; option (i+1) string ppf so; | Tcf_val (s, mf, _, k, _) -> line i ppf "Tcf_val \"%s\" %a\n" s.txt fmt_mutable_flag mf; class_field_kind (i+1) ppf k | Tcf_method (s, pf, k) -> line i ppf "Tcf_method \"%s\" %a\n" s.txt fmt_private_flag pf; class_field_kind (i+1) ppf k | Tcf_constraint (ct1, ct2) -> line i ppf "Tcf_constraint\n"; core_type (i+1) ppf ct1; core_type (i+1) ppf ct2; | Tcf_initializer (e) -> line i ppf "Tcf_initializer\n"; expression (i+1) ppf e; | Tcf_attribute a -> attribute i ppf "Tcf_attribute" a and class_field_kind i ppf = function | Tcfk_concrete (o, e) -> line i ppf "Concrete %a\n" fmt_override_flag o; expression i ppf e | Tcfk_virtual t -> line i ppf "Virtual\n"; core_type i ppf t and class_declaration i ppf x = line i ppf "class_declaration %a\n" fmt_location x.ci_loc; let i = i+1 in line i ppf "pci_virt = %a\n" fmt_virtual_flag x.ci_virt; line i ppf "pci_params =\n"; list (i+1) type_parameter ppf x.ci_params; line i ppf "pci_name = \"%s\"\n" x.ci_id_name.txt; line i ppf "pci_expr =\n"; class_expr (i+1) ppf x.ci_expr; and module_type i ppf x = line i ppf "module_type %a\n" fmt_location x.mty_loc; attributes i ppf x.mty_attributes; let i = i+1 in match x.mty_desc with | Tmty_ident (li,_) -> line i ppf "Tmty_ident %a\n" fmt_path li; | Tmty_alias (li,_) -> line i ppf "Tmty_alias %a\n" fmt_path li; | Tmty_signature (s) -> line i ppf "Tmty_signature\n"; signature i ppf s; | Tmty_functor (Unit, mt2) -> line i ppf "Tmty_functor ()\n"; module_type i ppf mt2; | Tmty_functor (Named (s, _, mt1), mt2) -> line i ppf "Tmty_functor \"%a\"\n" fmt_modname s; module_type i ppf mt1; module_type i ppf mt2; | Tmty_with (mt, l) -> line i ppf "Tmty_with\n"; module_type i ppf mt; list i longident_x_with_constraint ppf l; | Tmty_typeof m -> line i ppf "Tmty_typeof\n"; module_expr i ppf m; and signature i ppf x = list i signature_item ppf x.sig_items and signature_item i ppf x = line i ppf "signature_item %a\n" fmt_location x.sig_loc; let i = i+1 in match x.sig_desc with | Tsig_value vd -> line i ppf "Tsig_value\n"; value_description i ppf vd; | Tsig_type (rf, l) -> line i ppf "Tsig_type %a\n" fmt_rec_flag rf; list i type_declaration ppf l; | Tsig_typesubst l -> line i ppf "Tsig_typesubst\n"; list i type_declaration ppf l; | Tsig_typext e -> line i ppf "Tsig_typext\n"; type_extension i ppf e; | Tsig_exception ext -> line i ppf "Tsig_exception\n"; type_exception i ppf ext | Tsig_module md -> line i ppf "Tsig_module \"%a\"\n" fmt_modname md.md_id; attributes i ppf md.md_attributes; module_type i ppf md.md_type | Tsig_modsubst ms -> line i ppf "Tsig_modsubst \"%a\" = %a\n" fmt_ident ms.ms_id fmt_path ms.ms_manifest; attributes i ppf ms.ms_attributes; | Tsig_recmodule decls -> line i ppf "Tsig_recmodule\n"; list i module_declaration ppf decls; | Tsig_modtype x -> line i ppf "Tsig_modtype \"%a\"\n" fmt_ident x.mtd_id; attributes i ppf x.mtd_attributes; modtype_declaration i ppf x.mtd_type | Tsig_open od -> line i ppf "Tsig_open %a %a\n" fmt_override_flag od.open_override fmt_path (fst od.open_expr); attributes i ppf od.open_attributes | Tsig_include incl -> line i ppf "Tsig_include\n"; attributes i ppf incl.incl_attributes; module_type i ppf incl.incl_mod | Tsig_class (l) -> line i ppf "Tsig_class\n"; list i class_description ppf l; | Tsig_class_type (l) -> line i ppf "Tsig_class_type\n"; list i class_type_declaration ppf l; | Tsig_attribute a -> attribute i ppf "Tsig_attribute" a and module_declaration i ppf md = line i ppf "%a" fmt_modname md.md_id; attributes i ppf md.md_attributes; module_type (i+1) ppf md.md_type; and module_binding i ppf x = line i ppf "%a\n" fmt_modname x.mb_id; attributes i ppf x.mb_attributes; module_expr (i+1) ppf x.mb_expr and modtype_declaration i ppf = function | None -> line i ppf "#abstract" | Some mt -> module_type (i + 1) ppf mt and with_constraint i ppf x = match x with | Twith_type (td) -> line i ppf "Twith_type\n"; type_declaration (i+1) ppf td; | Twith_typesubst (td) -> line i ppf "Twith_typesubst\n"; type_declaration (i+1) ppf td; | Twith_module (li,_) -> line i ppf "Twith_module %a\n" fmt_path li; | Twith_modsubst (li,_) -> line i ppf "Twith_modsubst %a\n" fmt_path li; and module_expr i ppf x = line i ppf "module_expr %a\n" fmt_location x.mod_loc; attributes i ppf x.mod_attributes; let i = i+1 in match x.mod_desc with | Tmod_ident (li,_) -> line i ppf "Tmod_ident %a\n" fmt_path li; | Tmod_structure (s) -> line i ppf "Tmod_structure\n"; structure i ppf s; | Tmod_functor (Unit, me) -> line i ppf "Tmod_functor ()\n"; module_expr i ppf me; | Tmod_functor (Named (s, _, mt), me) -> line i ppf "Tmod_functor \"%a\"\n" fmt_modname s; module_type i ppf mt; module_expr i ppf me; | Tmod_apply (me1, me2, _) -> line i ppf "Tmod_apply\n"; module_expr i ppf me1; module_expr i ppf me2; | Tmod_constraint (me, _, Tmodtype_explicit mt, _) -> line i ppf "Tmod_constraint\n"; module_expr i ppf me; module_type i ppf mt; | Tmod_constraint (me, _, Tmodtype_implicit, _) -> module_expr i ppf me | Tmod_unpack (e, _) -> line i ppf "Tmod_unpack\n"; expression i ppf e; and structure i ppf x = list i structure_item ppf x.str_items and structure_item i ppf x = line i ppf "structure_item %a\n" fmt_location x.str_loc; let i = i+1 in match x.str_desc with | Tstr_eval (e, attrs) -> line i ppf "Tstr_eval\n"; attributes i ppf attrs; expression i ppf e; | Tstr_value (rf, l) -> line i ppf "Tstr_value %a\n" fmt_rec_flag rf; list i value_binding ppf l; | Tstr_primitive vd -> line i ppf "Tstr_primitive\n"; value_description i ppf vd; | Tstr_type (rf, l) -> line i ppf "Tstr_type %a\n" fmt_rec_flag rf; list i type_declaration ppf l; | Tstr_typext te -> line i ppf "Tstr_typext\n"; type_extension i ppf te | Tstr_exception ext -> line i ppf "Tstr_exception\n"; type_exception i ppf ext; | Tstr_module x -> line i ppf "Tstr_module\n"; module_binding i ppf x | Tstr_recmodule bindings -> line i ppf "Tstr_recmodule\n"; list i module_binding ppf bindings | Tstr_modtype x -> line i ppf "Tstr_modtype \"%a\"\n" fmt_ident x.mtd_id; attributes i ppf x.mtd_attributes; modtype_declaration i ppf x.mtd_type | Tstr_open od -> line i ppf "Tstr_open %a\n" fmt_override_flag od.open_override; module_expr i ppf od.open_expr; attributes i ppf od.open_attributes | Tstr_class (l) -> line i ppf "Tstr_class\n"; list i class_declaration ppf (List.map (fun (cl, _) -> cl) l); | Tstr_class_type (l) -> line i ppf "Tstr_class_type\n"; list i class_type_declaration ppf (List.map (fun (_, _, cl) -> cl) l); | Tstr_include incl -> line i ppf "Tstr_include"; attributes i ppf incl.incl_attributes; module_expr i ppf incl.incl_mod; | Tstr_attribute a -> attribute i ppf "Tstr_attribute" a and longident_x_with_constraint i ppf (li, _, wc) = line i ppf "%a\n" fmt_path li; with_constraint (i+1) ppf wc; and core_type_x_core_type_x_location i ppf (ct1, ct2, l) = line i ppf " %a\n" fmt_location l; core_type (i+1) ppf ct1; core_type (i+1) ppf ct2; and constructor_decl i ppf {cd_id; cd_name = _; cd_args; cd_res; cd_loc; cd_attributes} = line i ppf "%a\n" fmt_location cd_loc; line (i+1) ppf "%a\n" fmt_ident cd_id; attributes i ppf cd_attributes; constructor_arguments (i+1) ppf cd_args; option (i+1) core_type ppf cd_res and constructor_arguments i ppf = function | Cstr_tuple l -> list i core_type ppf l | Cstr_record l -> list i label_decl ppf l and label_decl i ppf {ld_id; ld_name = _; ld_mutable; ld_type; ld_loc; ld_attributes} = line i ppf "%a\n" fmt_location ld_loc; attributes i ppf ld_attributes; line (i+1) ppf "%a\n" fmt_mutable_flag ld_mutable; line (i+1) ppf "%a" fmt_ident ld_id; core_type (i+1) ppf ld_type and longident_x_pattern i ppf (li, _, p) = line i ppf "%a\n" fmt_longident li; pattern (i+1) ppf p; and case : type k . _ -> _ -> k case -> unit = fun i ppf {c_lhs; c_guard; c_rhs} -> line i ppf "\n"; pattern (i+1) ppf c_lhs; begin match c_guard with | None -> () | Some g -> line (i+1) ppf "\n"; expression (i + 2) ppf g end; expression (i+1) ppf c_rhs; and value_binding i ppf x = line i ppf "\n"; attributes (i+1) ppf x.vb_attributes; pattern (i+1) ppf x.vb_pat; expression (i+1) ppf x.vb_expr and string_x_expression i ppf (s, _, e) = line i ppf " \"%a\"\n" fmt_path s; expression (i+1) ppf e; and record_field i ppf = function | _, Overridden (li, e) -> line i ppf "%a\n" fmt_longident li; expression (i+1) ppf e; | _, Kept _ -> line i ppf "" and label_x_expression i ppf (l, e) = line i ppf "\n"; arg_label (i+1) ppf l; (match e with None -> () | Some e -> expression (i+1) ppf e) and ident_x_expression_def i ppf (l, e) = line i ppf " \"%a\"\n" fmt_ident l; expression (i+1) ppf e; and label_x_bool_x_core_type_list i ppf x = match x.rf_desc with | Ttag (l, b, ctl) -> line i ppf "Ttag \"%s\" %s\n" l.txt (string_of_bool b); attributes (i+1) ppf x.rf_attributes; list (i+1) core_type ppf ctl | Tinherit (ct) -> line i ppf "Tinherit\n"; core_type (i+1) ppf ct ;; let interface ppf x = list 0 signature_item ppf x.sig_items;; let implementation ppf x = list 0 structure_item ppf x.str_items;; let implementation_with_coercion ppf Typedtree.{structure; _} = implementation ppf structure