Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_deriving_iter.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140openPpxlibopenAsttypesopenParsetreeopenAst_helperopenPpx_deriving.Ast_convenienceletderiver="iter"letraise_errorf=Ppx_deriving.raise_errorfletct_attr_nobuiltin=Attribute.declare_flag"deriving.iter.nobuiltin"Attribute.Context.core_typeletargn=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]letrecexpr_of_typtyp=letloc=!Ast_helper.default_locinlettyp=Ppx_deriving.remove_pervasives~derivertypinmatchtypwith|_whenPpx_deriving.free_vars_in_core_typetyp=[]->[%exprfun_->()]|{ptyp_desc=Ptyp_constr_}->letbuiltin=not(Attribute.has_flagct_attr_nobuiltintyp)inbeginmatchbuiltin,typwith|true,[%type:[%t?typ]ref]->[%exprfunx->[%eexpr_of_typtyp]!x]|true,[%type:[%t?typ]list]->[%exprPpx_deriving_runtime.List.iter[%eexpr_of_typtyp]]|true,[%type:[%t?typ]array]->[%exprPpx_deriving_runtime.Array.iter[%eexpr_of_typtyp]]|true,[%type:[%t?typ]option]->[%exprfunctionNone->()|Somex->[%eexpr_of_typtyp]x]|true,[%type:([%t?ok_t],[%t?err_t])result]|true,[%type:([%t?ok_t],[%t?err_t])Result.result]->[%exprfunction|Okok->ignore([%eexpr_of_typok_t]ok)|Errorerr->ignore([%eexpr_of_typerr_t]err)]|_,{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}->[%exprfun[%pptuple(List.mapi(funi_->pvar(argni))typs)]->[%ePpx_deriving.(fold_exprsseq_reduce(List.mapi(funityp->app(expr_of_typtyp)[evar(argni)])typs))]];|{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)[%expr()]|Rtag(label,false,[typ])->Exp.case(variantlabel(Some[%pat?x]))[%expr[%eexpr_of_typtyp]x]|Rinherit({ptyp_desc=Ptyp_constr(tname,_)}astyp)->Exp.case[%pat?[%pPat.type_tname]asx][%expr[%eexpr_of_typtyp]x]|_->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}->[%expr([%eevar("poly_"^name)]:[%tTyp.varname]->unit)]|{ptyp_desc=Ptyp_alias(typ,name)}->[%exprfunx->[%eevar("poly_"^name)]x;[%eexpr_of_typtyp]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({ptype_loc=loc}astype_decl)=letiterator=matchtype_decl.ptype_kind,type_decl.ptype_manifestwith|Ptype_abstract,Somemanifest->expr_of_typmanifest|Ptype_variantconstrs,_->constrs|>List.map(fun{pcd_name={txt=name'};pcd_args}->matchpcd_argswith|Pcstr_tuple(typs)->letargs=List.mapi(funityp->app(expr_of_typtyp)[evar(argni)])typsinletresult=matchargswith|[]->[%expr()]|args->Ppx_deriving.(fold_exprsseq_reduce)argsinExp.case(pconstrname'(pattntyps))result|Pcstr_record(labels)->letargs=labels|>List.map(fun({pld_name={txt=n};_}aspld)->[%expr[%eexpr_of_label_declpld][%eevar(argln)]])inExp.case(pconstrrecname'(pattllabels))(Ppx_deriving.(fold_exprsseq_reduce)args))|>Exp.function_|Ptype_recordlabels,_->letfields=labels|>List.mapi(funi({pld_name={txt=name};_}aspld)->[%expr[%eexpr_of_label_declpld][%eExp.field(evar"x")(mknoloc(Lidentname))]])in[%exprfunx->[%ePpx_deriving.(fold_exprsseq_reduce)fields]]|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))(polymorphizeiterator)]letsig_of_typetype_decl=letloc=!Ast_helper.default_locinlettyp=Ppx_deriving.core_type_of_type_decltype_declinletpolymorphize=Ppx_deriving.poly_arrow_of_type_decl(funvar->[%type:[%tvar]->Ppx_deriving_runtime.unit])type_declin[Sig.value(Val.mk(mknoloc(Ppx_deriving.mangle_type_decl(`Prefixderiver)type_decl))(polymorphize[%type:[%ttyp]->Ppx_deriving_runtime.unit]))]letimpl_generator=Deriving.Generator.V2.make_noarg(fun~ctxt:_(_,type_decls)->[Str.valueRecursive(List.concat(List.mapstr_of_typetype_decls))])letintf_generator=Deriving.Generator.V2.make_noarg(fun~ctxt:_(_,type_decls)->List.concat(List.mapsig_of_typetype_decls))letderiving:Deriving.t=Deriving.addderiver~str_type_decl:impl_generator~sig_type_decl:intf_generator