Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_deriving_fold.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154# 1 "ppx_deriving_fold.cppo.ml"openPpxlibopenAsttypesopenParsetreeopenAst_helperopenPpx_deriving.Ast_convenienceletderiver="fold"letraise_errorf=Ppx_deriving.raise_errorfletparse_optionsoptions=options|>List.iter(fun(name,expr)->matchnamewith|_->raise_errorf~loc:expr.pexp_loc"%s does not support option %s"derivername)letattr_nobuiltinattrs=Ppx_deriving.(attrs|>attr~deriver"nobuiltin"|>Arg.get_flag~deriver)letargn=Printf.sprintf"a%d"letargl=Printf.sprintf"a%s"letpattntyps=List.mapi(funi_->pvar(argni))typsletpattllabels=List.map(fun{pld_name={txt=n}}->n,pvar(argln))labelsletpconstrrecnamefields=pconstrname[precord~closed:Closedfields]letreduce_accab=letloc=!Ast_helper.default_locin[%exprletacc=[%ea]in[%eb]]letrecexpr_of_typtyp=letloc=typ.ptyp_locinlettyp=Ppx_deriving.remove_pervasives~derivertypinmatchtypwith|_whenPpx_deriving.free_vars_in_core_typetyp=[]->[%exprfunacc_->acc]|{ptyp_desc=Ptyp_constr({txt=lid},args)}->letbuiltin=not(attr_nobuiltintyp.ptyp_attributes)inbeginmatchbuiltin,typwith|true,[%type:[%t?typ]ref]->[%exprfunaccx->[%eexpr_of_typtyp]acc!x]|true,[%type:[%t?typ]list]->[%exprPpx_deriving_runtime.List.fold_left[%eexpr_of_typtyp]]|true,[%type:[%t?typ]array]->[%exprPpx_deriving_runtime.Array.fold_left[%eexpr_of_typtyp]]|true,[%type:[%t?typ]option]->[%exprfunacc->functionNone->acc|Somex->[%eexpr_of_typtyp]accx]|true,([%type:([%t?ok_t],[%t?err_t])result]|[%type:([%t?ok_t],[%t?err_t])Result.result])->[%exprfunacc->function|Result.Okok->[%eexpr_of_typok_t]accok|Result.Errorerr->[%eexpr_of_typerr_t]accerr]|_,{ptyp_desc=Ptyp_constr({txt=lid},args)}->app(Exp.ident(mknoloc(Ppx_deriving.mangle_lid(`Prefixderiver)lid)))(List.mapexpr_of_typargs)|_->assertfalseend|{ptyp_desc=Ptyp_tupletyps}->letargs=typs|>List.mapi(funityp->[%expr[%eexpr_of_typtyp]acc[%eevar(argni)]])in[%exprfunacc[%pptuple(List.mapi(funi_->pvar(argni))typs)]->[%ePpx_deriving.(fold_exprs~unit:[%expracc]reduce_accargs)]];|{ptyp_desc=Ptyp_variant(fields,_,_);ptyp_loc}->letcases=fields|>List.map(funfield->letvariantlabelpopt=Pat.variantlabel.txtpoptinmatchfield.prf_descwith|Rtag(label,true(*empty*),[])->Exp.case(variantlabelNone)[%expracc]|Rtag(label,false,[typ])->Exp.case(variantlabel(Some[%pat?x]))[%expr[%eexpr_of_typtyp]accx]|Rinherit({ptyp_desc=Ptyp_constr(tname,_)}astyp)->Exp.case[%pat?[%pPat.type_tname]asx][%expr[%eexpr_of_typtyp]accx]|_->raise_errorf~loc:ptyp_loc"%s cannot be derived for %s"deriver(Ppx_deriving.string_of_core_typetyp))inExp.function_cases|{ptyp_desc=Ptyp_varname}->evar("poly_"^name)|{ptyp_desc=Ptyp_alias(typ,name)}->[%exprfunaccx->[%eevar("poly_"^name)]([%eexpr_of_typtyp]accx)x]|{ptyp_loc}->raise_errorf~loc:ptyp_loc"%s cannot be derived for %s"deriver(Ppx_deriving.string_of_core_typetyp)andexpr_of_label_decl{pld_type;pld_attributes}=letattrs=pld_type.ptyp_attributes@pld_attributesinexpr_of_typ{pld_typewithptyp_attributes=attrs}letstr_of_type~options~path({ptype_loc=loc}astype_decl)=parse_optionsoptions;letmapper=matchtype_decl.ptype_kind,type_decl.ptype_manifestwith|Ptype_abstract,Somemanifest->expr_of_typmanifest|Ptype_variantconstrs,_->letcases=constrs|>List.map(fun{pcd_name={txt=name'};pcd_args}->matchpcd_argswith|Pcstr_tuple(typs)->letargs=typs|>List.mapi(funityp->[%expr[%eexpr_of_typtyp]acc[%eevar(argni)]])inExp.case(pconstrname'(pattntyps))Ppx_deriving.(fold_exprs~unit:[%expracc]reduce_accargs)|Pcstr_record(labels)->letargs=labels|>List.map(fun({pld_name={txt=n};_}aspld)->[%expr[%eexpr_of_label_declpld]acc[%eevar(argln)]])inExp.case(pconstrrecname'(pattllabels))Ppx_deriving.(fold_exprs~unit:[%expracc]reduce_accargs))in[%exprfunacc->[%eExp.function_cases]]|Ptype_recordlabels,_->letfields=labels|>List.mapi(funi({pld_name={txt=name};_}aspld)->[%expr[%eexpr_of_label_declpld]acc[%eExp.field(evar"x")(mknoloc(Lidentname))]])in[%exprfunaccx->[%ePpx_deriving.(fold_exprs~unit:[%expracc]reduce_accfields)]]|Ptype_abstract,None->raise_errorf~loc"%s cannot be derived for fully abstract types"deriver|Ptype_open,_->raise_errorf~loc"%s cannot be derived for open types"deriverinletpolymorphize=Ppx_deriving.poly_fun_of_type_decltype_declin[Vb.mk~attrs:[Ppx_deriving.attr_warning[%expr"-39"]](pvar(Ppx_deriving.mangle_type_decl(`Prefixderiver)type_decl))(polymorphizemapper)]letsig_of_type~options~pathtype_decl=parse_optionsoptions;letloc=type_decl.ptype_locinlettyp=Ppx_deriving.core_type_of_type_decltype_declinletvars=(List.map(funtyvar->tyvar.txt))(Ppx_deriving.free_vars_in_core_typetyp)inletacc=Typ.var~locPpx_deriving.(fresh_varvars)inletpolymorphize=Ppx_deriving.poly_arrow_of_type_decl(funvar->[%type:[%tacc]->[%tvar]->[%tacc]])type_declin[Sig.value~loc(Val.mk(mkloc(Ppx_deriving.mangle_type_decl(`Prefixderiver)type_decl)loc)(polymorphize[%type:[%tacc]->[%ttyp]->[%tacc]]))]let()=Ppx_deriving.(register(createderiver~core_type:expr_of_typ~type_decl_str:(fun~options~pathtype_decls->[Str.valueRecursive(List.concat(List.map(str_of_type~options~path)type_decls))])~type_decl_sig:(fun~options~pathtype_decls->List.concat(List.map(sig_of_type~options~path)type_decls))()))