123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818(*
Copyright 2012-2025 Codinuum Software Lab <https://codinuum.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*)(*
* AST for the Java Language
*
* ast.ml
*
*)[%%prepare_logger]openPrintfmoduleAst_base=Langs_common.Ast_basemoduleLoc=Langs_common.Astloctypeloc=Loc.ttypeidentifier=stringtypesimple_name=identifiertypedims=int(* dimension *)typeexpr_kind=EKunknown|EKfacc|EKnametypeidentifier_attribute=|IApackage|IAclassofstring|IAinterfaceofstring|IAtypenameofstring|IAmethod|IAfield|IAconstructor|IAparameter|IAvariable|IAlabel|IAstaticofstring|IAtypeparameter|IAexpressionofexpr_kind|IAarrayletexpr_kind_to_str=function|EKunknown->"unknown"|EKfacc->"facc"|EKname->"name"letiattr_to_str=function|IApackage->"package"|IAclasss->"class"^(ifs=""then""else":"^s)|IAinterfaces->"interface"^(ifs=""then""else":"^s)|IAtypenames->"typename"^(ifs=""then""else":"^s)|IAmethod->"method"|IAconstructor->"constructor"|IAlabel->"label"|IAfield->"field"|IAparameter->"parameter"|IAvariable->"variable"|IAstatics->"static member"^(ifs=""then""else":"^s)|IAtypeparameter->"type parameter"|IAexpressionek->"expression:"^(expr_kind_to_strek)|IAarray->"array"typeframe_kind=|FKclassofstring*bool(* has_super *)ref|FKtypeparameter|FKmethodofstring*bool(* is_static *)ref|FKotherletframe_kind_to_string=function|FKclass(s,x)->sprintf"class:%s:has_super=%B"s!x|FKtypeparameter->"typeparameter"|FKmethod(s,x)->sprintf"method:%s:is_static=%B"s!x|FKother->"other"letis_class_frame=function|FKclass_->true|_->falseletis_method_frame=function|FKmethod_->true|_->falseclassframekind=object(self)valtbl=(Hashtbl.create0:(string,identifier_attribute)Hashtbl.t)valqtbl=(Hashtbl.create0:(string,identifier_attribute)Hashtbl.t)methodkind=kindmethodis_typeparameter_frame=kind=FKtypeparametermethodis_class_frame=is_class_framekindmethodis_method_frame=is_method_framekindmethodget_class_name=matchkindwith|FKclass(n,_)->n|_->raiseNot_foundmethodget_method_name=matchkindwith|FKmethod(n,_)->n|_->raiseNot_foundmethodprivate_addtidattr=ifnot(List.memattr(Hashtbl.find_alltid))thenHashtbl.addtidattrmethodfindid=Hashtbl.findtblidmethodaddidattr=self#_addtblidattrmethodfind_allid=Hashtbl.find_alltblidmethodqfindqn=Hashtbl.findqtblqnmethodqaddqnattr=self#_addqtblqnattrmethodqfind_allqn=Hashtbl.find_allqtblqnmethoditerf=Hashtbl.iterftblmethodto_string=sprintf"FRAME[%s]:\nIDENT:{%s}\nQNAME:{%s}\n"(frame_kind_to_stringkind)(Hashtbl.fold(funid_s->id^";"^s)tbl"")(Hashtbl.fold(funqn_s->qn^";"^s)qtbl"")endtyperesolve_result=|R_resolvedofstring|R_deferredofstring*frameStack.t*stringletresolve_result_to_str=function|R_resolveds->s|R_deferred(id,_,s)->sprintf"{DEFERRED:%s?%s}"idsletmkresolveds=R_resolvedsletis_resolved=function|R_resolved_->true|_->falseletis_innerlname=String.containslname'$'letsplit_innerlname=(* parent * rest *)letidx=String.indexlname'$'inString.sublname0idx,String.sublnameidx((String.lengthlname)-idx)typename_attribute=|NApackage|NAtypeofresolve_result|NAexpressionofexpr_kind|NAmethod|NApackageOrType|NAstaticofresolve_result|NAambiguousofresolve_result|NAunknownletis_expr_attr=function|NAexpression_->true|_->falseletiattr_to_nattr=function|IApackage->NApackage|IAmethod->NAmethod|IAexpressionek->NAexpressionek|_->failwith"Ast.iattr_to_nattr"letget_resolved_name=function|NAtype(R_resolveds)|NAstatic(R_resolveds)->ifs=""thenraiseNot_foundelses|_->raiseNot_foundletset1origa=match!origwith|NApackageOrType->beginmatchawith|NApackage|NAtype_->orig:=a|_->()end|NAexpression_->beginmatchawith|NAstatic_->orig:=a|_->()end|NAambiguous_->beginmatchawith|NAunknown|NAambiguous_->()|_->orig:=aend|NAunknown->orig:=a|_->()letis_capitalizeds=tryletc=Char.codes.[0]in65<=c&&c<=90with_->falseletis_all_capitalizeds=tryletc=Char.codes.[0]in65<=c&&c<=90&&String.for_all(funchr->letc=Char.codechrin65<=c&&c<=90||48<=c&&c<=57||chr='_')swith_->falsetypeliteral=|Lintegerofstring|LfloatingPointofstring|Ltrue|Lfalse|Lcharacterofstring|Lstringofstring|LtextBlockofstring|Lnulltypeassignment_operator={ao_desc:assignment_operator_desc;ao_loc:loc;}andassignment_operator_desc=|AOeq|AOmulEq|AOdivEq|AOmodEq|AOaddEq|AOsubEq|AOshiftLEq|AOshiftREq|AOshiftRUEq|AOandEq|AOxorEq|AOorEqtypeunary_operator=|UOpostIncrement|UOpostDecrement|UOpreIncrement|UOpreDecrement|UOpositive|UOnegative|UOcomplement|UOnottypebinary_operator=|BOmul|BOdiv|BOmod|BOadd|BOsub|BOshiftL|BOshiftR|BOshiftRU|BOeq|BOneq|BOlt|BOgt|BOle|BOge|BObitAnd|BObitOr|BObitXor|BOand|BOortypename={n_desc:name_desc;n_loc:loc;}andname_desc=|Nsimpleofname_attributeref*identifier|Nqualifiedofname_attributeref*name*annotationlist*identifier|Nerrorofstringandjavatype={ty_desc:javatype_desc;ty_loc:loc;}andprimitive_type=|PTbyte|PTshort|PTint|PTlong|PTchar|PTfloat|PTdouble|PTbooleanandjavatype_desc=|Tprimitiveofannotationlist*primitive_type|TclassOrInterfaceoftype_speclist|Tclassoftype_speclist|Tinterfaceoftype_speclist|Tarrayofjavatype(* other than array *)*annot_dimlist|Tvoid(* not a type (only for convenience) *)andtype_spec=|TSnameofannotationlist*name|TSapplyofannotationlist*name*type_argumentsandtype_argument={ta_desc:type_argument_desc;ta_loc:loc;}andtype_argument_desc=|TAreferenceTypeofjavatype|TAwildcardofwildcardandwildcard_bounds={wb_desc:wildcard_bounds_desc;wb_loc:loc;}andwildcard_bounds_desc=|WBextendsofjavatype|WBsuperofjavatypeandwildcard=annotationlist*wildcard_boundsoptionandtype_arguments={tas_type_arguments:type_argumentlist;tas_loc:loc;}andvariable_declarator_id=(loc*identifier)*annot_dimlistandthrows={th_exceptions:javatypelist;th_loc:loc;}andextends_class={exc_class:javatype;exc_loc:loc}andextends_interfaces={exi_interfaces:javatypelist;exi_loc:loc;}andimplements={im_interfaces:javatypelist;im_loc:loc;}andpermits={pm_type_names:namelist;pm_loc:loc;}andformal_parameter={fp_modifiers:modifiersoption;fp_type:javatype;fp_variable_declarator_id:variable_declarator_id;fp_variable_arity:bool;fp_loc:loc;fp_receiver:identifieroption;}andmodifiers={ms_modifiers:modifierlist;ms_loc:loc;}andmodifier={m_desc:modifier_desc;m_loc:loc;}andmodifier_desc=|Mpublic|Mprotected|Mprivate|Mstatic|Mabstract|Mfinal|Mnative|Msynchronized|Mtransient|Mvolatile|Mstrictfp|Mannotationofannotation|Mdefault|Mtransitive|Msealed|Mnon_sealed|Merrorofstringandvariable_initializer={vi_desc:variable_initializer_desc;vi_loc:loc;}andvariable_initializer_desc=|VIexpressionofexpression|VIarrayofarray_initializer|VIerrorofstringandarray_initializer=variable_initializerlistandvariable_declarator={vd_variable_declarator_id:variable_declarator_id;vd_variable_initializer:variable_initializeroption;vd_is_local:boolref;vd_loc:loc;}andvariable_declarators=variable_declaratorlistandclass_declaration_head={ch_modifiers:modifiersoption;ch_identifier:identifier;ch_identifier_loc:loc;ch_type_parameters:type_parametersoption;ch_extends_class:extends_classoption;ch_implements:implementsoption;ch_permits:permitsoption;ch_loc:loc;}andrecord_declaration_head={rh_modifiers:modifiersoption;rh_identifier:identifier;rh_identifier_loc:loc;rh_type_parameters:type_parametersoption;rh_record_header:formal_parameterlist;rh_implements:implementsoption;rh_loc:loc;}andmodule_declaration={mod_head:module_declaration_head;mod_body:module_body;mod_loc:loc;}andmodule_declaration_head={mdh_annotations:annotationlist;mdh_open:locoption;mdh_name:name;mdh_loc:loc;}andmodule_name={mn_name:name;mn_loc:loc}andmodule_body={mb_module_directives:module_directivelist;mb_loc:loc}andmodule_directive={md_desc:module_directive_desc;md_loc:loc}andmodule_directive_desc=|MDrequiresofmodifierlist*name|MDexportsofname*module_namelist|MDopensofname*module_namelist|MDusesofname|MDprovidesofname*module_namelistandclass_declaration={cd_desc:class_declaration_desc;cd_loc:loc;}andclass_declaration_desc=|CDclassofclass_declaration_head*class_body|CDenumofclass_declaration_head*enum_body|CDrecordofrecord_declaration_head*record_body|CDaspectofclass_declaration_head*aspect_bodyandtype_parameters={tps_type_parameters:type_parameterlist;tps_loc:loc;}andtype_variable=identifierandtype_parameter={tp_type_variable:type_variable;tp_annotations:annotationlist;tp_type_bound:type_boundoption;tp_loc:loc;}andtype_bound={tb_reference_type:javatype;tb_additional_bounds:additional_boundlist;tb_loc:loc;}andadditional_bound={ab_interface:javatype;ab_loc:loc;}andenum_body={eb_enum_constants:enum_constantlist;eb_class_body_declarations:class_body_declarationlist;eb_loc:loc;}andenum_constant={ec_annotations:annotations;ec_identifier:identifier;ec_arguments:argumentsoption;ec_class_body:class_bodyoption;ec_loc:loc;}andclass_body={cb_class_body_declarations:class_body_declarationlist;cb_loc:loc;}andclass_body_declaration={cbd_desc:class_body_declaration_desc;cbd_loc:loc;}andclass_body_declaration_desc=|CBDfieldoffield_declaration|CBDmethodofmethod_header*blockoption|CBDclassofclass_declaration|CBDinterfaceofinterface_declaration|CBDstaticInitializerofblock|CBDinstanceInitializerofblock|CBDconstructorofconstructor_declaration|CBDempty|CBDerrorofstring|CBDpointcutofpointcut_declaration|CBDdeclareofdeclare_declarationandrecord_body={rb_record_body_declarations:record_body_declarationlist;rb_loc:loc;}andrecord_body_declaration={rbd_desc:record_body_declaration_desc;rbd_loc:loc;}andrecord_body_declaration_desc=|RBDclass_body_declofclass_body_declaration|RBDcompact_ctor_declofcompact_constructor_declarationanddeclare_declaration={dd_desc:declare_declaration_desc;dd_loc:loc;}anddeclare_declaration_desc=|DDparentsofstring*classname_pattern_expr*extends_classoption*implementsoption|DDmessageofstring*pointcut_expr*primary|DDsoftofstring*pointcut_expr|DDprecedenceofstring*classname_pattern_exprlistandpointcut_declaration={pcd_modifiers:modifiersoption;pcd_name:identifier;pcd_parameters_loc:loc;pcd_parameters:formal_parameterlist;pcd_pointcut_expr:pointcut_exproption;pcd_loc:loc;}andpointcut_expr={pe_desc:pointcut_expr_desc;pe_loc:loc;}andpointcut_expr_desc=|PEandofpointcut_expr*pointcut_expr|PEorofpointcut_expr*pointcut_expr|PEnotofpointcut_expr|PEparenofpointcut_expr|PEwithinofclassname_pattern_exprandclassname_pattern_expr={cpe_desc:classname_pattern_expr_desc;cpe_loc:loc;}andclassname_pattern_expr_desc=|CPEandofclassname_pattern_expr*classname_pattern_expr|CPEorofclassname_pattern_expr*classname_pattern_expr|CPEnotofclassname_pattern_expr|CPEparenofclassname_pattern_expr|CPEnameofstring|CPEnamePlusofstringandfield_declaration={fd_modifiers:modifiersoption;fd_type:javatype;fd_variable_declarators:variable_declarators;fd_loc:loc;}andmethod_header={mh_modifiers:modifiersoption;mh_type_parameters:type_parametersoption;mh_annotations:annotationlist;mh_return_type:javatype;mh_name:identifier;mh_name_loc:loc;mh_parameters_loc:loc;mh_parameters:formal_parameterlist;mh_dims:annot_dimlist;mh_throws:throwsoption;mh_loc:loc;}andconstructor_declaration={cnd_modifiers:modifiersoption;cnd_type_parameters:type_parametersoption;cnd_name:simple_name;cnd_parameters_loc:loc;cnd_parameters:formal_parameterlist;cnd_throws:throwsoption;cnd_body:constructor_body;cnd_loc:loc;}andcompact_constructor_declaration={ccnd_modifiers:modifiersoption;ccnd_name:identifier;ccnd_body:constructor_body;ccnd_loc:loc;}andconstructor_body={cnb_explicit_constructor_invocation:explicit_constructor_invocationoption;cnb_block:block_statementlist;cnb_loc:loc;}andarguments={as_arguments:argumentlist;as_loc:loc;}andexplicit_constructor_invocation={eci_desc:explicit_constructor_invocation_desc;eci_loc:loc}andexplicit_constructor_invocation_desc=|ECIthisoftype_argumentsoption*arguments|ECIsuperoftype_argumentsoption*arguments|ECIprimaryofprimary*type_argumentsoption*arguments|ECInameofname*type_argumentsoption*arguments|ECIerrorofstringandinterface_declaration_head={ifh_modifiers:modifiersoption;ifh_identifier:identifier;ifh_type_parameters:type_parametersoption;ifh_extends_interfaces:extends_interfacesoption;ifh_permits:permitsoption;ifh_loc:loc;}andinterface_declaration={ifd_desc:interface_declaration_desc;ifd_loc:loc;}andinterface_declaration_desc=|IFDnormalofinterface_declaration_head*interface_body|IFDannotationofinterface_declaration_head*annotation_type_bodyandannotation_type_body={atb_member_declarations:annotation_type_member_declarationlist;atb_loc:loc;}andconstant_declaration=field_declarationanddefault_value=element_valueandannotation_type_member_declaration={atmd_desc:annotation_type_member_declaration_desc;atmd_loc:loc;}andannotation_type_member_declaration_desc=|ATMDconstantofconstant_declaration|ATMDelementofmodifiersoption*javatype*identifier*annot_dimlist*default_valueoption|ATMDclassofclass_declaration|ATMDinterfaceofinterface_declaration|ATMDemptyandannot_dim={ad_annotations:annotations;ad_loc:loc;ad_ellipsis:bool;}andinterface_body={ib_member_declarations:interface_member_declarationlist;ib_loc:loc;}andinterface_method_declaration={amd_method_header:method_header;amd_body:blockoption;amd_loc:loc;}andinterface_member_declaration={imd_desc:interface_member_declaration_desc;imd_loc:loc;}andinterface_member_declaration_desc=|IMDconstantoffield_declaration|IMDinterfaceMethodofinterface_method_declaration|IMDclassofclass_declaration|IMDinterfaceofinterface_declaration|IMDemptyandaspect_body={abd_aspect_body_declarations:class_body_declarationlist;abd_loc:loc;}andblock_statement={bs_desc:block_statement_desc;bs_loc:loc;}andblock_statement_desc=|BSlocaloflocal_variable_declaration|BSclassofclass_declaration|BSstatementofstatement|BSerrorofstringandlocal_variable_declaration={lvd_modifiers:modifiersoption;lvd_type:javatype;lvd_variable_declarators:variable_declarators;lvd_loc:loc;}andblock={b_block_statements:block_statementlist;b_loc:loc;}andstatement={s_desc:statement_desc;s_loc:loc;s_extra_loc:locoption;}andstatement_desc=|Sblockofblock|Sempty|Sexpressionofstatement_expression|Sswitchofexpression*switch_block|Sdoofstatement*expression|Sbreakofidentifieroption|Scontinueofidentifieroption|Sreturnofexpressionoption|Ssynchronizedofexpression*block|Sthrowofexpression|Stryofresource_specoption*block*catchesoption*finallyoption|Syieldofexpression|Slabeledofidentifier*statement|SifThenofexpression*statement|SifThenElseofexpression*statement*statement|Swhileofexpression*statement|Sforoffor_initoption*expressionoption*statement_expressionlist*statement|SforEnhancedofformal_parameter*expression*statement|Sassert1ofexpression|Sassert2ofexpression*expression|Serrorofstringandstatement_expression={se_desc:statement_expression_desc;se_loc:loc;}andstatement_expression_desc=|SEassignmentofassignment|SEpreIncrementofexpression|SEpreDecrementofexpression|SEpostIncrementofexpression|SEpostDecrementofexpression|SEmethodInvocationofmethod_invocation|SEclassInstanceCreationofclass_instance_creation|SEerrorofstringandfor_init={fi_desc:for_init_desc;fi_loc:loc;}andfor_init_desc=|FIstatementofstatement_expressionlist|FIlocaloflocal_variable_declarationandprimary={mutablep_desc:primary_desc;p_loc:loc;}andprimary_desc=|Pnameofname|Pliteralofliteral|PclassLiteralofjavatype|PclassLiteralVoid|Pthis|PqualifiedThisofname(* of type *)|Pparenofexpression|PclassInstanceCreationofclass_instance_creation|PfieldAccessoffield_access|PmethodInvocationofmethod_invocation|ParrayAccessofarray_access|ParrayCreationExpressionofarray_creation_expression|PmethodReferenceofmethod_reference|Perrorofstringandmethod_reference={mr_desc:method_reference_desc;mr_loc:loc;}andmethod_reference_desc=|MRnameofname*type_argumentsoption*identifier|MRprimaryofprimary*type_argumentsoption*identifier|MRsuperoftype_argumentsoption*identifier|MRtypeSuperofname*type_argumentsoption*identifier|MRtypeNewofjavatype*type_argumentsoptionandarray_creation_expression=|ACEtypeofjavatype*dim_exprlist*annot_dimlist|ACEtypeInitofjavatype*annot_dimlist*array_initializeranddim_expr={de_desc:expression;de_loc:loc;}andclass_instance_creation={cic_desc:class_instance_creation_desc;cic_loc:loc;}andclass_instance_creation_desc=|CICunqualifiedoftype_argumentsoption*javatype*arguments*class_bodyoption|CICqualifiedofprimary*type_argumentsoption*identifier*type_argumentsoption*arguments*class_bodyoption|CICnameQualifiedofname*type_argumentsoption*identifier*type_argumentsoption*arguments*class_bodyoptionandfield_access=|FAprimaryofprimary*identifier|FAsuperofidentifier|FAclassSuperofname(* of type *)*identifier|FAimplicitofname(*identifier*)andmethod_invocation={mutablemi_desc:method_invocation_desc;mi_loc:loc;}andmethod_invocation_desc=|MImethodNameofname(* of method *)*arguments|MIprimaryofprimary*type_argumentsoption*identifier*arguments|MItypeNameofname*type_argumentsoption*identifier*arguments|MIsuperofloc(* of super *)*type_argumentsoption*identifier*arguments|MIclassSuperofloc(* of class *)*loc(* of super *)*name(* of type *)*type_argumentsoption*identifier*argumentsandarray_access={aa_desc:array_access_desc;aa_loc:loc;}andarray_access_desc=|AAnameofname(* of expression *)*expression|AAprimaryofprimary*expressionandargument=expressionandexpression={e_desc:expression_desc;e_loc:loc;}andexpression_desc=|Eprimaryofprimary|Eunaryofunary_operator*expression|Ebinaryofbinary_operator*expression*expression|Ecastofjavatype*expression|Einstanceofofexpression*javatype|EinstanceofPofexpression*local_variable_declaration|Econdofexpression*expression*expression|Eassignmentofassignment|Elambdaoflambda_params*lambda_body|Eswitchofexpression*switch_block|Eerrorofstringandlambda_params={lp_desc:lambda_params_desc;lp_loc:loc;}andlambda_params_desc=|LPidentofidentifier|LPformalofformal_parameterlist|LPinferredof(loc*identifier)listandlambda_body=LBexprofexpression|LBblockofblockandannotation={a_desc:annotation_desc;a_loc:loc;}andannotation_desc=|Anormalofname*element_value_pairlist|Amarkerofname|AsingleElementofname*element_valueandannotations=annotationlistandelement_value={ev_desc:element_value_desc;ev_loc:loc;}andelement_value_desc=|EVconditionalofexpression|EVannotationofannotation|EVarrayInitofelement_valuelistandelement_value_pair={evp_desc:element_value_pair_desc;evp_loc:loc;}andelement_value_pair_desc=identifier*element_valueandassignment=left_hand_side*assignment_operator*expressionandleft_hand_side=expressionandconstant_expression=expression(* where ... *)andswitch_label_desc=|SLconstantofconstant_expressionlist|SLdefaultandswitch_label={sl_desc:switch_label_desc;sl_loc:loc;}andswitch_block_stmt_grp=switch_labellist*block_statementlistandswitch_rule_label={srl_desc:switch_label_desc;srl_loc:loc;}andswitch_rule=switch_rule_label*switch_rule_bodyandswitch_rule_body={srb_desc:switch_rule_body_desc;srb_loc:loc;}andswitch_rule_body_desc=|SRBexprofexpression|SRBblockofblock|SRBthrowofstatementandswitch_block={sb_switch_block_stmt_grps:switch_block_stmt_grplist;sb_switch_rules:switch_rulelist;sb_loc:loc;}andcatch={c_formal_parameter:catch_formal_parameter;c_block:block;c_loc:loc;}andcatches=catchlistandfinally={f_block:block;f_loc:loc;}andcatch_formal_parameter={cfp_modifiers:modifiersoption;cfp_type_list:javatypelist;cfp_variable_declarator_id:variable_declarator_id;cfp_loc:loc;}andresource_spec={rs_resources:resourcelist;rs_loc:loc;}andresource={r_desc:resource_desc;r_loc:loc;}andresource_desc=|RlocalVarDecloflocal_variable_declaration|RfieldAccessoffield_access|Rnameofnameletset_name_attribute?(force=false)an=matchn.n_descwith|Nsimple(at,_)whenforce->at:=a|Nqualified(at,_,_,_)whenforce->at:=a|Nsimple(at,_)->set1ata|Nqualified(at,_,_,_)->set1ata|_->()letset_attributelattrattrname=let(* rec*)set_attran=matchn.n_descwith|Nsimple(at,_)->set1ata|Nqualified(at,(*n*)_,_,_)->set1ata;(* set_attr a n*)|_->()inmatchname.n_descwith|Nsimple_->set_attrattrname|Nqualified(at,n,_,_)->set_attrlattrn;set1atattr|_->()letset_attribute_PT_Trr=set_attributeNApackageOrType(NAtyperr)letset_attribute_P_Trr=set_attributeNApackage(NAtyperr)letset_attribute_PT_PT=set_attributeNApackageOrTypeNApackageOrTypeletset_attribute_P_P=set_attributeNApackageNApackage(*let set_attribute_A_M rr = set_attribute (NAambiguous rr) NAmethod*)(*let set_attribute_A_E rr = set_attribute (NAambiguous rr) NAexpression*)letget_name_attributename=matchname.n_descwith|Nsimple(attr,_)|Nqualified(attr,_,_,_)->!attr|_->NAunknownletcompose_name?(attr=refNAunknown)nameident=letdesc=Nqualified(attr,name,[],ident)inletloc=Loc.widenname.n_loc((String.lengthident)+1)in{n_desc=desc;n_loc=loc}letdecompose_namename=matchname.n_descwith|Nsimple_->failwith"Ast.decompose_name"|Nqualified(_,n,_,id)->n,id|_->failwith"Ast.decompose_name"letreciter_idfn=matchn.n_descwith|Nsimple(_,id)->fid|Nqualified(_,n0,_,id)->fid;iter_idfn0|_->()letrecleftmost_of_namen=matchn.n_descwith|Nsimple(attr,id)->attr,id|Nqualified(_,n,_,_)->leftmost_of_namen|_->refNAunknown,"?"letleftmost_identifiern=let_,id=leftmost_of_nameninidletrecleftmost_namen=matchn.n_descwith|Nsimple(_,_)->n|Nqualified(_,n,_,_)->leftmost_namen|_->nletis_leftmost_id_capitalizedn=letid=leftmost_identifierninis_capitalizedidletrightmost_identifiern=matchn.n_descwith|Nsimple(_,id)->id|Nqualified(_,_,_,id)->id|_->"?"letis_rightmost_id_capitalizedn=matchn.n_descwith|Nsimple(_,id)->is_capitalizedid|Nqualified(_,_,_,id)->is_capitalizedid|_->falseletis_rightmost_id_all_capitalizedn=matchn.n_descwith|Nsimple(_,id)->is_all_capitalizedid|Nqualified(_,_,_,id)->is_all_capitalizedid|_->falseletrightmost_namen=matchn.n_descwith|Nqualified(a,_,_,id)->{n_desc=Nsimple(a,id);n_loc=n.n_loc}|_->nletget_qualifiername=matchname.n_descwith|Nsimple_->raiseNot_found|Nqualified(_,n,_,_)->n|_->raiseNot_foundletis_rightmost_qualifier_capitalizedn=tryletq=get_qualifierninmatchq.n_descwith|Nsimple(_,id)|Nqualified(_,_,_,id)->is_capitalizedid|_->falsewith|_->falseletqualifier_contains_capitalizedn=tryletq=get_qualifierniniter_id(funi->ifis_capitalizedithenraiseExit)q;falsewith|Exit->true|_->falseletis_all_qualifier_lowercasen=tryletq=get_qualifierniniter_id(funi->ifis_capitalizedithenraiseExit)q;truewith|_->falseletrecget_lengthname=matchname.n_descwith|Nsimple_->1|Nqualified(_,n,_,_)->1+get_lengthn|_->raiseNot_foundletis_simplen=matchn.n_descwith|Nsimple_->true|_->falseletis_qualifiedn=matchn.n_descwith|Nqualified_->true|_->falseletis_ambiguous_namename=matchget_name_attributenamewith|NAambiguous_->true|_->falseletis_type_namename=matchget_name_attributenamewith|NAtype_->true|NApackageOrType->true|_->falseletis_typename=matchget_name_attributenamewith|NAtype_->true|_->falseletis_staticname=matchget_name_attributenamewith|NAstatic_->true|_->falseletis_package_or_type_namename=matchget_name_attributenamewith|NApackageOrType->true|_->falseletis_expressionname=matchget_name_attributenamewith|NAexpression_->true|_->falseletis_unknown_expressionname=matchget_name_attributenamewith|NAexpressionEKunknown->true|_->falseletis_unknown_namename=(get_name_attributename)=NAunknownletdummy_name={n_desc=Nsimple(refNAunknown,"");n_loc=Loc.dummy;}typepackage_declaration={pd_annotations:annotations;pd_name:name;pd_loc:loc;}typeimport_declaration={id_desc:import_declaration_desc;id_loc:loc;}andimport_declaration_desc=|IDsingleofname(* of type *)|IDtypeOnDemandofname(* of package or type *)|IDsingleStaticofname(* of type *)*identifier|IDstaticOnDemandofname(* of package or type *)|IDerrorofstringtypetype_declaration={td_desc:type_declaration_desc;td_loc:loc;}andtype_declaration_desc=|TDclassofclass_declaration|TDinterfaceofinterface_declaration|TDempty|TDerrorofstring|TDorphanoftype_declarationoption*class_body_declarationtypecompilation_unit={cu_package:package_declarationoption;cu_imports:import_declarationlist;cu_tydecls:type_declarationlist;cu_modecl:module_declarationoption;}let_mkprimlocd={p_desc=d;p_loc=loc}letmh_is_genericmh=mh.mh_type_parameters<>Noneletget_modifiers_from_mhmh=matchmh.mh_modifierswith|Somems->ms.ms_modifiers|_->[]letget_annot_dims_from_typety=matchty.ty_descwith|Tarray(_,dl)->dl|_->[]letannot_exists=List.exists(funadim->adim.ad_annotations<>[])letproc_opprocfop=matchopwith|Somex->procfx|None->()[%%capture_pathletrecproc_element_valuefev=matchev.ev_descwith|EVconditionale->proc_expressionfe|EVannotationa->proc_annotationfa|EVarrayInitevs->List.iter(proc_element_valuef)evsandproc_annotationfa=matcha.a_descwith|Anormal(n,evps)->fn;List.iter(funevp->let_,ev=evp.evp_descinproc_element_valuefev)evps|Amarkern->fn|AsingleElement(n,ev)->fn;proc_element_valuefevandproc_typefty=matchty.ty_descwith|TclassOrInterfacetss|Tclasstss|Tinterfacetss->List.iter(proc_type_specf)tss|Tarray(ty0,_)->proc_typefty0|_->()andproc_type_specfts=matchtswith|TSname(al,n)->List.iter(proc_annotationf)al;fn|TSapply(al,n,tas)->List.iter(proc_annotationf)al;fn;proc_type_argumentsftasandproc_expressionfe=matche.e_descwith|Eprimaryp->proc_primaryfp|Eunary(_,e0)->proc_expressionfe0|Ebinary(_,e0,e1)->List.iter(proc_expressionf)[e0;e1]|Ecast(ty,e0)->proc_typefty;proc_expressionfe0|Einstanceof(e0,ty)->proc_expressionfe0;proc_typefty|EinstanceofP(e0,lvd)->proc_expressionfe0;proc_local_variable_declarationflvd|Econd(e0,e1,e2)->List.iter(proc_expressionf)[e0;e1;e2]|Eassignment(lhs,_,rhs)->List.iter(proc_expressionf)[lhs;rhs]|Elambda(_,b)->proc_lambda_blockfb|Eswitch(e,swb)->beginproc_expressionfe;List.iter(fun(sls,bss)->List.iter(proc_switch_labelf)sls;List.iter(proc_block_statementf)bss)swb.sb_switch_block_stmt_grpsend|_->()andproc_lambda_blockf=function|LBexpre->proc_expressionfe|LBblockb->proc_blockfband_name_to_faccname=matchname.n_descwith|Nsimple(a,_)->beginmatch!awith|NAexpression(EKfacc|EKunknown)->PfieldAccess(FAimplicitname)|NAexpressionEKname->Pnamename|_->Pnamenameend|Nqualified(_,n,[],i)->PfieldAccess(FAprimary(name_to_faccn,i))|Nqualified(_,_,_,_)->Pnamename|Nerror_->Pnamenameandname_to_faccname=_mkprimname.n_loc(_name_to_faccname)andproc_primaryfp=[%debug_log"[%s] %s"(Loc.to_stringp.p_loc)(prim_to_stringp)];matchp.p_descwith|Pnamen->beginfn;[%debug_log"[%s] %s"(Loc.to_stringp.p_loc)(prim_to_stringp)];ifis_qualifiednthenbeginletq=get_qualifierninifis_expressionqthenbeginp.p_desc<-_name_to_faccn;[%debug_log"[%s] -> %s"(Loc.to_stringp.p_loc)(prim_to_stringp)]endendend|PclassLiteralty->proc_typefty|PqualifiedThisn->fn|Pparene->proc_expressionfe|PclassInstanceCreationcic->proc_class_instance_creationfcic|PfieldAccess(FAimplicitn)whenis_type_namen->beginfn;[%debug_log"[%s] %s"(Loc.to_stringp.p_loc)(prim_to_stringp)];p.p_desc<-Pnamen;[%debug_log"[%s] -> %s"(Loc.to_stringp.p_loc)(prim_to_stringp)]end|PfieldAccess(FAimplicitn)whenis_ambiguous_namen->beginfn;[%debug_log"[%s] %s"(Loc.to_stringp.p_loc)(prim_to_stringp)];ifis_type_namen||is_staticnthenbeginp.p_desc<-Pnamen;[%debug_log"[%s] -> %s"(Loc.to_stringp.p_loc)(prim_to_stringp)]endend|PfieldAccessfa->proc_field_accessffa|PmethodInvocationmi->proc_method_invocationfmi|ParrayAccessaa->proc_array_accessfaa|ParrayCreationExpressionace->proc_array_creation_expressionface|PmethodReferencemr->proc_method_referencefmr|_->()andproc_class_instance_creationfcic=matchcic.cic_descwith|CICunqualified(tas_op,ty,args,cb_op)->proc_opproc_type_argumentsftas_op;proc_typefty;proc_argumentsfargs;proc_opproc_class_bodyfcb_op|CICqualified(p,tas0_op,_,tas1_op,args,cb_op)->proc_primaryfp;proc_opproc_type_argumentsftas0_op;proc_opproc_type_argumentsftas1_op;proc_argumentsfargs;proc_opproc_class_bodyfcb_op|CICnameQualified(n,tas0_op,_,tas1_op,args,cb_op)->fn;proc_opproc_type_argumentsftas0_op;proc_opproc_type_argumentsftas1_op;proc_argumentsfargs;proc_opproc_class_bodyfcb_opandproc_class_body_declarationfcbd=matchcbd.cbd_descwith|CBDfieldfd->proc_field_declarationffd|CBDmethod(mh,b_op)->proc_method_headerfmh;proc_opproc_blockfb_op|CBDclasscd->proc_class_declarationfcd|CBDinterfaceid->proc_interface_declarationfid|CBDstaticInitializerb->proc_blockfb|CBDinstanceInitializerb->proc_blockfb|CBDconstructorcd->proc_constructor_declarationfcd|_->()andproc_record_body_declarationfrbd=matchrbd.rbd_descwith|RBDclass_body_declc->proc_class_body_declarationfc|RBDcompact_ctor_declc->proc_compact_ctor_declfcandproc_compact_ctor_declfccnd=proc_opproc_modifiersfccnd.ccnd_modifiers;proc_constructor_bodyfccnd.ccnd_bodyandproc_type_boundftb=proc_typeftb.tb_reference_type;List.iter(funab->proc_typefab.ab_interface)tb.tb_additional_boundsandproc_type_parameterftp=proc_opproc_type_boundftp.tp_type_boundandproc_type_parametersftps=List.iter(proc_type_parameterf)tps.tps_type_parametersandproc_method_headerfmh=proc_opproc_modifiersfmh.mh_modifiers;proc_opproc_type_parametersfmh.mh_type_parameters;List.iter(proc_annotationf)mh.mh_annotations;proc_typefmh.mh_return_type;List.iter(proc_formal_parameterf)mh.mh_parameters;proc_opproc_throwsfmh.mh_throwsandproc_formal_parameterffp=proc_opproc_modifiersffp.fp_modifiers;proc_typeffp.fp_typeandproc_throwsfth=List.iter(proc_typef)th.th_exceptionsandproc_array_initializerfai=List.iter(proc_variable_initializerf)aiandproc_variable_initializerfvi=matchvi.vi_descwith|VIexpressione->proc_expressionfe|VIarrayai->proc_array_initializerfai|VIerror_->()andproc_variable_declaratorfvd=proc_opproc_variable_initializerfvd.vd_variable_initializerandproc_local_variable_declarationflvd=proc_opproc_modifiersflvd.lvd_modifiers;proc_typeflvd.lvd_type;List.iter(proc_variable_declaratorf)lvd.lvd_variable_declaratorsandproc_statement_expressionfse=matchse.se_descwith|SEassignment(lhs,_,rhs)->List.iter(proc_expressionf)[lhs;rhs]|SEpreIncremente|SEpreDecremente|SEpostIncremente|SEpostDecremente->proc_expressionfe|SEmethodInvocationmi->proc_method_invocationfmi|SEclassInstanceCreationcic->proc_class_instance_creationfcic|_->()andproc_switch_labelfsl=matchsl.sl_descwith|SLconstantel->List.iter(proc_expressionf)el|SLdefault->()andproc_statementfs=matchs.s_descwith|Sblockb->proc_blockfb|Sexpressionse->proc_statement_expressionfse|Sswitch(e,swb)->proc_expressionfe;List.iter(fun(sls,bss)->List.iter(proc_switch_labelf)sls;List.iter(proc_block_statementf)bss)swb.sb_switch_block_stmt_grps|Sdo(s0,e)->proc_statementfs0;proc_expressionfe|Sreturne_op->proc_opproc_expressionfe_op|Ssynchronized(e,b)->proc_expressionfe;proc_blockfb|Stry(rs_op,b,cts_op,fin_op)->proc_opproc_resource_specfrs_op;proc_blockfb;proc_op(funfcatches->List.iter(proc_catchf)catches)fcts_op;proc_op(funffin->proc_blockffin.f_block)ffin_op|Syielde->proc_expressionfe|Slabeled(_,s0)->proc_statementfs0|SifThen(e,s0)|Swhile(e,s0)->proc_expressionfe;proc_statementfs0|SifThenElse(e,s0,s1)->proc_expressionfe;List.iter(proc_statementf)[s0;s1]|Sfor(fi_op,e_op,ses,s0)->proc_opproc_for_initffi_op;proc_opproc_expressionfe_op;List.iter(proc_statement_expressionf)ses;proc_statementfs0|SforEnhanced(fp,e,s0)->proc_formal_parameterffp;proc_expressionfe;proc_statementfs0|Sthrowe|Sassert1e->proc_expressionfe|Sassert2(e0,e1)->List.iter(proc_expressionf)[e0;e1]|_->()andproc_resource_specfrs=List.iter(proc_resourcef)rs.rs_resourcesandproc_resourcefr=matchr.r_descwith|RlocalVarDecllvd->proc_local_variable_declarationflvd|RfieldAccessfa->proc_field_accessffa|Rnamen->fnandproc_catchfc=proc_catch_formal_parameterfc.c_formal_parameter;proc_blockfc.c_blockandproc_catch_formal_parameterfcfp=proc_opproc_modifiersfcfp.cfp_modifiers;List.iter(proc_typef)cfp.cfp_type_listandproc_for_initffi=matchfi.fi_descwith|FIstatementses->List.iter(proc_statement_expressionf)ses|FIlocallvd->proc_local_variable_declarationflvdandproc_block_statementfbs=matchbs.bs_descwith|BSlocallvd->proc_local_variable_declarationflvd|BSclasscd->proc_class_declarationfcd|BSstatements->proc_statementfs|_->()andproc_blockfb=List.iter(proc_block_statementf)b.b_block_statementsandproc_extends_classfexc=proc_typefexc.exc_classandproc_implementsfim=List.iter(proc_typef)im.im_interfacesandproc_permitsfpm=List.iterfpm.pm_type_namesandproc_class_declaration_headfch=proc_opproc_modifiersfch.ch_modifiers;proc_opproc_type_parametersfch.ch_type_parameters;proc_opproc_extends_classfch.ch_extends_class;proc_opproc_implementsfch.ch_implements;proc_opproc_permitsfch.ch_permitsandproc_record_declaration_headfrh=proc_opproc_modifiersfrh.rh_modifiers;proc_opproc_type_parametersfrh.rh_type_parameters;List.iter(proc_formal_parameterf)rh.rh_record_header;proc_opproc_implementsfrh.rh_implementsandproc_class_declarationfcd=matchcd.cd_descwith|CDclass(ch,cb)->proc_class_declaration_headfch;proc_class_bodyfcb|CDenum(eh,eb)->proc_class_declaration_headfeh;proc_enum_bodyfeb|CDrecord(rh,cb)->proc_record_declaration_headfrh;proc_record_bodyfcb|CDaspect(ah,ab)->proc_class_declaration_headfah;proc_aspect_bodyfabandproc_aspect_bodyfab=List.iter(proc_class_body_declarationf)ab.abd_aspect_body_declarationsandproc_enum_bodyfeb=List.iter(proc_enum_constantf)eb.eb_enum_constants;List.iter(proc_class_body_declarationf)eb.eb_class_body_declarationsandproc_enum_constantfec=List.iter(proc_annotationf)ec.ec_annotations;proc_opproc_argumentsfec.ec_arguments;proc_opproc_class_bodyfec.ec_class_bodyandproc_interface_declaration_headfifh=proc_opproc_modifiersfifh.ifh_modifiers;proc_opproc_type_parametersfifh.ifh_type_parameters;proc_op(funfei->List.iter(proc_typef)ei.exi_interfaces)fifh.ifh_extends_interfaces;proc_opproc_permitsfifh.ifh_permitsandproc_interface_declarationfifd=matchifd.ifd_descwith|IFDnormal(ih,ib)->proc_interface_declaration_headfih;proc_interface_bodyfib|IFDannotation(_,atb)->List.iter(proc_annotation_type_member_declarationf)atb.atb_member_declarationsandproc_annotation_type_member_declarationfatmd=matchatmd.atmd_descwith|ATMDconstantfd->proc_field_declarationffd|ATMDelement(_,ty,_,dl,dv_op)->proc_typefty;List.iter(fund->List.iter(proc_annotationf)d.ad_annotations)dl;proc_opproc_element_valuefdv_op|ATMDclasscd->proc_class_declarationfcd|ATMDinterfaceid->proc_interface_declarationfid|_->()andproc_interface_bodyfib=List.iter(proc_interface_member_declarationf)ib.ib_member_declarationsandproc_interface_member_declarationfimd=matchimd.imd_descwith|IMDconstantfd->proc_field_declarationffd|IMDinterfaceMethodamd->proc_interface_method_declarationfamd|IMDclasscd->proc_class_declarationfcd|IMDinterfaceifd->proc_interface_declarationfifd|_->()andproc_modifiersfms=List.iter(proc_modifierf)ms.ms_modifiersandproc_modifierfm=matchm.m_descwith|Mannotationa->proc_annotationfa|_->()andproc_field_declarationffd=proc_opproc_modifiersffd.fd_modifiers;proc_typeffd.fd_type;List.iter(proc_variable_declaratorf)fd.fd_variable_declaratorsandproc_interface_method_declarationfamd=proc_method_headerfamd.amd_method_header;proc_opproc_blockfamd.amd_bodyandproc_constructor_declarationfcnd=proc_opproc_modifiersfcnd.cnd_modifiers;proc_opproc_type_parametersfcnd.cnd_type_parameters;List.iter(proc_formal_parameterf)cnd.cnd_parameters;proc_opproc_throwsfcnd.cnd_throws;proc_constructor_bodyfcnd.cnd_bodyandproc_constructor_bodyfcnb=proc_opproc_explicit_constructor_invocationfcnb.cnb_explicit_constructor_invocation;List.iter(proc_block_statementf)cnb.cnb_blockandproc_explicit_constructor_invocationfeci=matcheci.eci_descwith|ECIthis(tas_op,args)|ECIsuper(tas_op,args)->proc_opproc_type_argumentsftas_op;proc_argumentsfargs|ECIprimary(p,tas_op,args)->proc_primaryfp;proc_opproc_type_argumentsftas_op;proc_argumentsfargs|ECIname(n,tas_op,args)->fn;proc_opproc_type_argumentsftas_op;proc_argumentsfargs|_->()andproc_method_referencefmr=matchmr.mr_descwith|MRname(n,tas_opt,_)|MRtypeSuper(n,tas_opt,_)->fn;proc_opproc_type_argumentsftas_opt|MRtypeNew(ty,tas_opt)->proc_typefty;proc_opproc_type_argumentsftas_opt|MRprimary(p,tas_opt,_)->proc_primaryfp;proc_opproc_type_argumentsftas_opt|MRsuper(tas_opt,_)->proc_opproc_type_argumentsftas_optandproc_class_bodyfcb=List.iter(proc_class_body_declarationf)cb.cb_class_body_declarationsandproc_record_bodyfrb=List.iter(proc_record_body_declarationf)rb.rb_record_body_declarationsandproc_argumentsfargs=List.iter(proc_expressionf)args.as_argumentsandproc_type_argumentfta=matchta.ta_descwith|TAreferenceTypety->proc_typefty|TAwildcardwc->proc_wildcardfwcandproc_wildcardf(al,wb)=List.iter(proc_annotationf)al;proc_opproc_wildcard_boundsfwbandproc_wildcard_boundsfwb=matchwb.wb_descwith|WBextendsty|WBsuperty->proc_typeftyandproc_type_argumentsftargs=List.iter(proc_type_argumentf)targs.tas_type_argumentsandproc_field_accessffa=matchfawith|FAprimary(p,_)->proc_primaryfp|FAclassSuper(n,_)->fn|_->()andname_attribute_to_string=function|NApackage->"P"|NAtype_->"T"|NAexpressionEKfacc->"Ef"|NAexpressionEKname->"En"|NAexpressionEKunknown->"E"|NAmethod->"M"|NApackageOrType->"PT"|NAstatic_->"S"|NAambiguous_->"A"|NAunknown->"U"andname_to_simple_stringname=matchname.n_descwith|Nsimple(_,sn)->sn|Nqualified(_,n,_,sn)->sprintf"%s.%s"(name_to_simple_stringn)sn|Nerrors->sandname_to_stringname=matchname.n_descwith|Nsimple(attr,sn)->sprintf"(%s)_%s"sn(name_attribute_to_string!attr)|Nqualified(attr,n,_,sn)->sprintf"(%s.%s)_%s"(name_to_stringn)sn(name_attribute_to_string!attr)|Nerrors->sandprim_to_stringp=matchp.p_descwith|Pnamen->sprintf"Pname:%s"(name_to_stringn)|PfieldAccess(FAimplicitn)->sprintf"PfieldAccess:FAimplicit:%s"(name_to_stringn)|PfieldAccess(FAprimary(p,id))->sprintf"PfieldAccess:FAprimary:(%s):%s"(prim_to_stringp)id|PfieldAccess_->"PfieldAcess"|PqualifiedThisn->sprintf"PqualifiedThis:%s"(name_to_stringn)|Pliteral_->"Pliteral"|PclassLiteral_->"PclassLiteral"|PclassLiteralVoid->"PclassLiteralVoid"|Pthis->"Pthis"|Pparen_->"Pparen"|PclassInstanceCreation_->"PclassInstanceCreation"|PmethodInvocation_->"PmethodInvocation"|ParrayAccess_->"ParrayAccess"|ParrayCreationExpression_->"ParrayCreationExpression"|PmethodReference_->"PmethodReference"|Perrorerr->errandproc_method_invocationfmi=letproc=function|MImethodName(n,args)->fn;proc_argumentsfargs|MIprimary(p,tas_op,id,args)->begin[%debug_log"[%s] %s %s"(Loc.to_stringmi.mi_loc)(prim_to_stringp)id];proc_primaryfp;proc_opproc_type_argumentsftas_op;proc_argumentsfargs;[%debug_log"[%s] %s %s"(Loc.to_stringmi.mi_loc)(prim_to_stringp)id];matchp.p_descwith|Pnamen|PfieldAccess(FAimplicitn)whenis_type_namen->mi.mi_desc<-MItypeName(n,tas_op,id,args)|_->()end|MIsuper(_,tas_op,_,args)->proc_opproc_type_argumentsftas_op;proc_argumentsfargs|MItypeName(n,tas_op,_,args)|MIclassSuper(_,_,n,tas_op,_,args)->fn;proc_opproc_type_argumentsftas_op;proc_argumentsfargsinprocmi.mi_descandproc_array_accessfaa=matchaa.aa_descwith|AAname(n,e)->fn;proc_expressionfe|AAprimary(p,e)->proc_primaryfp;proc_expressionfeandproc_array_creation_expressionface=matchacewith|ACEtype(ty,des,_)->proc_typefty;List.iter(funde->proc_expressionfde.de_desc)des|ACEtypeInit(ty,_,ai)->proc_typefty;proc_array_initializerfaiandproc_type_declarationftd=matchtd.td_descwith|TDclasscd->proc_class_declarationfcd|TDinterfaceid->proc_interface_declarationfid|TDorphan(_,m)->beginmatchm.cbd_descwith|CBDmethod(mh,b_op)->beginproc_method_headerfmh;proc_opproc_blockfb_opend|_->()end|_->()]letproc_import_declarationfid=matchid.id_descwith|IDsinglen|IDtypeOnDemandn|IDsingleStatic(n,_)|IDstaticOnDemandn->fn|IDerror_->()classc(compilation_unit:compilation_unit)=object(* (self)*)inheritAst_base.cvalmutablenintegers=-1valmutablenfloats=-1valmutablenstrings=-1methodset_nintegersx=nintegers<-xmethodset_nfloatsx=nfloats<-xmethodset_nstringsx=nstrings<-xmethodnintegers=nintegersmethodnfloats=nfloatsmethodnstrings=nstringsmethodcompilation_unit=compilation_unitmethoditer_namef=beginmatchcompilation_unit.cu_packagewith|Somepdecl->List.iter(proc_annotationf)pdecl.pd_annotations;fpdecl.pd_name|None->()end;List.iter(proc_import_declarationf)compilation_unit.cu_imports;List.iter(proc_type_declarationf)compilation_unit.cu_tydeclsend(* of class Ast.c *)letdummy_type={ty_desc=Tvoid;ty_loc=Loc.dummy;}typedeclaration=|D_importofimport_declaration|D_typeoftype_declarationletpartition_declarationsdl=letil_,tl_=List.partition(function|D_import_->true|_->false)dlinletil=List.map(function|D_importi->i|_->assertfalse)il_inlettl=List.map(function|D_typet->t|_->assertfalse)tl_inil,tl(* end of Ast *)