Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_deriving_map.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146openPpxlibopenAsttypesopenParsetreeopenAst_helperopenPpx_deriving.Ast_convenienceletderiver="map"letraise_errorf=Ppx_deriving.raise_errorfletct_attr_nobuiltin=Attribute.declare_flag"deriving.map.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]letconstrrecnamefields=constrname[recordfields]letrecexpr_of_typ?decltyp=letloc=typ.ptyp_locinlettyp=Ppx_deriving.remove_pervasives~derivertypinmatchtypwith|_whenPpx_deriving.free_vars_in_core_typetyp=[]->[%exprfunx->x]|{ptyp_desc=Ptyp_constr_}->letbuiltin=not(Attribute.has_flagct_attr_nobuiltintyp)inbeginmatchbuiltin,typwith|true,[%type:[%t?typ]list]->[%exprPpx_deriving_runtime.List.map[%eexpr_of_typ?decltyp]]|true,[%type:[%t?typ]array]->[%exprPpx_deriving_runtime.Array.map[%eexpr_of_typ?decltyp]]|true,[%type:[%t?typ]option]->[%exprfunctionNone->None|Somex->Some([%eexpr_of_typ?decltyp]x)]|true,([%type:([%t?ok_t],[%t?err_t])result]|[%type:([%t?ok_t],[%t?err_t])Result.result])->[%exprfunction|Okok->Ok([%eexpr_of_typ?declok_t]ok)|Errorerr->Error([%eexpr_of_typ?declerr_t]err)]|_,{ptyp_desc=Ptyp_constr({txt=lid},args)}->app(Exp.ident(mknoloc(Ppx_deriving.mangle_lid(`Prefixderiver)lid)))(List.map(expr_of_typ?decl)args)|_->assertfalseend|{ptyp_desc=Ptyp_tupletyps}->[%exprfun[%pptuple(List.mapi(funi_->pvar(argni))typs)]->[%etuple(List.mapi(funityp->app(expr_of_typ?decltyp)[evar(argni)])typs)]];|{ptyp_desc=Ptyp_variant(fields,_,_);ptyp_loc}->letcases=fields|>List.map(funfield->letpat_variantlabelpopt=Pat.variantlabel.txtpoptinletexp_variantlabelpopt=Exp.variantlabel.txtpoptinmatchfield.prf_descwith|Rtag(label,true(*empty*),[])->Exp.case(pat_variantlabelNone)(exp_variantlabelNone)|Rtag(label,false,[typ])->Exp.case(pat_variantlabel(Some[%pat?x]))(exp_variantlabel(Some[%expr[%eexpr_of_typ?decltyp]x]))|Rinherit({ptyp_desc=Ptyp_constr(tname,_)}astyp)->beginmatchdeclwith|None->raise_errorf"inheritance of polymorphic variants not supported"|Some(d)->Exp.case[%pat?[%pPat.type_tname]asx][%expr([%eexpr_of_typ?decltyp]x:>[%tPpx_deriving.core_type_of_type_decld])]end|_->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)}->[%exprfunx->[%eevar("poly_"^name)]([%eexpr_of_typ?decltyp]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?decl{pld_type;pld_attributes}=letattrs=pld_type.ptyp_attributes@pld_attributesinexpr_of_typ?decl{pld_typewithptyp_attributes=attrs}letstr_of_type({ptype_loc=loc}astype_decl)=letmapper=matchtype_decl.ptype_kind,type_decl.ptype_manifestwith|Ptype_abstract,Somemanifest->expr_of_typ~decl:type_declmanifest|Ptype_variantconstrs,_->constrs|>List.map(fun{pcd_name={txt=name'};pcd_args}->matchpcd_argswith|Pcstr_tuple(typs)->letargs=List.mapi(funityp->app(expr_of_typ~decl:type_decltyp)[evar(argni)])typsinExp.case(pconstrname'(pattntyps))(constrname'args)|Pcstr_record(labels)->letargs=labels|>List.map(fun({pld_name={txt=n};_}aspld)->n,[%expr[%eexpr_of_label_decl~decl:type_declpld][%eevar(argln)]])inExp.case(pconstrrecname'(pattllabels))(constrrecname'args))|>Exp.function_|Ptype_recordlabels,_->letfields=labels|>List.mapi(funi({pld_name={txt=name};_}aspld)->name,[%expr[%eexpr_of_label_decl~decl:type_declpld][%eExp.field(evar"x")(mknoloc(Lidentname))]])inletannot_typ=Ppx_deriving.core_type_of_type_decltype_declin[%exprfun(x:[%tannot_typ])->[%erecordfields]]|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_typetype_decl=letloc=type_decl.ptype_locinlettyp_arg,var_arg,bound=Ppx_deriving.instantiate[]type_declinlettyp_ret,var_ret,_=Ppx_deriving.instantiateboundtype_declinletarrow=Typ.arrowLabel.nolabelinletpoly_fns=List.map2(funar->[%type:[%tTyp.vara]->[%tTyp.varr]])var_argvar_retinlettyp=List.fold_rightarrowpoly_fns(arrowtyp_argtyp_ret)in[Sig.value(Val.mk(mknoloc(Ppx_deriving.mangle_type_decl(`Prefixderiver)type_decl))typ)]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