Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file ppx_quickcheck_expander.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333open!Importletcustom_extension~loctagpayload=matchString.equaltag.txt"custom"with|false->unsupported~loc"uknown extension: %s"tag.txt|true->matchpayloadwith|PStr[{pstr_desc=Pstr_eval(expr,attributes);_}]->assert_no_attributesattributes;expr|_->invalid~loc"[%%custom] extension expects a single expression as its payload"letrecgenerator_of_core_typecore_type~gen_env~obs_env=letloc=core_type.ptyp_locinmatchcore_type.ptyp_descwith|Ptyp_constr(constr,args)->type_constr_conv~loc~f:generator_nameconstr(List.mapargs~f:(generator_of_core_type~gen_env~obs_env))|Ptyp_vartyvar->Environment.lookupgen_env~loc~tyvar|Ptyp_arrow(arg_label,input_type,output_type)->Ppx_generator_expander.arrow~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~observer_of_core_type:(observer_of_core_type~gen_env~obs_env)~loc~arg_label~input_type~output_type|Ptyp_tuplefields->Ppx_generator_expander.compound~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~loc~fields(moduleField_syntax.Tuple)|Ptyp_variant(clauses,Closed,None)->Ppx_generator_expander.variant~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~loc~variant_type:core_type~clauses(moduleClause_syntax.Polymorphic_variant)|Ptyp_variant(_,Open,_)->unsupported~loc"polymorphic variant type with [>]"|Ptyp_variant(_,_,Some_)->unsupported~loc"polymorphic variant type with [<]"|Ptyp_extension(tag,payload)->custom_extension~loctagpayload|Ptyp_any|Ptyp_object_|Ptyp_class_|Ptyp_alias_|Ptyp_poly_|Ptyp_package_->unsupported~loc"%s"(short_string_of_core_typecore_type)andobserver_of_core_typecore_type~obs_env~gen_env=letloc=core_type.ptyp_locinmatchcore_type.ptyp_descwith|Ptyp_constr(constr,args)->type_constr_conv~loc~f:observer_nameconstr(List.mapargs~f:(observer_of_core_type~obs_env~gen_env))|Ptyp_vartyvar->Environment.lookupobs_env~loc~tyvar|Ptyp_arrow(arg_label,input_type,output_type)->Ppx_observer_expander.arrow~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~generator_of_core_type:(generator_of_core_type~obs_env~gen_env)~loc~arg_label~input_type~output_type|Ptyp_tuplefields->Ppx_observer_expander.compound~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~loc~fields(moduleField_syntax.Tuple)|Ptyp_variant(clauses,Closed,None)->Ppx_observer_expander.variant~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~loc~clauses(moduleClause_syntax.Polymorphic_variant)|Ptyp_variant(_,Open,_)->unsupported~loc"polymorphic variant type with [>]"|Ptyp_variant(_,_,Some_)->unsupported~loc"polymorphic variant type with [<]"|Ptyp_extension(tag,payload)->custom_extension~loctagpayload|Ptyp_any->Ppx_observer_expander.any~loc|Ptyp_object_|Ptyp_class_|Ptyp_alias_|Ptyp_poly_|Ptyp_package_->unsupported~loc"%s"(short_string_of_core_typecore_type)andshrinker_of_core_typecore_type~env=letloc=core_type.ptyp_locinmatchcore_type.ptyp_descwith|Ptyp_constr(constr,args)->type_constr_conv~loc~f:shrinker_nameconstr(List.mapargs~f:(shrinker_of_core_type~env))|Ptyp_vartyvar->Environment.lookupenv~loc~tyvar|Ptyp_arrow_->Ppx_shrinker_expander.arrow~loc|Ptyp_tuplefields->Ppx_shrinker_expander.compound~shrinker_of_core_type:(shrinker_of_core_type~env)~loc~fields(moduleField_syntax.Tuple)|Ptyp_variant(clauses,Closed,None)->Ppx_shrinker_expander.variant~shrinker_of_core_type:(shrinker_of_core_type~env)~loc~variant_type:core_type~clauses(moduleClause_syntax.Polymorphic_variant)|Ptyp_variant(_,Open,_)->unsupported~loc"polymorphic variant type with [>]"|Ptyp_variant(_,_,Some_)->unsupported~loc"polymorphic variant type with [<]"|Ptyp_extension(tag,payload)->custom_extension~loctagpayload|Ptyp_any->Ppx_shrinker_expander.any~loc|Ptyp_object_|Ptyp_class_|Ptyp_alias_|Ptyp_poly_|Ptyp_package_->unsupported~loc"%s"(short_string_of_core_typecore_type)letgenerator_impltype_decl=letloc=type_decl.ptype_locinletpat=pgeneratortype_decl.ptype_nameinletexpr=letpat_list,`Covariantgen_env,`Contravariantobs_env=Environment.create_with_variance~loc~covariant:"generator"~contravariant:"observer"type_decl.ptype_paramsinletbody=matchtype_decl.ptype_kindwith|Ptype_open->unsupported~loc"open type"|Ptype_variantclauses->Ppx_generator_expander.variant~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~loc~variant_type:[%type:_]~clauses(moduleClause_syntax.Variant)|Ptype_recordfields->Ppx_generator_expander.compound~generator_of_core_type:(generator_of_core_type~gen_env~obs_env)~loc~fields(moduleField_syntax.Record)|Ptype_abstract->matchtype_decl.ptype_manifestwith|Somecore_type->generator_of_core_typecore_type~gen_env~obs_env|None->unsupported~loc"abstract type"inList.fold_rightpat_list~init:body~f:(funpatbody->[%exprfun[%ppat]->[%ebody]])invalue_binding~loc~pat~exprletgenerator_impl_list~loctype_decl_list=pstr_value_list~locNonrecursive(List.maptype_decl_list~f:(funtype_decl->lettype_decl=name_type_params_in_tdtype_declingenerator_impltype_decl))letobserver_impltype_decl=letloc=type_decl.ptype_locinletpat=pobservertype_decl.ptype_nameinletexpr=letpat_list,`Covariantobs_env,`Contravariantgen_env=Environment.create_with_variance~loc~covariant:"observer"~contravariant:"generator"type_decl.ptype_paramsinletbody=matchtype_decl.ptype_kindwith|Ptype_open->unsupported~loc"open type"|Ptype_variantclauses->Ppx_observer_expander.variant~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~loc~clauses(moduleClause_syntax.Variant)|Ptype_recordfields->Ppx_observer_expander.compound~observer_of_core_type:(observer_of_core_type~obs_env~gen_env)~loc~fields(moduleField_syntax.Record)|Ptype_abstract->matchtype_decl.ptype_manifestwith|Somecore_type->observer_of_core_typecore_type~obs_env~gen_env|None->unsupported~loc"abstract type"inList.fold_rightpat_list~init:body~f:(funpatbody->[%exprfun[%ppat]->[%ebody]])invalue_binding~loc~pat~exprletobserver_impl_list~loctype_decl_list=pstr_value_list~locNonrecursive(List.maptype_decl_list~f:(funtype_decl->lettype_decl=name_type_params_in_tdtype_declinobserver_impltype_decl))letshrinker_impltype_decl=letloc=type_decl.ptype_locinletpat=pshrinkertype_decl.ptype_nameinletexpr=letpat_list,env=Environment.create~loc~prefix:"shrinker"type_decl.ptype_paramsinletbody=matchtype_decl.ptype_kindwith|Ptype_open->unsupported~loc"open type"|Ptype_variantclauses->Ppx_shrinker_expander.variant~shrinker_of_core_type:(shrinker_of_core_type~env)~loc~variant_type:[%type:_]~clauses(moduleClause_syntax.Variant)|Ptype_recordfields->Ppx_shrinker_expander.compound~shrinker_of_core_type:(shrinker_of_core_type~env)~loc~fields(moduleField_syntax.Record)|Ptype_abstract->matchtype_decl.ptype_manifestwith|Somecore_type->shrinker_of_core_typecore_type~env|None->unsupported~loc"abstract type"inList.fold_rightpat_list~init:body~f:(funpatbody->[%exprfun[%ppat]->[%ebody]])invalue_binding~loc~pat~exprletshrinker_impl_list~loctype_decl_list=pstr_value_list~locNonrecursive(List.maptype_decl_list~f:(funtype_decl->lettype_decl=name_type_params_in_tdtype_declinshrinker_impltype_decl))letintftype_decl~f~covar~contravar=letcovar=Longident.parse("Base_quickcheck."^covar^".t")inletcontravar=Longident.parse("Base_quickcheck."^contravar^".t")inlettype_decl=name_type_params_in_tdtype_declinletloc=type_decl.ptype_locinletname=loc_maptype_decl.ptype_name~finletresult=ptyp_constr~loc{loc;txt=covar}[ptyp_constr~loc(lident_loctype_decl.ptype_name)(List.maptype_decl.ptype_params~f:fst)]inlettype_=List.fold_righttype_decl.ptype_params~init:result~f:(fun(core_type,variance)result->letid=matchvariancewith|Invariant|Covariant->covar|Contravariant->contravarinletarg=ptyp_constr~loc{loc;txt=id}[core_type]in[%type:[%targ]->[%tresult]])inpsig_value~loc(value_description~loc~name~type_~prim:[])letshrinker_intf=intf~f:shrinker_name~covar:"Shrinker"~contravar:"Shrinker"letgenerator_intf=intf~f:generator_name~covar:"Generator"~contravar:"Observer"letobserver_intf=intf~f:observer_name~covar:"Observer"~contravar:"Generator"letgenerator_intf_listtype_decl_list=List.maptype_decl_list~f:generator_intfletobserver_intf_listtype_decl_list=List.maptype_decl_list~f:observer_intfletshrinker_intf_listtype_decl_list=List.maptype_decl_list~f:shrinker_intfletassert_non_recursive~locrec_flagtype_decl_list=matchreally_recursiverec_flagtype_decl_listwith|Nonrecursive->()|Recursive->(* Recursive generators, especially, are difficult to derive. For now, we just punt on
the problem. *)unsupported~loc"recursive type"letsig_type_decl=Deriving.Generator.make_noarg(fun~loc:_~path:_(_,decls)->generator_intf_listdecls@observer_intf_listdecls@shrinker_intf_listdecls)letstr_type_decl=Deriving.Generator.make_noarg(fun~loc~path:_(rec_flag,decls)->assert_non_recursive~locrec_flagdecls;generator_impl_list~locdecls@observer_impl_list~locdecls@shrinker_impl_list~locdecls)letgenerator_extension~loc:_~path:_core_type=generator_of_core_typecore_type~gen_env:Environment.empty~obs_env:Environment.emptyletobserver_extension~loc:_~path:_core_type=observer_of_core_typecore_type~obs_env:Environment.empty~gen_env:Environment.emptyletshrinker_extension~loc:_~path:_core_type=shrinker_of_core_typecore_type~env:Environment.empty