Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_deriving_scad.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291open!Ppxlibopen!Baseopen!Ast_builder.Defaulttypetransform=|Translate|Scale|Rotate|RotateAbout|Quaternion|QuaternionAbout|Mirrorlettransforms=[Translate;Scale;Rotate;RotateAbout;Quaternion;QuaternionAbout;Mirror]lettransform_to_string=function|Translate->"translate"|Scale->"scale"|Rotate->"rotate"|RotateAbout->"rotate_about_pt"|Quaternion->"quaternion"|QuaternionAbout->"quaternion_about_pt"|Mirror->"mirror"lettransform_to_rev_params=function|Translate->["p"]|Scale->["s"]|Rotate->["r"]|RotateAbout->["p";"r"]|Quaternion->["q"]|QuaternionAbout->["p";"q"]|Mirror->["ax"]lettransform_drop_about=function|RotateAbout->Rotate|QuaternionAbout->Quaternion|trans->translettransform_to_namesis_unittransform=match(is_unit,transform)with|true,(Translate|Scale)->None|false,trans->Some(transform_to_stringtrans,transform_to_rev_paramstrans)|true,trans->lettrans'=transform_drop_abouttransinSome(transform_to_stringtrans',transform_to_rev_paramstrans')letoption_map~locexpr=[%exprfunctionSomeopt->Some([%eexpr]opt)|None->None]letresult_map~locexpr=[%exprfunctionOkok->Ok([%eexpr]ok)|err->err]letlist_map~locexpr=[%exprletrecauxacc=functionh::t->aux([%eexpr]h::acc)t|[]->accinaux[]]letfun_idnamelid=letmaybe_suffixs=ifString.equals"t"thennameelsePrintf.sprintf"%s_%s"namesinmatchlidwith|Lidents->Lident(maybe_suffixs)|Ldot(p,s)->Ldot(p,maybe_suffixs)|Lapply_->assertfalseletrecis_jane_map=function|Lidents->String.equal"Map"s|Ldot(p,_)->is_jane_mapp|Lapply(a,b)->is_jane_mapa||is_jane_mapbletmap~lid~jane~locexpr=letlid=ifjane&&is_jane_maplidthenLongident.Ldot(lident"Map","t")elselidinletid=pexp_ident~loc@@{loc;txt=fun_id"map"lid}inifjanethen[%expr[%eid]~f:[%eexpr]]else[%expr[%eid][%eexpr]]lettransform_expr~loc~jane~transform~kind(ct:core_type)=letis_unit=Option.is_some@@Attr.get_unitkindandignored=Option.is_some@@Attr.get_ignorekindandjane=(jane||(Option.is_some@@Attr.get_mapfkind))&&(not@@Option.is_some@@Attr.get_mapkind)andis_constr=function{ptyp_desc=Ptyp_constr_;_}->true|_->falseinletf(name,params)=letinner_exprnamelid=letparams=List.fold~init:[]~f:(funpsp->(Nolabel,pexp_ident~loc{loc;txt=lidentp})::ps)paramsandtxt=fun_idnamelidinpexp_apply~loc(pexp_ident~loc{loc;txt})paramsinletrecexprs_of_typfuncsnext=matchnextwith|[%type:[%t?typ]option]|[%type:[%t?typ]Option.t]->exprs_of_typ(option_map::funcs)typ|[%type:[%t?typ]list]|[%type:[%t?typ]List.t]->exprs_of_typ(list_map::funcs)typ|[%type:([%t?typ],[%t?_])result]|[%type:([%t?typ],[%t?_])Result.t]->exprs_of_typ(result_map::funcs)typ|[%type:[%t?_]Scad.t]|[%type:Scad.d2]|[%type:Scad.d3]|[%type:[%t?_]Scad_ml.Scad.t]|[%type:Scad_ml.Scad.d2]|[%type:Scad_ml.Scad.d3]->letlid=Longident.(Ldot(Ldot(lident"Scad_ml","Scad"),"t"))in(inner_exprnamelid,funcs)|{ptyp_desc=Ptyp_tuplects;_}->lettup_expr=letargnn=Printf.sprintf"arg%i"ninletargs=letarg_vari_=ppat_var~loc{loc;txt=argni}inppat_tuple~loc(List.mapi~f:arg_varcts)andsub_exprs=letfic=letapplyexprm=[%expr[%em~locexpr][%eevar~loc(argni)]]andexpr,maps=exprs_of_typ[]cinList.fold~f:apply~init:exprmapsinList.mapi~fctsin[%exprfun[%pargs]->[%epexp_tuple~locsub_exprs]]in(tup_expr,funcs)|{ptyp_desc=Ptyp_constr({txt=lid;_},[]);_}->(inner_exprnamelid,funcs)|{ptyp_desc=Ptyp_constr({txt=lid;_},(arg::_asargs));_}->ifList.for_all~f:(Fn.nonis_constr)argsthen(inner_exprnamelid,funcs)elseexprs_of_typ(map~lid~jane::funcs)arg|ct->Location.raise_errorf~loc"Unhandled type: %s"(string_of_core_typect)inletexpr,maps=exprs_of_typ[]ctinList.fold~f:(funexprm->[%expr[%em~locexpr]])~init:exprmapsinOption.(value_map~f~default:[%exprfuna->a](transform_to_namesis_unittransform>>=some_if(notignored)))lettransformer~loc~transform(td:type_declaration)expr=letname=letfunc_name=transform_to_stringtransforminppat_var~loc{loc;txt=(ifString.equaltd.ptype_name.txt"t"thenfunc_nameelsePrintf.sprintf"%s_%s"func_nametd.ptype_name.txt)}andfunc=letfexprtxt=pexp_fun~locNolabelNone(ppat_var~loc{loc;txt})exprandinit=pexp_fun~locNolabelNone(ppat_var~loc{loc;txt="t"})exprinList.fold~init~f(transform_to_rev_paramstransform)in[%strilet[%pname]=[%efunc]]letabstract_transformer~loc~jane~transform(td:type_declaration)ct=letexpr=transform_expr~loc~jane~transform~kind:(`Typect)ctintransformer~loc~transformtd[%expr[%eexpr]t]letrecord_transformer~loc~jane~transform(td:type_declaration)fields=letentry(ld:label_declaration)=letloc=ld.pld_locinletfield_id={loc;txt=lidentld.pld_name.txt}inletfield_expr=pexp_field~loc(pexp_ident~loc{loc;txt=lident"t"})field_idinletexpr=transform_expr~loc~jane~transform~kind:(`Fieldld)ld.pld_typein(field_id,[%expr[%eexpr][%efield_expr]])inletexpr=pexp_record~loc(List.map~f:entryfields)Noneintransformer~loc~transformtdexprlettransformer_impl~jane~ctxt(_rec_flag,type_declarations)=letloc=Expansion_context.Deriver.derived_item_locctxtinletf(td:type_declaration)=matchtdwith|{ptype_kind=Ptype_variant_|Ptype_open;_}->Location.raise_errorf~loc"Deriving scad transformers for variant/open types is not supported."|{ptype_kind=Ptype_abstract;ptype_manifest=None;_}->Location.raise_errorf~loc"Scad transformers cannot be derived for empty abstract types."|{ptype_kind=Ptype_abstract;ptype_manifest=Somect;_}->List.map~f:(funtransform->abstract_transformer~loc~jane~transformtdct)transforms|{ptype_kind=Ptype_recordfields;_}->List.map~f:(funtransform->record_transformer~loc~jane~transformtdfields)transformsinList.concat_map~ftype_declarationsletscad_type_arrow~locname=lettxt=Longident.Ldot(Longident.Ldot(lident"Scad_ml",name),"t")inptyp_arrow~locNolabel(ptyp_constr~loc{loc;txt}[])lettransformer_intf~ctxt(_rec_flag,type_declarations)=letloc=Expansion_context.Deriver.derived_item_locctxtinletf(td:type_declaration)=matchtdwith|{ptype_kind=Ptype_variant_|Ptype_open;_}->Location.raise_errorf~loc"Deriving scad transformers for non-abstract/record types is not supported."|{ptype_kind=Ptype_abstract|Ptype_record_;ptype_name;ptype_params;_}->letgen_sigtransform=letname=letfunc_name=transform_to_stringtransforminifString.equaltd.ptype_name.txt"t"thenfunc_nameelsePrintf.sprintf"%s_%s"func_nametd.ptype_name.txtandlast_arrow=lettyp=ptyp_constr~loc{loc;txt=lidentptype_name.txt}(List.map~f:fstptype_params)inptyp_arrow~locNolabeltyptypinletpval_type=matchtransformwith|RotateAbout->letarrow=scad_type_arrow~loc"Vec3"inarrow@@arrowlast_arrow|Quaternion->scad_type_arrow~loc"Quaternion"@@last_arrow|QuaternionAbout->scad_type_arrow~loc"Quaternion"@@scad_type_arrow~loc"Vec3"@@last_arrow|_->scad_type_arrow~loc"Vec3"@@last_arrowinpsig_value~loc{pval_name={loc;txt=name};pval_type;pval_attributes=[];pval_loc=loc;pval_prim=[]}inList.map~f:gen_sigtransformsinList.concat_map~ftype_declarationsletimpl_generator~jane=Deriving.Generator.V2.make_noarg(transformer_impl~jane)letintf_generator=Deriving.Generator.V2.make_noargtransformer_intfletscad=Deriving.add~str_type_decl:(impl_generator~jane:false)~sig_type_decl:intf_generator"scad"letscad_jane=Deriving.add~str_type_decl:(impl_generator~jane:true)~sig_type_decl:intf_generator"scad_jane"