open Migrate_parsetree.Ast_405

class virtual ['res] lifter =
  object (this)
    method lift_Parsetree_expression : Parsetree.expression -> 'res=
      (fun
         { Parsetree.pexp_desc = pexp_desc; Parsetree.pexp_loc = pexp_loc;
           Parsetree.pexp_attributes = pexp_attributes }
          ->
         this#record "Ast_405.Parsetree.expression"
           [("pexp_desc", (this#lift_Parsetree_expression_desc pexp_desc));
           ("pexp_loc", (this#lift_Location_t pexp_loc));
           ("pexp_attributes",
             (this#lift_Parsetree_attributes pexp_attributes))] : Parsetree.expression
                                                                    ->
                                                                    'res)
    method lift_Parsetree_expression_desc :
      Parsetree.expression_desc -> 'res=
      (function
       | Parsetree.Pexp_ident x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_ident",
               [this#lift_Asttypes_loc this#lift_Longident_t x0])
       | Parsetree.Pexp_constant x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_constant", [this#lift_Parsetree_constant x0])
       | Parsetree.Pexp_let (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_let",
               [this#lift_Asttypes_rec_flag x0;
               this#list (List.map this#lift_Parsetree_value_binding x1);
               this#lift_Parsetree_expression x2])
       | Parsetree.Pexp_function x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_function",
               [this#list (List.map this#lift_Parsetree_case x0)])
       | Parsetree.Pexp_fun (x0,x1,x2,x3) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_fun",
               [this#lift_Asttypes_arg_label x0;
               this#lift_option this#lift_Parsetree_expression x1;
               this#lift_Parsetree_pattern x2;
               this#lift_Parsetree_expression x3])
       | Parsetree.Pexp_apply (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_apply",
               [this#lift_Parsetree_expression x0;
               this#list
                 (List.map
                    (fun x  ->
                       let (x0,x1) = x  in
                       this#tuple
                         [this#lift_Asttypes_arg_label x0;
                         this#lift_Parsetree_expression x1]) x1)])
       | Parsetree.Pexp_match (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_match",
               [this#lift_Parsetree_expression x0;
               this#list (List.map this#lift_Parsetree_case x1)])
       | Parsetree.Pexp_try (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_try",
               [this#lift_Parsetree_expression x0;
               this#list (List.map this#lift_Parsetree_case x1)])
       | Parsetree.Pexp_tuple x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_tuple",
               [this#list (List.map this#lift_Parsetree_expression x0)])
       | Parsetree.Pexp_construct (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_construct",
               [this#lift_Asttypes_loc this#lift_Longident_t x0;
               this#lift_option this#lift_Parsetree_expression x1])
       | Parsetree.Pexp_variant (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_variant",
               [this#lift_Asttypes_label x0;
               this#lift_option this#lift_Parsetree_expression x1])
       | Parsetree.Pexp_record (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_record",
               [this#list
                  (List.map
                     (fun x  ->
                        let (x0,x1) = x  in
                        this#tuple
                          [this#lift_Asttypes_loc this#lift_Longident_t x0;
                          this#lift_Parsetree_expression x1]) x0);
               this#lift_option this#lift_Parsetree_expression x1])
       | Parsetree.Pexp_field (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_field",
               [this#lift_Parsetree_expression x0;
               this#lift_Asttypes_loc this#lift_Longident_t x1])
       | Parsetree.Pexp_setfield (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_setfield",
               [this#lift_Parsetree_expression x0;
               this#lift_Asttypes_loc this#lift_Longident_t x1;
               this#lift_Parsetree_expression x2])
       | Parsetree.Pexp_array x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_array",
               [this#list (List.map this#lift_Parsetree_expression x0)])
       | Parsetree.Pexp_ifthenelse (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_ifthenelse",
               [this#lift_Parsetree_expression x0;
               this#lift_Parsetree_expression x1;
               this#lift_option this#lift_Parsetree_expression x2])
       | Parsetree.Pexp_sequence (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_sequence",
               [this#lift_Parsetree_expression x0;
               this#lift_Parsetree_expression x1])
       | Parsetree.Pexp_while (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_while",
               [this#lift_Parsetree_expression x0;
               this#lift_Parsetree_expression x1])
       | Parsetree.Pexp_for (x0,x1,x2,x3,x4) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_for",
               [this#lift_Parsetree_pattern x0;
               this#lift_Parsetree_expression x1;
               this#lift_Parsetree_expression x2;
               this#lift_Asttypes_direction_flag x3;
               this#lift_Parsetree_expression x4])
       | Parsetree.Pexp_constraint (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_constraint",
               [this#lift_Parsetree_expression x0;
               this#lift_Parsetree_core_type x1])
       | Parsetree.Pexp_coerce (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_coerce",
               [this#lift_Parsetree_expression x0;
               this#lift_option this#lift_Parsetree_core_type x1;
               this#lift_Parsetree_core_type x2])
       | Parsetree.Pexp_send (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_send",
               [this#lift_Parsetree_expression x0;
               this#lift_Asttypes_loc this#string x1])
       | Parsetree.Pexp_new x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_new", [this#lift_Asttypes_loc this#lift_Longident_t x0])
       | Parsetree.Pexp_setinstvar (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_setinstvar",
               [this#lift_Asttypes_loc this#string x0;
               this#lift_Parsetree_expression x1])
       | Parsetree.Pexp_override x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_override",
               [this#list
                  (List.map
                     (fun x  ->
                        let (x0,x1) = x  in
                        this#tuple
                          [this#lift_Asttypes_loc this#string x0;
                          this#lift_Parsetree_expression x1]) x0)])
       | Parsetree.Pexp_letmodule (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_letmodule",
               [this#lift_Asttypes_loc this#string x0;
               this#lift_Parsetree_module_expr x1;
               this#lift_Parsetree_expression x2])
       | Parsetree.Pexp_letexception (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_letexception",
               [this#lift_Parsetree_extension_constructor x0;
               this#lift_Parsetree_expression x1])
       | Parsetree.Pexp_assert x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_assert", [this#lift_Parsetree_expression x0])
       | Parsetree.Pexp_lazy x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_lazy", [this#lift_Parsetree_expression x0])
       | Parsetree.Pexp_poly (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_poly",
               [this#lift_Parsetree_expression x0;
               this#lift_option this#lift_Parsetree_core_type x1])
       | Parsetree.Pexp_object x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_object", [this#lift_Parsetree_class_structure x0])
       | Parsetree.Pexp_newtype (x0,x1) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_newtype",
               [this#lift_Asttypes_loc this#string x0;
               this#lift_Parsetree_expression x1])
       | Parsetree.Pexp_pack x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_pack", [this#lift_Parsetree_module_expr x0])
       | Parsetree.Pexp_open (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_open",
               [this#lift_Asttypes_override_flag x0;
               this#lift_Asttypes_loc this#lift_Longident_t x1;
               this#lift_Parsetree_expression x2])
       | Parsetree.Pexp_extension x0 ->
           this#constr "Ast_405.Parsetree.expression_desc"
             ("Pexp_extension", [this#lift_Parsetree_extension x0])
       | Parsetree.Pexp_unreachable  ->
           this#constr "Ast_405.Parsetree.expression_desc" ("Pexp_unreachable", []) :
      Parsetree.expression_desc -> 'res)
    method lift_Asttypes_direction_flag : Asttypes.direction_flag -> 'res=
      (function
       | Asttypes.Upto  -> this#constr "Ast_405.Asttypes.direction_flag" ("Upto", [])
       | Asttypes.Downto  ->
           this#constr "Ast_405.Asttypes.direction_flag" ("Downto", []) : Asttypes.direction_flag
                                                                    ->
                                                                    'res)
    method lift_Parsetree_case : Parsetree.case -> 'res=
      (fun
         { Parsetree.pc_lhs = pc_lhs; Parsetree.pc_guard = pc_guard;
           Parsetree.pc_rhs = pc_rhs }
          ->
         this#record "Ast_405.Parsetree.case"
           [("pc_lhs", (this#lift_Parsetree_pattern pc_lhs));
           ("pc_guard",
             (this#lift_option this#lift_Parsetree_expression pc_guard));
           ("pc_rhs", (this#lift_Parsetree_expression pc_rhs))] : Parsetree.case
                                                                    ->
                                                                    'res)
    method lift_Parsetree_value_binding : Parsetree.value_binding -> 'res=
      (fun
         { Parsetree.pvb_pat = pvb_pat; Parsetree.pvb_expr = pvb_expr;
           Parsetree.pvb_attributes = pvb_attributes;
           Parsetree.pvb_loc = pvb_loc }
          ->
         this#record "Ast_405.Parsetree.value_binding"
           [("pvb_pat", (this#lift_Parsetree_pattern pvb_pat));
           ("pvb_expr", (this#lift_Parsetree_expression pvb_expr));
           ("pvb_attributes",
             (this#lift_Parsetree_attributes pvb_attributes));
           ("pvb_loc", (this#lift_Location_t pvb_loc))] : Parsetree.value_binding
                                                            -> 'res)
    method lift_Parsetree_pattern : Parsetree.pattern -> 'res=
      (fun
         { Parsetree.ppat_desc = ppat_desc; Parsetree.ppat_loc = ppat_loc;
           Parsetree.ppat_attributes = ppat_attributes }
          ->
         this#record "Ast_405.Parsetree.pattern"
           [("ppat_desc", (this#lift_Parsetree_pattern_desc ppat_desc));
           ("ppat_loc", (this#lift_Location_t ppat_loc));
           ("ppat_attributes",
             (this#lift_Parsetree_attributes ppat_attributes))] : Parsetree.pattern
                                                                    ->
                                                                    'res)
    method lift_Parsetree_pattern_desc : Parsetree.pattern_desc -> 'res=
      (function
       | Parsetree.Ppat_any  ->
           this#constr "Ast_405.Parsetree.pattern_desc" ("Ppat_any", [])
       | Parsetree.Ppat_var x0 ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_var", [this#lift_Asttypes_loc this#string x0])
       | Parsetree.Ppat_alias (x0,x1) ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_alias",
               [this#lift_Parsetree_pattern x0;
               this#lift_Asttypes_loc this#string x1])
       | Parsetree.Ppat_constant x0 ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_constant", [this#lift_Parsetree_constant x0])
       | Parsetree.Ppat_interval (x0,x1) ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_interval",
               [this#lift_Parsetree_constant x0;
               this#lift_Parsetree_constant x1])
       | Parsetree.Ppat_tuple x0 ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_tuple",
               [this#list (List.map this#lift_Parsetree_pattern x0)])
       | Parsetree.Ppat_construct (x0,x1) ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_construct",
               [this#lift_Asttypes_loc this#lift_Longident_t x0;
               this#lift_option this#lift_Parsetree_pattern x1])
       | Parsetree.Ppat_variant (x0,x1) ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_variant",
               [this#lift_Asttypes_label x0;
               this#lift_option this#lift_Parsetree_pattern x1])
       | Parsetree.Ppat_record (x0,x1) ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_record",
               [this#list
                  (List.map
                     (fun x  ->
                        let (x0,x1) = x  in
                        this#tuple
                          [this#lift_Asttypes_loc this#lift_Longident_t x0;
                          this#lift_Parsetree_pattern x1]) x0);
               this#lift_Asttypes_closed_flag x1])
       | Parsetree.Ppat_array x0 ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_array",
               [this#list (List.map this#lift_Parsetree_pattern x0)])
       | Parsetree.Ppat_or (x0,x1) ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_or",
               [this#lift_Parsetree_pattern x0;
               this#lift_Parsetree_pattern x1])
       | Parsetree.Ppat_constraint (x0,x1) ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_constraint",
               [this#lift_Parsetree_pattern x0;
               this#lift_Parsetree_core_type x1])
       | Parsetree.Ppat_type x0 ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_type", [this#lift_Asttypes_loc this#lift_Longident_t x0])
       | Parsetree.Ppat_lazy x0 ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_lazy", [this#lift_Parsetree_pattern x0])
       | Parsetree.Ppat_unpack x0 ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_unpack", [this#lift_Asttypes_loc this#string x0])
       | Parsetree.Ppat_exception x0 ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_exception", [this#lift_Parsetree_pattern x0])
       | Parsetree.Ppat_extension x0 ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_extension", [this#lift_Parsetree_extension x0])
       | Parsetree.Ppat_open (x0,x1) ->
           this#constr "Ast_405.Parsetree.pattern_desc"
             ("Ppat_open",
               [this#lift_Asttypes_loc this#lift_Longident_t x0;
               this#lift_Parsetree_pattern x1]) : Parsetree.pattern_desc ->
                                                    'res)
    method lift_Parsetree_core_type : Parsetree.core_type -> 'res=
      (fun
         { Parsetree.ptyp_desc = ptyp_desc; Parsetree.ptyp_loc = ptyp_loc;
           Parsetree.ptyp_attributes = ptyp_attributes }
          ->
         this#record "Ast_405.Parsetree.core_type"
           [("ptyp_desc", (this#lift_Parsetree_core_type_desc ptyp_desc));
           ("ptyp_loc", (this#lift_Location_t ptyp_loc));
           ("ptyp_attributes",
             (this#lift_Parsetree_attributes ptyp_attributes))] : Parsetree.core_type
                                                                    ->
                                                                    'res)
    method lift_Parsetree_core_type_desc : Parsetree.core_type_desc -> 'res=
      (function
       | Parsetree.Ptyp_any  ->
           this#constr "Ast_405.Parsetree.core_type_desc" ("Ptyp_any", [])
       | Parsetree.Ptyp_var x0 ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_var", [this#string x0])
       | Parsetree.Ptyp_arrow (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_arrow",
               [this#lift_Asttypes_arg_label x0;
               this#lift_Parsetree_core_type x1;
               this#lift_Parsetree_core_type x2])
       | Parsetree.Ptyp_tuple x0 ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_tuple",
               [this#list (List.map this#lift_Parsetree_core_type x0)])
       | Parsetree.Ptyp_constr (x0,x1) ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_constr",
               [this#lift_Asttypes_loc this#lift_Longident_t x0;
               this#list (List.map this#lift_Parsetree_core_type x1)])
       | Parsetree.Ptyp_object (x0,x1) ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_object",
               [this#list
                  (List.map
                     (fun x  ->
                        let (x0,x1,x2) = x  in
                        this#tuple
                          [this#lift_Asttypes_loc this#string x0;
                          this#lift_Parsetree_attributes x1;
                          this#lift_Parsetree_core_type x2]) x0);
               this#lift_Asttypes_closed_flag x1])
       | Parsetree.Ptyp_class (x0,x1) ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_class",
               [this#lift_Asttypes_loc this#lift_Longident_t x0;
               this#list (List.map this#lift_Parsetree_core_type x1)])
       | Parsetree.Ptyp_alias (x0,x1) ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_alias",
               [this#lift_Parsetree_core_type x0; this#string x1])
       | Parsetree.Ptyp_variant (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_variant",
               [this#list (List.map this#lift_Parsetree_row_field x0);
               this#lift_Asttypes_closed_flag x1;
               this#lift_option
                 (fun x  -> this#list (List.map this#lift_Asttypes_label x))
                 x2])
       | Parsetree.Ptyp_poly (x0,x1) ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_poly",
               [this#list
                  (List.map (fun x  -> this#lift_Asttypes_loc this#string x)
                     x0);
               this#lift_Parsetree_core_type x1])
       | Parsetree.Ptyp_package x0 ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_package", [this#lift_Parsetree_package_type x0])
       | Parsetree.Ptyp_extension x0 ->
           this#constr "Ast_405.Parsetree.core_type_desc"
             ("Ptyp_extension", [this#lift_Parsetree_extension x0]) :
      Parsetree.core_type_desc -> 'res)
    method lift_Parsetree_package_type : Parsetree.package_type -> 'res=
      (fun x  ->
         let (x0,x1) = x  in
         this#tuple
           [this#lift_Asttypes_loc this#lift_Longident_t x0;
           this#list
             (List.map
                (fun x  ->
                   let (x0,x1) = x  in
                   this#tuple
                     [this#lift_Asttypes_loc this#lift_Longident_t x0;
                     this#lift_Parsetree_core_type x1]) x1)] : Parsetree.package_type
                                                                 -> 'res)
    method lift_Parsetree_row_field : Parsetree.row_field -> 'res=
      (function
       | Parsetree.Rtag (x0,x1,x2,x3) ->
           this#constr "Ast_405.Parsetree.row_field"
             ("Rtag",
               [this#lift_Asttypes_label x0;
               this#lift_Parsetree_attributes x1;
               this#lift_bool x2;
               this#list (List.map this#lift_Parsetree_core_type x3)])
       | Parsetree.Rinherit x0 ->
           this#constr "Ast_405.Parsetree.row_field"
             ("Rinherit", [this#lift_Parsetree_core_type x0]) : Parsetree.row_field
                                                                  ->
                                                                  'res)
    method lift_Parsetree_attributes : Parsetree.attributes -> 'res=
      (fun x  -> this#list (List.map this#lift_Parsetree_attribute x) :
      Parsetree.attributes -> 'res)
    method lift_Parsetree_attribute : Parsetree.attribute -> 'res=
      (fun x  ->
         let (x0,x1) = x  in
         this#tuple
           [this#lift_Asttypes_loc this#string x0;
           this#lift_Parsetree_payload x1] : Parsetree.attribute -> 'res)
    method lift_Parsetree_payload : Parsetree.payload -> 'res=
      (function
       | Parsetree.PStr x0 ->
           this#constr "Ast_405.Parsetree.payload"
             ("PStr", [this#lift_Parsetree_structure x0])
       | Parsetree.PSig x0 ->
           this#constr "Ast_405.Parsetree.payload"
             ("PSig", [this#lift_Parsetree_signature x0])
       | Parsetree.PTyp x0 ->
           this#constr "Ast_405.Parsetree.payload"
             ("PTyp", [this#lift_Parsetree_core_type x0])
       | Parsetree.PPat (x0,x1) ->
           this#constr "Ast_405.Parsetree.payload"
             ("PPat",
               [this#lift_Parsetree_pattern x0;
               this#lift_option this#lift_Parsetree_expression x1]) :
      Parsetree.payload -> 'res)
    method lift_Parsetree_structure : Parsetree.structure -> 'res=
      (fun x  -> this#list (List.map this#lift_Parsetree_structure_item x) :
      Parsetree.structure -> 'res)
    method lift_Parsetree_structure_item : Parsetree.structure_item -> 'res=
      (fun { Parsetree.pstr_desc = pstr_desc; Parsetree.pstr_loc = pstr_loc }
          ->
         this#record "Ast_405.Parsetree.structure_item"
           [("pstr_desc",
              (this#lift_Parsetree_structure_item_desc pstr_desc));
           ("pstr_loc", (this#lift_Location_t pstr_loc))] : Parsetree.structure_item
                                                              -> 'res)
    method lift_Parsetree_structure_item_desc :
      Parsetree.structure_item_desc -> 'res=
      (function
       | Parsetree.Pstr_eval (x0,x1) ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_eval",
               [this#lift_Parsetree_expression x0;
               this#lift_Parsetree_attributes x1])
       | Parsetree.Pstr_value (x0,x1) ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_value",
               [this#lift_Asttypes_rec_flag x0;
               this#list (List.map this#lift_Parsetree_value_binding x1)])
       | Parsetree.Pstr_primitive x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_primitive", [this#lift_Parsetree_value_description x0])
       | Parsetree.Pstr_type (x0,x1) ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_type",
               [this#lift_Asttypes_rec_flag x0;
               this#list (List.map this#lift_Parsetree_type_declaration x1)])
       | Parsetree.Pstr_typext x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_typext", [this#lift_Parsetree_type_extension x0])
       | Parsetree.Pstr_exception x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_exception",
               [this#lift_Parsetree_extension_constructor x0])
       | Parsetree.Pstr_module x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_module", [this#lift_Parsetree_module_binding x0])
       | Parsetree.Pstr_recmodule x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_recmodule",
               [this#list (List.map this#lift_Parsetree_module_binding x0)])
       | Parsetree.Pstr_modtype x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_modtype",
               [this#lift_Parsetree_module_type_declaration x0])
       | Parsetree.Pstr_open x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_open", [this#lift_Parsetree_open_description x0])
       | Parsetree.Pstr_class x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_class",
               [this#list (List.map this#lift_Parsetree_class_declaration x0)])
       | Parsetree.Pstr_class_type x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_class_type",
               [this#list
                  (List.map this#lift_Parsetree_class_type_declaration x0)])
       | Parsetree.Pstr_include x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_include", [this#lift_Parsetree_include_declaration x0])
       | Parsetree.Pstr_attribute x0 ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_attribute", [this#lift_Parsetree_attribute x0])
       | Parsetree.Pstr_extension (x0,x1) ->
           this#constr "Ast_405.Parsetree.structure_item_desc"
             ("Pstr_extension",
               [this#lift_Parsetree_extension x0;
               this#lift_Parsetree_attributes x1]) : Parsetree.structure_item_desc
                                                       -> 'res)
    method lift_Parsetree_include_declaration :
      Parsetree.include_declaration -> 'res=
      (fun x  ->
         this#lift_Parsetree_include_infos this#lift_Parsetree_module_expr x :
      Parsetree.include_declaration -> 'res)
    method lift_Parsetree_class_declaration :
      Parsetree.class_declaration -> 'res=
      (fun x  ->
         this#lift_Parsetree_class_infos this#lift_Parsetree_class_expr x :
      Parsetree.class_declaration -> 'res)
    method lift_Parsetree_class_expr : Parsetree.class_expr -> 'res=
      (fun
         { Parsetree.pcl_desc = pcl_desc; Parsetree.pcl_loc = pcl_loc;
           Parsetree.pcl_attributes = pcl_attributes }
          ->
         this#record "Ast_405.Parsetree.class_expr"
           [("pcl_desc", (this#lift_Parsetree_class_expr_desc pcl_desc));
           ("pcl_loc", (this#lift_Location_t pcl_loc));
           ("pcl_attributes",
             (this#lift_Parsetree_attributes pcl_attributes))] : Parsetree.class_expr
                                                                   ->
                                                                   'res)
    method lift_Parsetree_class_expr_desc :
      Parsetree.class_expr_desc -> 'res=
      (function
       | Parsetree.Pcl_constr (x0,x1) ->
           this#constr "Ast_405.Parsetree.class_expr_desc"
             ("Pcl_constr",
               [this#lift_Asttypes_loc this#lift_Longident_t x0;
               this#list (List.map this#lift_Parsetree_core_type x1)])
       | Parsetree.Pcl_structure x0 ->
           this#constr "Ast_405.Parsetree.class_expr_desc"
             ("Pcl_structure", [this#lift_Parsetree_class_structure x0])
       | Parsetree.Pcl_fun (x0,x1,x2,x3) ->
           this#constr "Ast_405.Parsetree.class_expr_desc"
             ("Pcl_fun",
               [this#lift_Asttypes_arg_label x0;
               this#lift_option this#lift_Parsetree_expression x1;
               this#lift_Parsetree_pattern x2;
               this#lift_Parsetree_class_expr x3])
       | Parsetree.Pcl_apply (x0,x1) ->
           this#constr "Ast_405.Parsetree.class_expr_desc"
             ("Pcl_apply",
               [this#lift_Parsetree_class_expr x0;
               this#list
                 (List.map
                    (fun x  ->
                       let (x0,x1) = x  in
                       this#tuple
                         [this#lift_Asttypes_arg_label x0;
                         this#lift_Parsetree_expression x1]) x1)])
       | Parsetree.Pcl_let (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.class_expr_desc"
             ("Pcl_let",
               [this#lift_Asttypes_rec_flag x0;
               this#list (List.map this#lift_Parsetree_value_binding x1);
               this#lift_Parsetree_class_expr x2])
       | Parsetree.Pcl_constraint (x0,x1) ->
           this#constr "Ast_405.Parsetree.class_expr_desc"
             ("Pcl_constraint",
               [this#lift_Parsetree_class_expr x0;
               this#lift_Parsetree_class_type x1])
       | Parsetree.Pcl_extension x0 ->
           this#constr "Ast_405.Parsetree.class_expr_desc"
             ("Pcl_extension", [this#lift_Parsetree_extension x0]) :
      Parsetree.class_expr_desc -> 'res)
    method lift_Parsetree_class_structure :
      Parsetree.class_structure -> 'res=
      (fun
         { Parsetree.pcstr_self = pcstr_self;
           Parsetree.pcstr_fields = pcstr_fields }
          ->
         this#record "Ast_405.Parsetree.class_structure"
           [("pcstr_self", (this#lift_Parsetree_pattern pcstr_self));
           ("pcstr_fields",
             (this#list
                (List.map this#lift_Parsetree_class_field pcstr_fields)))] :
      Parsetree.class_structure -> 'res)
    method lift_Parsetree_class_field : Parsetree.class_field -> 'res=
      (fun
         { Parsetree.pcf_desc = pcf_desc; Parsetree.pcf_loc = pcf_loc;
           Parsetree.pcf_attributes = pcf_attributes }
          ->
         this#record "Ast_405.Parsetree.class_field"
           [("pcf_desc", (this#lift_Parsetree_class_field_desc pcf_desc));
           ("pcf_loc", (this#lift_Location_t pcf_loc));
           ("pcf_attributes",
             (this#lift_Parsetree_attributes pcf_attributes))] : Parsetree.class_field
                                                                   ->
                                                                   'res)
    method lift_Parsetree_class_field_desc :
      Parsetree.class_field_desc -> 'res=
      (function
       | Parsetree.Pcf_inherit (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.class_field_desc"
             ("Pcf_inherit",
               [this#lift_Asttypes_override_flag x0;
               this#lift_Parsetree_class_expr x1;
               this#lift_option
                 (fun x  -> this#lift_Asttypes_loc this#string x) x2])
       | Parsetree.Pcf_val x0 ->
           this#constr "Ast_405.Parsetree.class_field_desc"
             ("Pcf_val",
               [(let (x0,x1,x2) = x0  in
                 this#tuple
                   [this#lift_Asttypes_loc this#string x0;
                   this#lift_Asttypes_mutable_flag x1;
                   this#lift_Parsetree_class_field_kind x2])])
       | Parsetree.Pcf_method x0 ->
           this#constr "Ast_405.Parsetree.class_field_desc"
             ("Pcf_method",
               [(let (x0,x1,x2) = x0  in
                 this#tuple
                   [this#lift_Asttypes_loc this#string x0;
                   this#lift_Asttypes_private_flag x1;
                   this#lift_Parsetree_class_field_kind x2])])
       | Parsetree.Pcf_constraint x0 ->
           this#constr "Ast_405.Parsetree.class_field_desc"
             ("Pcf_constraint",
               [(let (x0,x1) = x0  in
                 this#tuple
                   [this#lift_Parsetree_core_type x0;
                   this#lift_Parsetree_core_type x1])])
       | Parsetree.Pcf_initializer x0 ->
           this#constr "Ast_405.Parsetree.class_field_desc"
             ("Pcf_initializer", [this#lift_Parsetree_expression x0])
       | Parsetree.Pcf_attribute x0 ->
           this#constr "Ast_405.Parsetree.class_field_desc"
             ("Pcf_attribute", [this#lift_Parsetree_attribute x0])
       | Parsetree.Pcf_extension x0 ->
           this#constr "Ast_405.Parsetree.class_field_desc"
             ("Pcf_extension", [this#lift_Parsetree_extension x0]) :
      Parsetree.class_field_desc -> 'res)
    method lift_Parsetree_class_field_kind :
      Parsetree.class_field_kind -> 'res=
      (function
       | Parsetree.Cfk_virtual x0 ->
           this#constr "Ast_405.Parsetree.class_field_kind"
             ("Cfk_virtual", [this#lift_Parsetree_core_type x0])
       | Parsetree.Cfk_concrete (x0,x1) ->
           this#constr "Ast_405.Parsetree.class_field_kind"
             ("Cfk_concrete",
               [this#lift_Asttypes_override_flag x0;
               this#lift_Parsetree_expression x1]) : Parsetree.class_field_kind
                                                       -> 'res)
    method lift_Parsetree_module_binding : Parsetree.module_binding -> 'res=
      (fun
         { Parsetree.pmb_name = pmb_name; Parsetree.pmb_expr = pmb_expr;
           Parsetree.pmb_attributes = pmb_attributes;
           Parsetree.pmb_loc = pmb_loc }
          ->
         this#record "Ast_405.Parsetree.module_binding"
           [("pmb_name", (this#lift_Asttypes_loc this#string pmb_name));
           ("pmb_expr", (this#lift_Parsetree_module_expr pmb_expr));
           ("pmb_attributes",
             (this#lift_Parsetree_attributes pmb_attributes));
           ("pmb_loc", (this#lift_Location_t pmb_loc))] : Parsetree.module_binding
                                                            -> 'res)
    method lift_Parsetree_module_expr : Parsetree.module_expr -> 'res=
      (fun
         { Parsetree.pmod_desc = pmod_desc; Parsetree.pmod_loc = pmod_loc;
           Parsetree.pmod_attributes = pmod_attributes }
          ->
         this#record "Ast_405.Parsetree.module_expr"
           [("pmod_desc", (this#lift_Parsetree_module_expr_desc pmod_desc));
           ("pmod_loc", (this#lift_Location_t pmod_loc));
           ("pmod_attributes",
             (this#lift_Parsetree_attributes pmod_attributes))] : Parsetree.module_expr
                                                                    ->
                                                                    'res)
    method lift_Parsetree_module_expr_desc :
      Parsetree.module_expr_desc -> 'res=
      (function
       | Parsetree.Pmod_ident x0 ->
           this#constr "Ast_405.Parsetree.module_expr_desc"
             ("Pmod_ident",
               [this#lift_Asttypes_loc this#lift_Longident_t x0])
       | Parsetree.Pmod_structure x0 ->
           this#constr "Ast_405.Parsetree.module_expr_desc"
             ("Pmod_structure", [this#lift_Parsetree_structure x0])
       | Parsetree.Pmod_functor (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.module_expr_desc"
             ("Pmod_functor",
               [this#lift_Asttypes_loc this#string x0;
               this#lift_option this#lift_Parsetree_module_type x1;
               this#lift_Parsetree_module_expr x2])
       | Parsetree.Pmod_apply (x0,x1) ->
           this#constr "Ast_405.Parsetree.module_expr_desc"
             ("Pmod_apply",
               [this#lift_Parsetree_module_expr x0;
               this#lift_Parsetree_module_expr x1])
       | Parsetree.Pmod_constraint (x0,x1) ->
           this#constr "Ast_405.Parsetree.module_expr_desc"
             ("Pmod_constraint",
               [this#lift_Parsetree_module_expr x0;
               this#lift_Parsetree_module_type x1])
       | Parsetree.Pmod_unpack x0 ->
           this#constr "Ast_405.Parsetree.module_expr_desc"
             ("Pmod_unpack", [this#lift_Parsetree_expression x0])
       | Parsetree.Pmod_extension x0 ->
           this#constr "Ast_405.Parsetree.module_expr_desc"
             ("Pmod_extension", [this#lift_Parsetree_extension x0]) :
      Parsetree.module_expr_desc -> 'res)
    method lift_Parsetree_module_type : Parsetree.module_type -> 'res=
      (fun
         { Parsetree.pmty_desc = pmty_desc; Parsetree.pmty_loc = pmty_loc;
           Parsetree.pmty_attributes = pmty_attributes }
          ->
         this#record "Ast_405.Parsetree.module_type"
           [("pmty_desc", (this#lift_Parsetree_module_type_desc pmty_desc));
           ("pmty_loc", (this#lift_Location_t pmty_loc));
           ("pmty_attributes",
             (this#lift_Parsetree_attributes pmty_attributes))] : Parsetree.module_type
                                                                    ->
                                                                    'res)
    method lift_Parsetree_module_type_desc :
      Parsetree.module_type_desc -> 'res=
      (function
       | Parsetree.Pmty_ident x0 ->
           this#constr "Ast_405.Parsetree.module_type_desc"
             ("Pmty_ident",
               [this#lift_Asttypes_loc this#lift_Longident_t x0])
       | Parsetree.Pmty_signature x0 ->
           this#constr "Ast_405.Parsetree.module_type_desc"
             ("Pmty_signature", [this#lift_Parsetree_signature x0])
       | Parsetree.Pmty_functor (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.module_type_desc"
             ("Pmty_functor",
               [this#lift_Asttypes_loc this#string x0;
               this#lift_option this#lift_Parsetree_module_type x1;
               this#lift_Parsetree_module_type x2])
       | Parsetree.Pmty_with (x0,x1) ->
           this#constr "Ast_405.Parsetree.module_type_desc"
             ("Pmty_with",
               [this#lift_Parsetree_module_type x0;
               this#list (List.map this#lift_Parsetree_with_constraint x1)])
       | Parsetree.Pmty_typeof x0 ->
           this#constr "Ast_405.Parsetree.module_type_desc"
             ("Pmty_typeof", [this#lift_Parsetree_module_expr x0])
       | Parsetree.Pmty_extension x0 ->
           this#constr "Ast_405.Parsetree.module_type_desc"
             ("Pmty_extension", [this#lift_Parsetree_extension x0])
       | Parsetree.Pmty_alias x0 ->
           this#constr "Ast_405.Parsetree.module_type_desc"
             ("Pmty_alias",
               [this#lift_Asttypes_loc this#lift_Longident_t x0]) : Parsetree.module_type_desc
                                                                    ->
                                                                    'res)
    method lift_Parsetree_with_constraint :
      Parsetree.with_constraint -> 'res=
      (function
       | Parsetree.Pwith_type (x0,x1) ->
           this#constr "Ast_405.Parsetree.with_constraint"
             ("Pwith_type",
               [this#lift_Asttypes_loc this#lift_Longident_t x0;
               this#lift_Parsetree_type_declaration x1])
       | Parsetree.Pwith_module (x0,x1) ->
           this#constr "Ast_405.Parsetree.with_constraint"
             ("Pwith_module",
               [this#lift_Asttypes_loc this#lift_Longident_t x0;
               this#lift_Asttypes_loc this#lift_Longident_t x1])
       | Parsetree.Pwith_typesubst x0 ->
           this#constr "Ast_405.Parsetree.with_constraint"
             ("Pwith_typesubst", [this#lift_Parsetree_type_declaration x0])
       | Parsetree.Pwith_modsubst (x0,x1) ->
           this#constr "Ast_405.Parsetree.with_constraint"
             ("Pwith_modsubst",
               [this#lift_Asttypes_loc this#string x0;
               this#lift_Asttypes_loc this#lift_Longident_t x1]) : Parsetree.with_constraint
                                                                    ->
                                                                    'res)
    method lift_Parsetree_signature : Parsetree.signature -> 'res=
      (fun x  -> this#list (List.map this#lift_Parsetree_signature_item x) :
      Parsetree.signature -> 'res)
    method lift_Parsetree_signature_item : Parsetree.signature_item -> 'res=
      (fun { Parsetree.psig_desc = psig_desc; Parsetree.psig_loc = psig_loc }
          ->
         this#record "Ast_405.Parsetree.signature_item"
           [("psig_desc",
              (this#lift_Parsetree_signature_item_desc psig_desc));
           ("psig_loc", (this#lift_Location_t psig_loc))] : Parsetree.signature_item
                                                              -> 'res)
    method lift_Parsetree_signature_item_desc :
      Parsetree.signature_item_desc -> 'res=
      (function
       | Parsetree.Psig_value x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_value", [this#lift_Parsetree_value_description x0])
       | Parsetree.Psig_type (x0,x1) ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_type",
               [this#lift_Asttypes_rec_flag x0;
               this#list (List.map this#lift_Parsetree_type_declaration x1)])
       | Parsetree.Psig_typext x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_typext", [this#lift_Parsetree_type_extension x0])
       | Parsetree.Psig_exception x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_exception",
               [this#lift_Parsetree_extension_constructor x0])
       | Parsetree.Psig_module x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_module", [this#lift_Parsetree_module_declaration x0])
       | Parsetree.Psig_recmodule x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_recmodule",
               [this#list
                  (List.map this#lift_Parsetree_module_declaration x0)])
       | Parsetree.Psig_modtype x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_modtype",
               [this#lift_Parsetree_module_type_declaration x0])
       | Parsetree.Psig_open x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_open", [this#lift_Parsetree_open_description x0])
       | Parsetree.Psig_include x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_include", [this#lift_Parsetree_include_description x0])
       | Parsetree.Psig_class x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_class",
               [this#list (List.map this#lift_Parsetree_class_description x0)])
       | Parsetree.Psig_class_type x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_class_type",
               [this#list
                  (List.map this#lift_Parsetree_class_type_declaration x0)])
       | Parsetree.Psig_attribute x0 ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_attribute", [this#lift_Parsetree_attribute x0])
       | Parsetree.Psig_extension (x0,x1) ->
           this#constr "Ast_405.Parsetree.signature_item_desc"
             ("Psig_extension",
               [this#lift_Parsetree_extension x0;
               this#lift_Parsetree_attributes x1]) : Parsetree.signature_item_desc
                                                       -> 'res)
    method lift_Parsetree_class_type_declaration :
      Parsetree.class_type_declaration -> 'res=
      (fun x  ->
         this#lift_Parsetree_class_infos this#lift_Parsetree_class_type x :
      Parsetree.class_type_declaration -> 'res)
    method lift_Parsetree_class_description :
      Parsetree.class_description -> 'res=
      (fun x  ->
         this#lift_Parsetree_class_infos this#lift_Parsetree_class_type x :
      Parsetree.class_description -> 'res)
    method lift_Parsetree_class_type : Parsetree.class_type -> 'res=
      (fun
         { Parsetree.pcty_desc = pcty_desc; Parsetree.pcty_loc = pcty_loc;
           Parsetree.pcty_attributes = pcty_attributes }
          ->
         this#record "Ast_405.Parsetree.class_type"
           [("pcty_desc", (this#lift_Parsetree_class_type_desc pcty_desc));
           ("pcty_loc", (this#lift_Location_t pcty_loc));
           ("pcty_attributes",
             (this#lift_Parsetree_attributes pcty_attributes))] : Parsetree.class_type
                                                                    ->
                                                                    'res)
    method lift_Parsetree_class_type_desc :
      Parsetree.class_type_desc -> 'res=
      (function
       | Parsetree.Pcty_constr (x0,x1) ->
           this#constr "Ast_405.Parsetree.class_type_desc"
             ("Pcty_constr",
               [this#lift_Asttypes_loc this#lift_Longident_t x0;
               this#list (List.map this#lift_Parsetree_core_type x1)])
       | Parsetree.Pcty_signature x0 ->
           this#constr "Ast_405.Parsetree.class_type_desc"
             ("Pcty_signature", [this#lift_Parsetree_class_signature x0])
       | Parsetree.Pcty_arrow (x0,x1,x2) ->
           this#constr "Ast_405.Parsetree.class_type_desc"
             ("Pcty_arrow",
               [this#lift_Asttypes_arg_label x0;
               this#lift_Parsetree_core_type x1;
               this#lift_Parsetree_class_type x2])
       | Parsetree.Pcty_extension x0 ->
           this#constr "Ast_405.Parsetree.class_type_desc"
             ("Pcty_extension", [this#lift_Parsetree_extension x0]) :
      Parsetree.class_type_desc -> 'res)
    method lift_Parsetree_class_signature :
      Parsetree.class_signature -> 'res=
      (fun
         { Parsetree.pcsig_self = pcsig_self;
           Parsetree.pcsig_fields = pcsig_fields }
          ->
         this#record "Ast_405.Parsetree.class_signature"
           [("pcsig_self", (this#lift_Parsetree_core_type pcsig_self));
           ("pcsig_fields",
             (this#list
                (List.map this#lift_Parsetree_class_type_field pcsig_fields)))] :
      Parsetree.class_signature -> 'res)
    method lift_Parsetree_class_type_field :
      Parsetree.class_type_field -> 'res=
      (fun
         { Parsetree.pctf_desc = pctf_desc; Parsetree.pctf_loc = pctf_loc;
           Parsetree.pctf_attributes = pctf_attributes }
          ->
         this#record "Ast_405.Parsetree.class_type_field"
           [("pctf_desc",
              (this#lift_Parsetree_class_type_field_desc pctf_desc));
           ("pctf_loc", (this#lift_Location_t pctf_loc));
           ("pctf_attributes",
             (this#lift_Parsetree_attributes pctf_attributes))] : Parsetree.class_type_field
                                                                    ->
                                                                    'res)
    method lift_Parsetree_class_type_field_desc :
      Parsetree.class_type_field_desc -> 'res=
      (function
       | Parsetree.Pctf_inherit x0 ->
           this#constr "Ast_405.Parsetree.class_type_field_desc"
             ("Pctf_inherit", [this#lift_Parsetree_class_type x0])
       | Parsetree.Pctf_val x0 ->
           this#constr "Ast_405.Parsetree.class_type_field_desc"
             ("Pctf_val",
               [(let (x0,x1,x2,x3) = x0  in
                 this#tuple
                   [this#lift_Asttypes_loc this#string x0;
                   this#lift_Asttypes_mutable_flag x1;
                   this#lift_Asttypes_virtual_flag x2;
                   this#lift_Parsetree_core_type x3])])
       | Parsetree.Pctf_method x0 ->
           this#constr "Ast_405.Parsetree.class_type_field_desc"
             ("Pctf_method",
               [(let (x0,x1,x2,x3) = x0  in
                 this#tuple
                   [this#lift_Asttypes_loc this#string x0;
                   this#lift_Asttypes_private_flag x1;
                   this#lift_Asttypes_virtual_flag x2;
                   this#lift_Parsetree_core_type x3])])
       | Parsetree.Pctf_constraint x0 ->
           this#constr "Ast_405.Parsetree.class_type_field_desc"
             ("Pctf_constraint",
               [(let (x0,x1) = x0  in
                 this#tuple
                   [this#lift_Parsetree_core_type x0;
                   this#lift_Parsetree_core_type x1])])
       | Parsetree.Pctf_attribute x0 ->
           this#constr "Ast_405.Parsetree.class_type_field_desc"
             ("Pctf_attribute", [this#lift_Parsetree_attribute x0])
       | Parsetree.Pctf_extension x0 ->
           this#constr "Ast_405.Parsetree.class_type_field_desc"
             ("Pctf_extension", [this#lift_Parsetree_extension x0]) :
      Parsetree.class_type_field_desc -> 'res)
    method lift_Parsetree_extension : Parsetree.extension -> 'res=
      (fun x  ->
         let (x0,x1) = x  in
         this#tuple
           [this#lift_Asttypes_loc this#string x0;
           this#lift_Parsetree_payload x1] : Parsetree.extension -> 'res)
    method lift_Parsetree_class_infos :
      'f0 . ('f0 -> 'res) -> 'f0 Parsetree.class_infos -> 'res= fun (type f0)
      ->
      (fun f0  ->
         fun
           { Parsetree.pci_virt = pci_virt;
             Parsetree.pci_params = pci_params;
             Parsetree.pci_name = pci_name; Parsetree.pci_expr = pci_expr;
             Parsetree.pci_loc = pci_loc;
             Parsetree.pci_attributes = pci_attributes }
            ->
           this#record "Ast_405.Parsetree.class_infos"
             [("pci_virt", (this#lift_Asttypes_virtual_flag pci_virt));
             ("pci_params",
               (this#list
                  (List.map
                     (fun x  ->
                        let (x0,x1) = x  in
                        this#tuple
                          [this#lift_Parsetree_core_type x0;
                          this#lift_Asttypes_variance x1]) pci_params)));
             ("pci_name", (this#lift_Asttypes_loc this#string pci_name));
             ("pci_expr", (f0 pci_expr));
             ("pci_loc", (this#lift_Location_t pci_loc));
             ("pci_attributes",
               (this#lift_Parsetree_attributes pci_attributes))] : (f0 ->
                                                                    'res) ->
                                                                    f0
                                                                    Parsetree.class_infos
                                                                    ->
                                                                    'res)
    method lift_Asttypes_virtual_flag : Asttypes.virtual_flag -> 'res=
      (function
       | Asttypes.Virtual  ->
           this#constr "Ast_405.Asttypes.virtual_flag" ("Virtual", [])
       | Asttypes.Concrete  ->
           this#constr "Ast_405.Asttypes.virtual_flag" ("Concrete", []) : Asttypes.virtual_flag
                                                                    ->
                                                                    'res)
    method lift_Parsetree_include_description :
      Parsetree.include_description -> 'res=
      (fun x  ->
         this#lift_Parsetree_include_infos this#lift_Parsetree_module_type x :
      Parsetree.include_description -> 'res)
    method lift_Parsetree_include_infos :
      'f0 . ('f0 -> 'res) -> 'f0 Parsetree.include_infos -> 'res= fun (type
      f0) ->
      (fun f0  ->
         fun
           { Parsetree.pincl_mod = pincl_mod;
             Parsetree.pincl_loc = pincl_loc;
             Parsetree.pincl_attributes = pincl_attributes }
            ->
           this#record "Ast_405.Parsetree.include_infos"
             [("pincl_mod", (f0 pincl_mod));
             ("pincl_loc", (this#lift_Location_t pincl_loc));
             ("pincl_attributes",
               (this#lift_Parsetree_attributes pincl_attributes))] :
      (f0 -> 'res) -> f0 Parsetree.include_infos -> 'res)
    method lift_Parsetree_open_description :
      Parsetree.open_description -> 'res=
      (fun
         { Parsetree.popen_lid = popen_lid;
           Parsetree.popen_override = popen_override;
           Parsetree.popen_loc = popen_loc;
           Parsetree.popen_attributes = popen_attributes }
          ->
         this#record "Ast_405.Parsetree.open_description"
           [("popen_lid",
              (this#lift_Asttypes_loc this#lift_Longident_t popen_lid));
           ("popen_override",
             (this#lift_Asttypes_override_flag popen_override));
           ("popen_loc", (this#lift_Location_t popen_loc));
           ("popen_attributes",
             (this#lift_Parsetree_attributes popen_attributes))] : Parsetree.open_description
                                                                    ->
                                                                    'res)
    method lift_Asttypes_override_flag : Asttypes.override_flag -> 'res=
      (function
       | Asttypes.Override  ->
           this#constr "Ast_405.Asttypes.override_flag" ("Override", [])
       | Asttypes.Fresh  ->
           this#constr "Ast_405.Asttypes.override_flag" ("Fresh", []) : Asttypes.override_flag
                                                                  ->
                                                                  'res)
    method lift_Parsetree_module_type_declaration :
      Parsetree.module_type_declaration -> 'res=
      (fun
         { Parsetree.pmtd_name = pmtd_name; Parsetree.pmtd_type = pmtd_type;
           Parsetree.pmtd_attributes = pmtd_attributes;
           Parsetree.pmtd_loc = pmtd_loc }
          ->
         this#record "Ast_405.Parsetree.module_type_declaration"
           [("pmtd_name", (this#lift_Asttypes_loc this#string pmtd_name));
           ("pmtd_type",
             (this#lift_option this#lift_Parsetree_module_type pmtd_type));
           ("pmtd_attributes",
             (this#lift_Parsetree_attributes pmtd_attributes));
           ("pmtd_loc", (this#lift_Location_t pmtd_loc))] : Parsetree.module_type_declaration
                                                              -> 'res)
    method lift_Parsetree_module_declaration :
      Parsetree.module_declaration -> 'res=
      (fun
         { Parsetree.pmd_name = pmd_name; Parsetree.pmd_type = pmd_type;
           Parsetree.pmd_attributes = pmd_attributes;
           Parsetree.pmd_loc = pmd_loc }
          ->
         this#record "Ast_405.Parsetree.module_declaration"
           [("pmd_name", (this#lift_Asttypes_loc this#string pmd_name));
           ("pmd_type", (this#lift_Parsetree_module_type pmd_type));
           ("pmd_attributes",
             (this#lift_Parsetree_attributes pmd_attributes));
           ("pmd_loc", (this#lift_Location_t pmd_loc))] : Parsetree.module_declaration
                                                            -> 'res)
    method lift_Parsetree_type_extension : Parsetree.type_extension -> 'res=
      (fun
         { Parsetree.ptyext_path = ptyext_path;
           Parsetree.ptyext_params = ptyext_params;
           Parsetree.ptyext_constructors = ptyext_constructors;
           Parsetree.ptyext_private = ptyext_private;
           Parsetree.ptyext_attributes = ptyext_attributes }
          ->
         this#record "Ast_405.Parsetree.type_extension"
           [("ptyext_path",
              (this#lift_Asttypes_loc this#lift_Longident_t ptyext_path));
           ("ptyext_params",
             (this#list
                (List.map
                   (fun x  ->
                      let (x0,x1) = x  in
                      this#tuple
                        [this#lift_Parsetree_core_type x0;
                        this#lift_Asttypes_variance x1]) ptyext_params)));
           ("ptyext_constructors",
             (this#list
                (List.map this#lift_Parsetree_extension_constructor
                   ptyext_constructors)));
           ("ptyext_private",
             (this#lift_Asttypes_private_flag ptyext_private));
           ("ptyext_attributes",
             (this#lift_Parsetree_attributes ptyext_attributes))] : Parsetree.type_extension
                                                                    ->
                                                                    'res)
    method lift_Parsetree_extension_constructor :
      Parsetree.extension_constructor -> 'res=
      (fun
         { Parsetree.pext_name = pext_name; Parsetree.pext_kind = pext_kind;
           Parsetree.pext_loc = pext_loc;
           Parsetree.pext_attributes = pext_attributes }
          ->
         this#record "Ast_405.Parsetree.extension_constructor"
           [("pext_name", (this#lift_Asttypes_loc this#string pext_name));
           ("pext_kind",
             (this#lift_Parsetree_extension_constructor_kind pext_kind));
           ("pext_loc", (this#lift_Location_t pext_loc));
           ("pext_attributes",
             (this#lift_Parsetree_attributes pext_attributes))] : Parsetree.extension_constructor
                                                                    ->
                                                                    'res)
    method lift_Parsetree_extension_constructor_kind :
      Parsetree.extension_constructor_kind -> 'res=
      (function
       | Parsetree.Pext_decl (x0,x1) ->
           this#constr "Ast_405.Parsetree.extension_constructor_kind"
             ("Pext_decl",
               [this#lift_Parsetree_constructor_arguments x0;
               this#lift_option this#lift_Parsetree_core_type x1])
       | Parsetree.Pext_rebind x0 ->
           this#constr "Ast_405.Parsetree.extension_constructor_kind"
             ("Pext_rebind",
               [this#lift_Asttypes_loc this#lift_Longident_t x0]) : Parsetree.extension_constructor_kind
                                                                    ->
                                                                    'res)
    method lift_Parsetree_type_declaration :
      Parsetree.type_declaration -> 'res=
      (fun
         { Parsetree.ptype_name = ptype_name;
           Parsetree.ptype_params = ptype_params;
           Parsetree.ptype_cstrs = ptype_cstrs;
           Parsetree.ptype_kind = ptype_kind;
           Parsetree.ptype_private = ptype_private;
           Parsetree.ptype_manifest = ptype_manifest;
           Parsetree.ptype_attributes = ptype_attributes;
           Parsetree.ptype_loc = ptype_loc }
          ->
         this#record "Ast_405.Parsetree.type_declaration"
           [("ptype_name", (this#lift_Asttypes_loc this#string ptype_name));
           ("ptype_params",
             (this#list
                (List.map
                   (fun x  ->
                      let (x0,x1) = x  in
                      this#tuple
                        [this#lift_Parsetree_core_type x0;
                        this#lift_Asttypes_variance x1]) ptype_params)));
           ("ptype_cstrs",
             (this#list
                (List.map
                   (fun x  ->
                      let (x0,x1,x2) = x  in
                      this#tuple
                        [this#lift_Parsetree_core_type x0;
                        this#lift_Parsetree_core_type x1;
                        this#lift_Location_t x2]) ptype_cstrs)));
           ("ptype_kind", (this#lift_Parsetree_type_kind ptype_kind));
           ("ptype_private", (this#lift_Asttypes_private_flag ptype_private));
           ("ptype_manifest",
             (this#lift_option this#lift_Parsetree_core_type ptype_manifest));
           ("ptype_attributes",
             (this#lift_Parsetree_attributes ptype_attributes));
           ("ptype_loc", (this#lift_Location_t ptype_loc))] : Parsetree.type_declaration
                                                                -> 'res)
    method lift_Asttypes_private_flag : Asttypes.private_flag -> 'res=
      (function
       | Asttypes.Private  ->
           this#constr "Ast_405.Asttypes.private_flag" ("Private", [])
       | Asttypes.Public  ->
           this#constr "Ast_405.Asttypes.private_flag" ("Public", []) : Asttypes.private_flag
                                                                  ->
                                                                  'res)
    method lift_Parsetree_type_kind : Parsetree.type_kind -> 'res=
      (function
       | Parsetree.Ptype_abstract  ->
           this#constr "Ast_405.Parsetree.type_kind" ("Ptype_abstract", [])
       | Parsetree.Ptype_variant x0 ->
           this#constr "Ast_405.Parsetree.type_kind"
             ("Ptype_variant",
               [this#list
                  (List.map this#lift_Parsetree_constructor_declaration x0)])
       | Parsetree.Ptype_record x0 ->
           this#constr "Ast_405.Parsetree.type_kind"
             ("Ptype_record",
               [this#list (List.map this#lift_Parsetree_label_declaration x0)])
       | Parsetree.Ptype_open  ->
           this#constr "Ast_405.Parsetree.type_kind" ("Ptype_open", []) : Parsetree.type_kind
                                                                    ->
                                                                    'res)
    method lift_Parsetree_constructor_declaration :
      Parsetree.constructor_declaration -> 'res=
      (fun
         { Parsetree.pcd_name = pcd_name; Parsetree.pcd_args = pcd_args;
           Parsetree.pcd_res = pcd_res; Parsetree.pcd_loc = pcd_loc;
           Parsetree.pcd_attributes = pcd_attributes }
          ->
         this#record "Ast_405.Parsetree.constructor_declaration"
           [("pcd_name", (this#lift_Asttypes_loc this#string pcd_name));
           ("pcd_args", (this#lift_Parsetree_constructor_arguments pcd_args));
           ("pcd_res",
             (this#lift_option this#lift_Parsetree_core_type pcd_res));
           ("pcd_loc", (this#lift_Location_t pcd_loc));
           ("pcd_attributes",
             (this#lift_Parsetree_attributes pcd_attributes))] : Parsetree.constructor_declaration
                                                                   ->
                                                                   'res)
    method lift_Parsetree_constructor_arguments :
      Parsetree.constructor_arguments -> 'res=
      (function
       | Parsetree.Pcstr_tuple x0 ->
           this#constr "Ast_405.Parsetree.constructor_arguments"
             ("Pcstr_tuple",
               [this#list (List.map this#lift_Parsetree_core_type x0)])
       | Parsetree.Pcstr_record x0 ->
           this#constr "Ast_405.Parsetree.constructor_arguments"
             ("Pcstr_record",
               [this#list (List.map this#lift_Parsetree_label_declaration x0)]) :
      Parsetree.constructor_arguments -> 'res)
    method lift_Parsetree_label_declaration :
      Parsetree.label_declaration -> 'res=
      (fun
         { Parsetree.pld_name = pld_name;
           Parsetree.pld_mutable = pld_mutable;
           Parsetree.pld_type = pld_type; Parsetree.pld_loc = pld_loc;
           Parsetree.pld_attributes = pld_attributes }
          ->
         this#record "Ast_405.Parsetree.label_declaration"
           [("pld_name", (this#lift_Asttypes_loc this#string pld_name));
           ("pld_mutable", (this#lift_Asttypes_mutable_flag pld_mutable));
           ("pld_type", (this#lift_Parsetree_core_type pld_type));
           ("pld_loc", (this#lift_Location_t pld_loc));
           ("pld_attributes",
             (this#lift_Parsetree_attributes pld_attributes))] : Parsetree.label_declaration
                                                                   ->
                                                                   'res)
    method lift_Asttypes_mutable_flag : Asttypes.mutable_flag -> 'res=
      (function
       | Asttypes.Immutable  ->
           this#constr "Ast_405.Asttypes.mutable_flag" ("Immutable", [])
       | Asttypes.Mutable  ->
           this#constr "Ast_405.Asttypes.mutable_flag" ("Mutable", []) : Asttypes.mutable_flag
                                                                   ->
                                                                   'res)
    method lift_Asttypes_variance : Asttypes.variance -> 'res=
      (function
       | Asttypes.Covariant  ->
           this#constr "Ast_405.Asttypes.variance" ("Covariant", [])
       | Asttypes.Contravariant  ->
           this#constr "Ast_405.Asttypes.variance" ("Contravariant", [])
       | Asttypes.Invariant  ->
           this#constr "Ast_405.Asttypes.variance" ("Invariant", []) : Asttypes.variance
                                                                 -> 'res)
    method lift_Parsetree_value_description :
      Parsetree.value_description -> 'res=
      (fun
         { Parsetree.pval_name = pval_name; Parsetree.pval_type = pval_type;
           Parsetree.pval_prim = pval_prim;
           Parsetree.pval_attributes = pval_attributes;
           Parsetree.pval_loc = pval_loc }
          ->
         this#record "Ast_405.Parsetree.value_description"
           [("pval_name", (this#lift_Asttypes_loc this#string pval_name));
           ("pval_type", (this#lift_Parsetree_core_type pval_type));
           ("pval_prim", (this#list (List.map this#string pval_prim)));
           ("pval_attributes",
             (this#lift_Parsetree_attributes pval_attributes));
           ("pval_loc", (this#lift_Location_t pval_loc))] : Parsetree.value_description
                                                              -> 'res)
    method lift_Asttypes_arg_label : Asttypes.arg_label -> 'res=
      (function
       | Asttypes.Nolabel  ->
           this#constr "Ast_405.Asttypes.arg_label" ("Nolabel", [])
       | Asttypes.Labelled x0 ->
           this#constr "Ast_405.Asttypes.arg_label" ("Labelled", [this#string x0])
       | Asttypes.Optional x0 ->
           this#constr "Ast_405.Asttypes.arg_label" ("Optional", [this#string x0]) :
      Asttypes.arg_label -> 'res)
    method lift_Asttypes_closed_flag : Asttypes.closed_flag -> 'res=
      (function
       | Asttypes.Closed  ->
           this#constr "Ast_405.Asttypes.closed_flag" ("Closed", [])
       | Asttypes.Open  -> this#constr "Ast_405.Asttypes.closed_flag" ("Open", []) :
      Asttypes.closed_flag -> 'res)
    method lift_Asttypes_label : Asttypes.label -> 'res=
      (this#string : Asttypes.label -> 'res)
    method lift_Asttypes_rec_flag : Asttypes.rec_flag -> 'res=
      (function
       | Asttypes.Nonrecursive  ->
           this#constr "Ast_405.Asttypes.rec_flag" ("Nonrecursive", [])
       | Asttypes.Recursive  ->
           this#constr "Ast_405.Asttypes.rec_flag" ("Recursive", []) : Asttypes.rec_flag
                                                                 -> 'res)
    method lift_Parsetree_constant : Parsetree.constant -> 'res=
      (function
       | Parsetree.Pconst_integer (x0,x1) ->
           this#constr "Ast_405.Parsetree.constant"
             ("Pconst_integer",
               [this#string x0; this#lift_option this#char x1])
       | Parsetree.Pconst_char x0 ->
           this#constr "Ast_405.Parsetree.constant" ("Pconst_char", [this#char x0])
       | Parsetree.Pconst_string (x0,x1) ->
           this#constr "Ast_405.Parsetree.constant"
             ("Pconst_string",
               [this#string x0; this#lift_option this#string x1])
       | Parsetree.Pconst_float (x0,x1) ->
           this#constr "Ast_405.Parsetree.constant"
             ("Pconst_float",
               [this#string x0; this#lift_option this#char x1]) : Parsetree.constant
                                                                    ->
                                                                    'res)
    method lift_option : 'f0 . ('f0 -> 'res) -> 'f0 option -> 'res= fun (type
      f0) ->
      (fun f0  ->
         function
         | None  -> this#constr "option" ("None", [])
         | Some x0 -> this#constr "option" ("Some", [f0 x0]) : (f0 -> 'res)
                                                                 ->
                                                                 f0 option ->
                                                                   'res)
    method lift_Longident_t : Longident.t -> 'res=
      (function
       | Longident.Lident x0 ->
           this#constr "Ast_405.Longident.t" ("Lident", [this#string x0])
       | Longident.Ldot (x0,x1) ->
           this#constr "Ast_405.Longident.t"
             ("Ldot", [this#lift_Longident_t x0; this#string x1])
       | Longident.Lapply (x0,x1) ->
           this#constr "Ast_405.Longident.t"
             ("Lapply", [this#lift_Longident_t x0; this#lift_Longident_t x1]) :
      Longident.t -> 'res)
    method lift_Asttypes_loc :
      'f0 . ('f0 -> 'res) -> 'f0 Asttypes.loc -> 'res= fun (type f0) ->
      (fun f0  ->
         fun { Asttypes.txt = txt; Asttypes.loc = loc }  ->
           this#record "Ast_405.Asttypes.loc"
             [("txt", (f0 txt)); ("loc", (this#lift_Location_t loc))] :
      (f0 -> 'res) -> f0 Asttypes.loc -> 'res)
    method lift_Location_t : Location.t -> 'res=
      (fun
         { Location.loc_start = loc_start; Location.loc_end = loc_end;
           Location.loc_ghost = loc_ghost }
          ->
         this#record "Ast_405.Location.t"
           [("loc_start", (this#lift_Lexing_position loc_start));
           ("loc_end", (this#lift_Lexing_position loc_end));
           ("loc_ghost", (this#lift_bool loc_ghost))] : Location.t -> 'res)
    method lift_bool : bool -> 'res=
      (function
       | false  -> this#constr "bool" ("false", [])
       | true  -> this#constr "bool" ("true", []) : bool -> 'res)
    method lift_Lexing_position : Lexing.position -> 'res=
      (fun
         { Lexing.pos_fname = pos_fname; Lexing.pos_lnum = pos_lnum;
           Lexing.pos_bol = pos_bol; Lexing.pos_cnum = pos_cnum }
          ->
         this#record "Lexing.position"
           [("pos_fname", (this#string pos_fname));
           ("pos_lnum", (this#int pos_lnum));
           ("pos_bol", (this#int pos_bol));
           ("pos_cnum", (this#int pos_cnum))] : Lexing.position -> 'res)
  end
