123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162openBaseopenPpxlibtypeli=longidentletstring_expr~locs=Ast_helper.Exp.constant@@Pconst_string(s,loc,None)letpat2stringpat=letreclident=functionLidents|Ldot(_,s)->s|Lapply(_,i)->lidentiinletreclooppat=matchpat.ppat_descwith|Ppat_open(_,pat)|Ppat_lazypat|Ppat_constraint(pat,_)->looppat|Ppat_alias(_,ident)->ident.txt|Ppat_varident->ident.txt|Ppat_any->"_"|Ppat_variant(s,_)|Ppat_constant(Pconst_string(s,_,_))|Ppat_constant(Pconst_integer(s,_))|Ppat_constant(Pconst_float(s,_))->s|Ppat_constant(Pconst_charc)->Char.to_stringc|Ppat_tuplepats->"("^String.concat~sep:", "(List.map~f:looppats)^")"|Ppat_arraypats->"[|"^String.concat~sep:", "(List.map~f:looppats)^"|]"|Ppat_construct(c,_)->lidentc.txt|Ppat_interval(_,_)|Ppat_record(_,_)|Ppat_or(_,_)|Ppat_type_|Ppat_unpack_|Ppat_exception_|Ppat_extension_->""instring_expr~loc:pat.ppat_loc@@looppatletcollect_pat_identspat=letone=Set.singleton(moduleString)inletnone=Set.empty(moduleString)inletreclooppat=letallpats=Set.union_list(moduleString)@@List.map~f:looppatsinmatchpat.ppat_descwith|Ppat_open(_,pat)|Ppat_lazypat|Ppat_constraint(pat,_)->looppat|Ppat_alias(_,ident)->oneident.txt|Ppat_varident->oneident.txt|Ppat_any->none|Ppat_variant(_,None)->none|Ppat_variant(_,Somepat)->looppat|Ppat_constant_->none|Ppat_tuplepats|Ppat_arraypats->allpats|Ppat_construct(_,None)->none|Ppat_construct(_,Some(_,pat))->looppat|Ppat_interval(_,_)->none|Ppat_record(lpats,_)->all@@List.map~f:sndlpats|Ppat_or(p1,p2)->all[p1;p2]|Ppat_type_|Ppat_unpack_|Ppat_exception_|Ppat_extension_->noneinlooppatletexpr2string_or_emptyexpr=letreclident=function|Lidents->s|Ldot(li,s)->lidentli^"."^s|Lapply(_,i)->lidentiinletrecloopexpr=matchexpr.pexp_descwith|Pexp_open(_,expr)|Pexp_lazyexpr|Pexp_constraint(expr,_)->loopexpr|Pexp_identident->lidentident.txt|Pexp_variant(s,_)|Pexp_constant(Pconst_string(s,_,_))|Pexp_constant(Pconst_integer(s,_))|Pexp_constant(Pconst_float(s,_))->s|Pexp_constant(Pconst_charc)->Char.to_stringc|Pexp_tupleexprs->"("^String.concat~sep:", "(List.map~f:loopexprs)^")"|Pexp_arrayexprs->"[|"^String.concat~sep:", "(List.map~f:loopexprs)^"|]"|Pexp_construct(c,_)->lidentc.txt|_->""instring_expr~loc:expr.pexp_loc@@loopexprletopt_pat2string~loc=function|None->[%exprNone]|Somepat->[%exprSome[%epat2stringpat]]letopt_pat2string_list~loc=function|None->[%expr[]]|Somepat->[%expr[[%epat2stringpat]]]letopt_expr~loc=functionNone->[%exprNone]|Someexpr->[%exprSome[%eexpr]]letrecpat2exprpat=letmoduleAst=Ast_builder.Defaultinletloc=pat.ppat_locinmatchpat.ppat_descwith|Ppat_constraint(pat',typ)->Ast.pexp_constraint~loc(pat2exprpat')typ|Ppat_alias(_,ident)|Ppat_varident->Ast.pexp_ident~loc{identwithtxt=Lidentident.txt}|Ppat_variant(ident,e_opt)->Ast.pexp_variant~locident@@Option.mape_opt~f:pat2expr|Ppat_constantc->Ast.pexp_constant~locc|Ppat_construct(c,None)->Ast.pexp_construct~loccNone|Ppat_construct(c,Some([],args))->Ast.pexp_construct~locc@@Some(pat2exprargs)|Ppat_record(fields,Asttypes.Closed)->Ast.pexp_record~loc(List.mapfields~f:(fun(label,field)->(label,pat2exprfield)))None|Ppat_tuplepats->Ast.pexp_tuple~loc@@List.mappats~f:pat2expr|Ppat_arraypats->Ast.pexp_array~loc@@List.mappats~f:pat2expr|_->Ast.pexp_extension~loc@@Location.error_extensionf~loc"ppx_ocannl does not recognize/support the pattern; maybe try using an `as` alias."letalphanum_regexp=Str.regexp"^[^a-zA-Z0-9]+$"letis_operatorident=Str.string_matchalphanum_regexpident0letis_assignmentident=String.lengthident>1&&Char.equalident.[0]'='&&(not@@List.mem["==";"===";"=>";"==>";"=>>"]ident~equal:String.equal)letlet_opt~locvbsexpr=ifMap.is_emptyvbsthenexprelseAst_helper.Exp.let_~locNonrecursive(Map.datavbs)exprletno_vbs=Map.empty(moduleString)letreduce_vbss=List.reduce_exn~f:(Map.merge_skewed~combine:(fun~key:__v1v2->v2))letexpr_expander_with_punningtranslate~loc~path:_payload=matchpayloadwith|{pexp_desc=Pexp_let(recflag,bindings,body);_}->(* We are at the %op annotation level: do not tranlsate the body. *)letvbss,bindings=List.unzip@@List.mapbindings~f:(funvb->letvbs,v=translate?ident_label:(Somevb.pvb_pat)vb.pvb_exprin(vbs,{vbwithpvb_expr=v}))inletexpr={payloadwithpexp_desc=Pexp_let(recflag,bindings,body)}inlet_opt~loc(reduce_vbssvbss)expr|expr->letvbs,expr=translate?ident_label:Noneexprinlet_opt~locvbsexprletflatten_str~loc~path:_items=matchitemswith|[x]->x|_->Ast_helper.Str.include_{pincl_mod=Ast_helper.Mod.structureitems;pincl_loc=loc;pincl_attributes=[]}lettranslate_strtranslate({pstr_desc;pstr_loc=loc;_}asstr)=matchpstr_descwith|Pstr_eval(expr,attrs)->letexpr=expr_expander_with_punningtranslate~loc~path:()exprin{strwithpstr_desc=Pstr_eval(expr,attrs)}|Pstr_value(recf,bindings)->letfvb=letloc=vb.pvb_locinletvbs,v=translate?ident_label:(Somevb.pvb_pat)vb.pvb_exprinletv=let_opt~locvbsvin{vbwithpvb_expr=v}in{strwithpstr_desc=Pstr_value(recf,List.mapbindings~f)}|_->strletstr_expander_with_punningtranslate~loc~path(payload:structure_itemlist)=flatten_str~loc~path@@List.mappayload~f:(translate_strtranslate)