123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403openPpxlibopenAst_builder.DefaultopenUtilsletcase_expr~loc?(is_record=false)?kind?(typ=`Cons)~nameenc=letpconstruct~locp=matchtypwith|`Cons->ppat_construct~loc(llid~locname)p|`Variant->ppat_variant~locnamepinleteconstruct~loce=matchtypwith|`Cons->pexp_construct~loc(llid~locname)e|`Variant->pexp_variant~locnameeinletkind_enc=matchkindwith|None->None|Somekind->Some(enc_apply~loc"obj1"[enc_apply~loc"req"[estring~loc"kind";enc_apply~loc"constant"[estring~lockind]]])inletv=matchencwithNone->None|Some_->Some(new_var())inletenc=matchkind_enc,encwith|None,None->enc_var~loc"empty"|None,Someenc|Someenc,None->enc|Somekenc,Someenc->enc_apply~loc"merge_objs"[kenc;enc]inletrhs_to=matchis_record,v,kindwith|true,Somev,None->esome~loc(econstruct(Some(evar~locv)))|true,Somev,Some_->esome~loc(pexp_tuple[eunit~loc;econstruct~loc(Some(evar~locv))])|_,None,_->esome~loceunit|_,Somev,None->esome~loc(evarv)|_,Somev,Some_->esome~loc(pexp_tuple[eunit~loc;evar~locv])inletconstruct=pexp_function~loc[case~guard:None~lhs:(pconstruct~loc(Option.map(pvar~loc)v))~rhs:rhs_to;case~guard:None~lhs:(ppat_any~loc)~rhs:(enone~loc)]inletdestruct=matchis_record,v,kindwith|true,Somev,_->pexp_function~loc[case~guard:None~lhs:(matchkindwith|None->pconstruct~loc(Some(pvar~locv))|Some_->ppat_tuple~loc[punit~loc;pconstruct~loc(Some(pvar~locv))])~rhs:(econstruct~loc(Some(evar~locv)));case~guard:None~lhs:(ppat_any~loc)~rhs:(eapply~loc(evar~loc"failwith")[estring~loc"wrong local record"])]|_,None,_->pexp_fun~loc(punit~loc)(econstruct~locNone)|_,Somev,None->pexp_fun~loc(pvar~locv)(econstruct~loc(Some(evar~locv)))|_,Somev,Some_->pexp_fun~loc(ppat_tuple~loc[punit~loc;pvar~locv])(econstruct~loc(Some(evar~locv)))inenc,construct,destructletdef_expr~loc?title?description?schema~namee=letdescribee=lettitle=Option.fold~none:(enone~loc)~some:(fune->esome~loc(fun~loc:_->e))titleinletdescription=Option.fold~none:(enone~loc)~some:(fune->esome~loc(fun~loc:_->e))descriptioninpexp_apply~loc(evar~loc(enc_mod"def"))[Nolabel,estring~locname;Optional"title",title;Optional"description",description;Nolabel,e]inletadd_schemaeschema=pexp_apply~loc(evar~loc(enc_mod"conv"))[Nolabel,pexp_fun~loc(pvar~loc"x")(evar~loc"x");Nolabel,pexp_fun~loc(pvar~loc"x")(evar~loc"x");Labelled"schema",schema;Nolabel,e]inmatchtitle,description,schemawith|None,None,None->e|None,None,Someschema->add_schemaeschema|_,_,None->describee|_,_,Someschema->describe(add_schemaeschema)letignore_expr~loc?(ign=false)e=ifnotigntheneelseenc_apply~loc"conv"[pexp_fun~loc(pvar~loc"x")(pexp_tuple~loc[evar~loc"x";eunit~loc]);pexp_fun~loc(ppat_tuple~loc[pvar~loc"x";punit~loc])(evar~loc"x");enc_apply~loc"merge_objs"[e;enc_var~loc"unit"]]letmu_expr~loc?(mu=false)~namee=ifnotmutheneelsepexp_fun~loc(pvar~loc(enc_namename))eletresult_expr~locokerr=enc_apply~loc"union"[elist~loc[enc_apply~loc"case"[ok;pexp_function~loc[case~guard:None~lhs:(ppat_construct~loc(llid~loc"Ok")(Some(pvar~loc"x")))~rhs:(esome~loc(evar"x"));case~guard:None~lhs:(ppat_any~loc)~rhs:(enone~loc)];pexp_fun~loc(pvar~loc"x")(pexp_construct~loc(llid~loc"Ok")(Some(evar~loc"x")))];enc_apply~loc"case"[enc_apply~loc"obj1"[enc_apply~loc"req"[estring~loc"error";err]];pexp_function~loc[case~guard:None~lhs:(ppat_construct~loc(llid~loc"Error")(Some(pvar~loc"x")))~rhs:(esome~loc(evar"x"));case~guard:None~lhs:(ppat_any~loc)~rhs:(enone~loc)];pexp_fun~loc(pvar~loc"x")(pexp_construct~loc(llid~loc"Error")(Some(evar~loc"x")))]]]letreccore~loc?opt?assoc?enum?obj?enc?obj1?optionc=let{co_assoc;co_enum;co_obj;co_enc;_}=core_attrs?assoc?enum?obj?encc.ptyp_attributesinmatchco_encwith|Somee->e|None->lete=matchc.ptyp_descwith|Ptyp_any->enc_var~loc"any_ezjson_value"|Ptyp_varv->evar~loc("_"^enc_namev)|Ptyp_constr({txt;_},l)->constr~loc?opt?assoc:co_assoc?option(Longident.nametxt)l|Ptyp_tuplel->tuple~loc?obj:co_obj?optionl|Ptyp_variant(l,_,_)->variant~loc?enum:co_enum?optionl|Ptyp_object(l,_)->object_expr~loc?optionl|_->raise_error~loc"not handled"inmatchobj1with|None->e|Somef->enc_apply~loc"obj1"[enc_apply~loc"req"[estring~locf;e]]andcore_opt~loc?optionc=let{co_exclude;co_merge;_}=core_attrsc.ptyp_attributesinmatchco_excludewith|Somee->`Excludee|None->`Include(core~loc?optionc,co_merge)andconstr~loc?(opt=false)?(assoc=false)?optionsl=matchs,lwith|"int",_|"Int.t",_->enc_var~loc"int"|"int32",_|"Int32.t",_->enc_var~loc"int32"|"int64",_|"Int64.t",_->enc_var~loc"int53"|"float",_|"Float.t",_->enc_var~loc"float"|"bool",_|"Bool.t",_->enc_var~loc"bool"|"string",_|"String.t",_->enc_var~loc"string"|"bytes",_|"Bytes.t",_->enc_var~loc"bytes"|"list",[{ptyp_desc=Ptyp_tuple[{ptyp_desc=Ptyp_constr({txt;_},[]);_};c];_}]whenassoc&&Longident.nametxt="string"->lete=core~loc?optioncinenc_apply~loc"assoc"[e]|"list",[c]|"List.t",[c]->lete=core~loc?optioncinenc_apply~loc"list"[e]|"array",[c]|"Array.t",[c]->lete=core~loc?optioncinenc_apply~loc"array"[e]|"option",[c]|"Option.t",[c]->lete=core~loc?optioncinifopttheneelseenc_apply~loc"option"[e]|"Json_repr.ezjsonm",_|"ezjsonm",_|"Ezjsonm.value",_->enc_var~loc"any_ezjson_value"|"Json_repr.any",_->enc_var~loc"any_value"|"unit",_->enc_var~loc"empty"|"result",[ok;err]|"Result.t",[ok;err]->letok=core~loc?optionokinleterr=core~loc?optionerrinresult_expr~locokerr|"Lazy.t",[c]->lete=core~loc?optioncinconv1~loc(fune->eapply~loc(evar~loc"Lazy.force")[e])(fune->eapply~loc(evar~loc"Lazy.from_val")[e])e|"char",_|"Char.t",_->conv1~loc(fune->eapply~loc(evar~loc"String.make")[eint~loc1;e])(fune->eapply~loc(evar~loc"String.get")[e;eint~loc0])(enc_var~loc"string")|"ref",[c]->lete=core~loc?optioncinconv1~loc(fune->pexp_field~loce(llid~loc"contents"))(fune->eapply~loc(evar~loc"ref")[e])e|_->letes=List.map(core~loc?option)lineapply~loc(evar~loc(enc_names))esandrow~loc?optionprf=let{cs_kind;cs_assoc;cs_enum;cs_obj1;_}=constructor_attrsprf.prf_attributesinmatchprf.prf_descwith|Rtag({txt;_},_,[])->case_expr~loc?kind:cs_kind~typ:`Variant~name:txtNone|Rtag({txt;_},_,h::_)->lete=core~loc?assoc:cs_assoc?enum:cs_enum?obj1:cs_obj1?optionhincase_expr~loc?kind:cs_kind~typ:`Variant~name:txt(Somee)|_->raise_error~loc"inherit of variant not handled"andvariant~loc?(enum=false)?optionl=letauxl=enc_apply~loc"union"[elist~loc(List.map(fun(enc,construct,destruct)->enc_apply~loc"case"[enc;construct;destruct])(List.map(row~loc?option)l))]inifenumthenmatchList.fold_left(funaccr->let{cs_key;_}=constructor_attrsr.prf_attributesinmatchacc,r.prf_descwith|Someacc,Rtag({txt;_},_,[])->letkey=matchcs_keywithSomek->k|None->String.uncapitalize_asciitxtinSome((pexp_tuple~loc[estring~lockey;pexp_variant~loctxtNone])::acc)|_->None)(Some[])lwith|None->auxl|Somel->enc_apply~loc"string_enum"[elist~loc(List.revl)]elseauxlandtuple~loc?(obj=false)?optionl=letl=ifobjthenList.mapi(funic->field~loc~name:(string_of_inti)?optionc)lelseList.map(core_opt~loc?option)linletesf=List.filter_map(function`Exclude_->None|`Includee->Somee)linifList.for_all(function`Exclude_->false|_->true)lthenobj_expr~loc~kind:(ifobjthen"obj"else"tup")esfelseletpat_to=ppat_tuple~loc(List.mapi(funi->function|`Exclude_->ppat_any~loc|`Include_->pvar~loc("t"^string_of_inti))l)inlet_,rev=List.fold_left(fun(i,acc)->function|`Exclude_->i+1,acc|`Include_->i+1,("t"^string_of_inti)::acc)(0,[])linlets=List.revrevinletexp_of=pexp_tuple~loc(List.mapi(funi->function|`Excludee->e|`Include_->evar~loc("t"^string_of_inti))l)inenc_apply~loc"conv"[pexp_fun~locpat_to(pexp_tuple~loc(List.map(evar~loc)s));pexp_fun~loc(ppat_tuple~loc(List.map(pvar~loc)s))exp_of;obj_expr~loc~kind:(ifobjthen"obj"else"tup")esf;]andfield~loc?attrs~name?optionc=letattrs=matchattrswithNone->c.ptyp_attributes|Somea->ainletopt=matchc.ptyp_descwith|Ptyp_constr({txt;_},_)whenLongident.nametxt="option"||Longident.nametxt="Option.t"->true|_->falseinlet{fa_field=(field,opt,dft);fa_key;fa_title;fa_description;fa_assoc;fa_enum;fa_exclude;fa_obj;fa_enc;fa_obj1;fa_merge}=field_attrs~key:name~opt?optionattrsinmatchfa_excludewith|None->letenc=core~loc~opt?assoc:fa_assoc?enum:fa_enum?obj:fa_obj?enc:fa_enc?obj1:fa_obj1?optionciniffa_mergethen`Include(enc,true)elselettitle=matchfa_titlewithNone->[]|Somet->[Labelled"title",t]inletdescription=matchfa_descriptionwithNone->[]|Somed->[Labelled"description",d]inletdft=matchdftwithNone->[]|Somee->[Nolabel,e]inletf=pexp_apply~loc(evar~loc(enc_modfield))(title@description@[Nolabel,estring~locfa_key;Nolabel,enc]@dft)in`Include(f,false)|Somee->`Excludeeandobject_expr~loc?option?ignl=letl=List.filter_map(funpof->letattrs=pof.pof_attributesinmatchpof.pof_descwith|Oinherit_->None|Otag({txt;_},c)->Some(txt,field~loc~attrs~name:txt?optionc))linletencs=List.filter_map(fun(n,e)->matchewith`Includee->Some(n,e)|_->None)linletnames,encs=List.splitencsinletconstruct=pexp_fun~loc(pvar~loc"x")@@pexp_tuple~loc(List.map(funtxt->pexp_send~loc(evar~loc"x"){txt;loc})names)inletdestruct=pexp_fun~loc(ppat_tuple~loc(List.map(pvar~loc)names))@@pexp_object~loc@@class_structure~self:(ppat_any~loc)~fields:(List.map(fun(txt,e)->matchewith|`Include_e->pcf_method~loc({txt;loc},Public,Cfk_concrete(Fresh,evar~loctxt))|`Excludee->pcf_method~loc({txt;loc},Public,Cfk_concrete(Fresh,e)))l)inlete=enc_apply~loc"conv"[construct;destruct;obj_expr~locencs]inignore_expr~loc?igneletrecord_label~loc?(rm_prefix=false)?optionpld=letname=pld.pld_name.txtinletname=ifnotrm_prefixthennameelsematchString.index_optname'_'with|None->name|Somei->String.subname(i+1)(String.lengthname-i-1)inlete=field~loc~attrs:pld.pld_attributes~name?optionpld.pld_typein(pld.pld_name.txt,e)letsame_prefixl=fst@@List.fold_left(fun(b,prefix)pld->ifnotbthenb,prefixelseletname=pld.pld_name.txtinmatchprefix,String.index_optname'_'with|None,None->true,Some""|None,Somei->true,Some(String.subname0i)|Some_,None|Some_,Some0->false,Some""|Someprefix,Somei->letpre=String.subname0iinifpre=prefixthentrue,Someprefixelsefalse,Some"")(true,None)lletrecord?local?ign?rm_prefix?option~locl=letrm_prefix=matchrm_prefixwith|None->same_prefixl|Someb->binletl=List.map(record_label~loc~rm_prefix?option)linletencs=List.filter_map(fun(_,e)->matchewith`Includee->Somee|_->None)linletlhs_to=ppat_record~loc(List.map(fun(n,e)->llid~locn,matchewith`Include_->pvar~locn|`Exclude_->ppat_any~loc)l)Closedinletrhs_to=pexp_tuple~loc(List.filter_map(fun(n,e)->matchewith|`Include_->Some(evar~locn)|`Exclude_->None)l)inletpat_of=ppat_tuple~loc(List.filter_map(fun(n,e)->matchewith`Include_->Some(pvar~locn)|`Exclude_->None)l)inletexp_of=pexp_record~loc(List.map(fun(n,e)->llid~locn,matchewith`Include_->evar~locn|`Excludee->e)l)Noneinletconstruct,destruct=matchlocalwith|None->pexp_fun~loclhs_torhs_to,pexp_fun~locpat_ofexp_of|Somecname->pexp_function~loc[case~guard:None~lhs:(ppat_construct~loc(llid~loccname)(Somelhs_to))~rhs:rhs_to;case~guard:None~lhs:(ppat_any~loc)~rhs:(eapply~loc(evar~loc"failwith")[estring~loc"wrong local record"])],pexp_fun~locpat_of(pexp_construct~loc(llid~loccname)@@(Someexp_of))inlete=enc_apply~loc"conv"[construct;destruct;obj_expr~locencs]inignore_expr~loc?igneletconstructor_label~loc?optionpcd=letcname=pcd.pcd_name.txtinlet{cs_kind;cs_assoc;cs_enum;cs_obj;cs_enc;cs_title;cs_description;cs_ignore;cs_rm_prefix;cs_obj1;_}=constructor_attrspcd.pcd_attributesinletenc,is_record=matchpcd.pcd_argswith|Pcstr_tuple[]->None,false|Pcstr_tuple[c]->Some(core~loc?assoc:cs_assoc?enum:cs_enum?obj:cs_obj?enc:cs_enc?obj1:cs_obj1?optionc),false|Pcstr_tuplel->Some(core~loc?obj:cs_obj?enc:cs_enc?option(ptyp_tuple~locl)),false|Pcstr_recordl->Some(record~local:cname~loc~ign:cs_ignore~rm_prefix:cs_rm_prefix?optionl),trueinletenc,to_,of_=case_expr~loc~is_record?kind:cs_kind~typ:`Cons~name:cnameencindef_expr~loc?title:cs_title?description:cs_description~name:cnameenc,to_,of_letconstructor~loc?(enum=false)?optionl=letauxl=enc_apply~loc"union"[elist~loc(List.map(fun(enc,to_,of_)->enc_apply~loc"case"[enc;to_;of_])(List.map(constructor_label~loc?option)l))]inifenumthenmatchList.fold_left(funaccpcd->let{cs_key;_}=constructor_attrspcd.pcd_attributesinmatchacc,pcd.pcd_argswith|Someacc,Pcstr_tuple[]->letkey=matchcs_keywithSomek->k|None->String.uncapitalize_asciipcd.pcd_name.txtinSome((pexp_tuple~loc[estring~lockey;pexp_construct~loc(llid~locpcd.pcd_name.txt)None])::acc)|_->None)(Some[])lwith|None->auxl|Somel->enc_apply~loc"string_enum"[elist~loc(List.revl)]elseauxlletexpressions~loc?enum?ign?mu?rm_prefix?title?description?schema?optiont=letname=t.ptype_name.txtinlete=matcht.ptype_kind,t.ptype_manifestwith|Ptype_abstract,None->raise_error~loc"abstract type"|Ptype_open,_->raise_error~loc"open type"|Ptype_abstract,Somem->debug~v:2"\tfrom manifest";core~loc?optionm|Ptype_variantl,_->debug~v:2"\tfrom variant";constructor~loc?enum?optionl|Ptype_recordl,_->debug~v:2"\tfrom record";record~loc?ign?rm_prefix?optionlinlete=def_expr~loc?title?description?schema~name:t.ptype_name.txteinmu_expr~loc?mu~namee