123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108openStdppxopenPrintfletmeth_of_constr=sprintf"c_%s"letself_arg_name="fself"letself_typ_param_name="self"letgcata_name_for_typname=Printf.sprintf"gcata_%s"nameletclass_name_for_typname=Printf.sprintf"%s_t"namelettrait_class_name_for_typ~traitname=class_name_for_typ(ifString.equaltrait""thennameelsePrintf.sprintf"%s_%s"traitname);;letfix_name~plugin_name:_=sprintf"%s_fix"(* 1st structure is planned to contain transformation function *)lettyp1_for_class_arg~plugin=sprintf"%s_t_%s_1"pluginlettrf_field~plugin=sprintf"%s_%s_trf"plugin(* Should contain object for transforming mutally declared type *)(* let typ2_for_class_arg ~plugin_name = sprintf "%s_t_%s_2" plugin_name *)letmut_ofield~plugin=sprintf"%s_o%s_func"plugin(* Largest. Containt not fully initialized stib class *)lettyp3_for_class_arg~plugin_name=sprintf"%s_t_%s_3"plugin_nameletmut_oclass_field~plugin=sprintf"%s_%s_func"pluginletextra_param_name="extra"letself_arg_name="fself"letall_trfs_together="all_trfs_together"letmake_extra_param=sprintf"%s_%s"extra_param_nameopenPpxlibletmeth_name_for_recordtdecl=sprintf"do_%s"tdecl.ptype_name.txtletfix_result_recordtraittdecls=assert(List.lengthtdecls>0);letname=(List.hdtdecls).ptype_name.txtinString.concat~sep:"_"[trait;"fix";name];;lettrf_functiontraits=Printf.sprintf"%s_%s"traitsletmake_stub_class_name~plugintname=sprintf"%s_%s_t_stub"plugintnameletstub_class_name~plugintdecl=make_stub_class_name~plugintdecl.ptype_name.txtletinit_trf_functiontraits=trf_functiontraits^"_0"letmake_fix_nametdecls=(* Let's use only first type for fix function definition *)assert(List.lengthtdecls>0);letnames=tdecls|>List.map~f:(fun{ptype_name={txt}}->txt)|>List.sort~cmp:String.compareinString.concat~sep:"_"("fix"::names);;letname_fix_generated_object~plugintdecl=sprintf"%s_o_%s"plugintdecl.ptype_name.txt;;letprereq_name~plugintail=sprintf"%s_%s_prereq"plugintailletmut_arg_composite=(* "mut_trfs_here" *)"call"letmut_arg_name~plugin=sprintf"for_%s_%s"plugin(* let mut_class_stubname ~plugin tdecl =
* sprintf "%s_%s_stub" plugin_name tdecl.ptype_name.txt *)letfix_resulttdecl=sprintf"fix_result_%s"tdecl.ptype_name.txtletcname_indextypname=String.capitalize_asciitypnameletmutuals_pack="_mutuals_pack"lethack_index_nametdeclss=assert(List.lengthtdecls>0);sprintf"%s_%s"s(List.hdtdecls).ptype_name.txt;;letfix_func_name?for_trait=matchfor_with|None->sprintf"%s_fix"trait|Somes->sprintf"%s_%s_fix"traits;;letfix_func_name_tdeclstraittdecls=assert(List.lengthtdecls>0);fix_func_name~for_:(List.hdtdecls).ptype_name.txttrait;;letfor_traits=sprintf"%s_%s"traitsletmeth_name_for_constructorattrsdefault_name=letgood_attr=letopenDeriving.Argsinattribute~name:(string"name")~payload:(single_expr_payload(estring__))inletcondattr=(* Stdlib.Sys.command "notify-send 'hecking an attribute of constructor' " |> ignore; *)Deriving.Args.parsegood_attrattr.attr_locattr(funs->(* let _ = Stdlib.Sys.command (Printf.sprintf "notify-send 'found %s'" s) in *)Somes)~on_error:(fun()->None)inList.find_mapattrs~f:cond|>Option.value~default:default_name|>meth_of_constr;;