Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file solidity_visitor.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516(**************************************************************************)(* *)(* Copyright (c) 2021 OCamlPro & Origin Labs *)(* *)(* All rights reserved. *)(* This file is distributed under the terms of the GNU Lesser General *)(* Public License version 2.1, with the special exception on linking *)(* described in the LICENSE.md file in the root directory. *)(* *)(* *)(**************************************************************************)openSolidity_commonopenSolidity_ast(* Actions to perform during a visit *)typeaction=|SkipChildren|DoChildren|DoChildrenPostof(unit->unit)classvirtualbase_visitor=objectmethodvirtualvisitBool:bool->actionmethodvirtualvisitInt:int->actionmethodvirtualvisitChar:Char.t->actionmethodvirtualvisitQ:Q.t->actionmethodvirtualvisitString:string->actionmethodvirtualvisitOption:'a.'aoption->actionmethodvirtualvisitList:'a.'alist->actionmethodvirtualvisitNode:'a.'anode->actionmethodvirtualvisitIdent:Ident.t->actionmethodvirtualvisitLongIdent:'kind.'kindLongIdent.t->actionmethodvirtualvisitContractKind:Solidity_ast.contract_kind->actionmethodvirtualvisitVisibility:Solidity_ast.visibility->actionmethodvirtualvisitFunMutability:Solidity_ast.fun_mutability->actionmethodvirtualvisitVarMutability:Solidity_ast.var_mutability->actionmethodvirtualvisitStorageLocation:Solidity_ast.storage_location->actionmethodvirtualvisitNumberUnit:Solidity_ast.number_unit->actionmethodvirtualvisitElementaryType:Solidity_ast.elementary_type->actionmethodvirtualvisitUnaryOperator:Solidity_ast.unary_operator->actionmethodvirtualvisitBinaryOperator:Solidity_ast.binary_operator->actionmethodvirtualvisitCompareOperator:Solidity_ast.compare_operator->actionend(* To include in every visitor to avoid defining every method *)classinit_base_visitor=objectinheritbase_visitormethodvisitBool_=DoChildrenmethodvisitInt_=DoChildrenmethodvisitChar_=DoChildrenmethodvisitQ_=DoChildrenmethodvisitString_=DoChildrenmethodvisitOption_=DoChildrenmethodvisitList_=DoChildrenmethodvisitNode_=DoChildrenmethodvisitIdent_=DoChildrenmethodvisitLongIdent_=DoChildrenmethodvisitContractKind_=DoChildrenmethodvisitVisibility_=DoChildrenmethodvisitFunMutability_=DoChildrenmethodvisitVarMutability_=DoChildrenmethodvisitStorageLocation_=DoChildrenmethodvisitNumberUnit_=DoChildrenmethodvisitElementaryType_=DoChildrenmethodvisitUnaryOperator_=DoChildrenmethodvisitBinaryOperator_=DoChildrenmethodvisitCompareOperator_=DoChildrenend(* The strategy for each action *)lethandleAction(visit:'a->action)(continueVisit:'a->unit)(node:'a)=matchvisitnodewith|SkipChildren->()|DoChildren->continueVisitnode|DoChildrenPostpost->continueVisitnode;post()letvisitOpt(visitElt:#base_visitor->'a->unit)(v:#base_visitor):'aoption->unit=letcontinueVisit=function|None->()|Someelt->visitEltveltinhandleActionv#visitOptioncontinueVisitletvisitList(visitElt:#base_visitor->'a->unit)(v:#base_visitor):'alist->unit=letcontinueVisit=List.iter(visitEltv)inhandleActionv#visitListcontinueVisitletvisitXY(visitX:#base_visitor->'a->unit)(visitY:#base_visitor->'b->unit)(visitor:#base_visitor)((x,y):('a*'b)):unit=visitXvisitorx;visitYvisitoryletvisitXYZ(visitX:#base_visitor->'a->unit)(visitY:#base_visitor->'b->unit)(visitZ:#base_visitor->'c->unit)(visitor:#base_visitor)((x,y,z):('a*'b*'c)):unit=visitXvisitorx;visitYvisitory;visitZvisitorzletleaf(visitorVisit:'a->action)(elt:'a):unit=handleActionvisitorVisitignoreeltletvisitBool(v:#base_visitor)(b:bool):unit=leafv#visitBoolbletvisitInt(v:#base_visitor)(i:int):unit=leafv#visitIntiletvisitQ(v:#base_visitor)(q:Q.t):unit=leafv#visitQqletvisitString(v:#base_visitor)(s:string)=leafv#visitStringsletvisitIdent(v:#base_visitor)=leafv#visitIdentletvisitLongIdent(v:#base_visitor)=leafv#visitLongIdentletvisitContractKind(v:#base_visitor)=leafv#visitContractKindletvisitVisibility(v:#base_visitor)=leafv#visitVisibilityletvisitFunMutability(v:#base_visitor)=leafv#visitFunMutabilityletvisitVarMutability(v:#base_visitor)=leafv#visitVarMutabilityletvisitStorageLocation(v:#base_visitor)=leafv#visitStorageLocationletvisitNumberUnit(v:#base_visitor)=leafv#visitNumberUnitletvisitElementaryType(v:#base_visitor)=leafv#visitElementaryTypeletvisitUnaryOperator(v:#base_visitor)=leafv#visitUnaryOperatorletvisitBinaryOperator(v:#base_visitor)=leafv#visitBinaryOperatorletvisitCompareOperator(v:#base_visitor)=leafv#visitCompareOperatorclassvirtualast_visitor=objectinheritbase_visitormethodvirtualvisitImportDirective:import_directive->actionmethodvirtualvisitImportSymbols:import_symbols->actionmethodvirtualvisitType:type_->actionmethodvirtualvisitFunctionType:function_type->actionmethodvirtualvisitTypeDef:type_definition->actionmethodvirtualvisitContractDef:contract_definition->actionmethodvirtualvisitContractPart:contract_part->actionmethodvirtualvisitStateVariableDef:state_variable_definition->actionmethodvirtualvisitFunctionDef:function_definition->actionmethodvirtualvisitModifierDef:modifier_definition->actionmethodvirtualvisitEventDef:event_definition->actionmethodvirtualvisitStatement:statement->actionmethodvirtualvisitExpression:expression->actionmethodvirtualvisitVariableDef:variable_definition->actionmethodvirtualvisitFunctionCallArguments:function_call_arguments->actionmethodvirtualvisitSourceUnit:source_unit->actionvalmutablecurrent_annot:annotoption=Nonevalmutablecurrent_position:posoption=NonemethodgetAnnot():annotoption=current_annotmethodsetAnnot(annot:annotoption):unit=current_annot<-annotmethodgetPos():posoption=current_positionmethodsetPos(pos:posoption):unit=current_position<-posendclassinit_ast_visitor=objectinheritinit_base_visitorinheritast_visitormethodvisitImportDirective_=DoChildrenmethodvisitImportSymbols_=DoChildrenmethodvisitType_=DoChildrenmethodvisitFunctionType_=DoChildrenmethodvisitTypeDef_=DoChildrenmethodvisitContractDef_=DoChildrenmethodvisitContractPart_=DoChildrenmethodvisitStateVariableDef_=DoChildrenmethodvisitFunctionDef_=DoChildrenmethodvisitModifierDef_=DoChildrenmethodvisitEventDef_=DoChildrenmethodvisitStatement_=DoChildrenmethodvisitExpression_=DoChildrenmethodvisitVariableDef_=DoChildrenmethodvisitFunctionCallArguments_=DoChildrenmethodvisitSourceUnit_=DoChildrenendletvisitNode(visitElt:(#ast_visitoras'b)->'a->unit)(v:'b)(elt:'anode):unit=letcontinueVisitelt=letold_annot=v#getAnnot()inletold_pos=v#getPos()inlet()=v#setAnnot(Someelt.annot);v#setPos(Someelt.pos)inletres=visitEltvelt.contentsinlet()=v#setAnnotold_annot;v#setPosold_posinresinhandleActionv#visitNodecontinueVisiteltletrecvisitType(v:#ast_visitor)(t:Solidity_ast.type_):unit=letcontinueVisit(t:Solidity_ast.type_):unit=matchtwith|ElementaryType(e)->visitElementaryType(v:>base_visitor)e|Array(t,e)->visitTypevt;visitOptvisitExpressionve|Mapping(tk,tv)->visitTypevtk;visitTypevtv|FunctionTypef->visitFunctionTypevf|UserDefinedTypeli->visitNodevisitLongIdentvliinhandleActionv#visitTypecontinueVisittandvisitParam(v:#ast_visitor)(p:Solidity_ast.param):unit=visitXYZvisitType(visitOptvisitStorageLocation)(visitOpt@@visitNodevisitIdent)vpandvisitFunctionType(v:#ast_visitor)(ft:Solidity_ast.function_type):unit=letcontinueVisit({fun_type_params;fun_type_returns;fun_type_visibility;fun_type_mutability}:Solidity_ast.function_type):unit=visitListvisitParamvfun_type_params;visitList(visitXYvisitType(visitOptvisitStorageLocation))vfun_type_returns;visitVisibilityvfun_type_visibility;visitFunMutabilityvfun_type_mutabilityinhandleActionv#visitFunctionTypecontinueVisitftandvisitTypeDef(v:#ast_visitor)(tf:type_definition):unit=letcontinueVisit(tf:type_definition):unit=matchtfwith|EnumDefinition(i,il)->visitNodevisitIdentvi;visitList(visitNodevisitIdent)vil|StructDefinition(i,l)->visitNodevisitIdentvi;visitList(visitXYvisitType(visitNodevisitIdent))vlinhandleActionv#visitTypeDefcontinueVisittfandvisitContractDef(v:#ast_visitor)(cd:contract_definition):unit=letcontinueVisit({contract_name;contract_kind;contract_abstract;contract_inheritance;contract_parts}:contract_definition):unit=visitNodevisitIdentvcontract_name;visitContractKindvcontract_kind;visitBoolvcontract_abstract;visitListvisitInheritanceSpecifiervcontract_inheritance;visitList(visitNodevisitContractPart)vcontract_parts;()inhandleActionv#visitContractDefcontinueVisitcdandvisitInheritanceSpecifier(v:#ast_visitor)(is:Solidity_ast.inheritance_specifier)=visitXY(visitNodevisitLongIdent)(visitList@@visitExpression)visandvisitContractPart(v:#ast_visitor)(cp:Solidity_ast.contract_part):unit=letcontinueVisit(cp:Solidity_ast.contract_part):unit=matchcpwith|Solidity_ast.TypeDefinitiontd->visitTypeDefvtd|StateVariableDeclarationsvd->visitStateVariableDefvsvd|FunctionDefinitionfd->visitFunctionDefvfd|ModifierDefinitionmd->visitModifierDefvmd|EventDefinitioned->visitEventDefved|UsingForDeclaration(li,t_opt)->visitNodevisitLongIdentvli;visitOptvisitTypevt_optinhandleActionv#visitContractPartcontinueVisitcpandvisitStateVariableDef(v:#ast_visitor)(svd:state_variable_definition):unit=letcontinueVisit({var_name;var_type;var_visibility;var_mutability;var_override;var_init}:state_variable_definition):unit=visitNodevisitIdentvvar_name;visitTypevvar_type;visitVisibilityvvar_visibility;visitVarMutabilityvvar_mutability;visitOpt(visitList(visitNodevisitLongIdent))vvar_override;visitOptvisitExpressionvvar_initinhandleActionv#visitStateVariableDefcontinueVisitsvdandvisitBlock(v:#ast_visitor)(b:block):unit=visitListvisitStatementvbandvisitFunctionDef(v:#ast_visitor)(fd:function_definition):unit=letcontinueVisit({fun_name;fun_params;fun_returns;fun_modifiers;fun_visibility;fun_mutability;fun_override;fun_virtual;fun_body}:function_definition):unit=visitNodevisitIdentvfun_name;visitListvisitParamvfun_params;visitListvisitParamvfun_returns;visitList(visitXY(visitNodevisitLongIdent)(visitOpt(visitListvisitExpression)))vfun_modifiers;visitVisibilityvfun_visibility;visitFunMutabilityvfun_mutability;visitOpt(visitList(visitNodevisitLongIdent))vfun_override;visitBoolvfun_virtual;visitOptvisitBlockvfun_bodyinhandleActionv#visitFunctionDefcontinueVisitfdandvisitFunctionDefNode(v:#ast_visitor)(fdn:function_definitionnode):unit=visitNodevisitFunctionDefvfdnandvisitModifierDef(v:#ast_visitor)(md:modifier_definition):unit=letcontinueVisit({mod_name;mod_params;mod_override;mod_virtual;mod_body}:modifier_definition):unit=visitNodevisitIdentvmod_name;visitListvisitParamvmod_params;visitOpt(visitList(visitNodevisitLongIdent))vmod_override;visitBoolvmod_virtual;visitOptvisitBlockvmod_bodyinhandleActionv#visitModifierDefcontinueVisitmdandvisitModifierDefNode(v:#ast_visitor)(mdn:modifier_definitionnode):unit=visitNodevisitModifierDefvmdnandvisitEventDef(v:#ast_visitor)(ed:event_definition):unit=letcontinueVisit({event_name;event_params;event_anonymous}:event_definition):unit=visitNodevisitIdentvevent_name;visitList(visitXYZvisitTypevisitBool(visitOpt(visitNodevisitIdent)))vevent_params;visitBoolvevent_anonymous;inhandleActionv#visitEventDefcontinueVisitedandvisitCatchClause(v:#ast_visitor)(cc:catch_clause):unit=visitXYZ(visitOpt(visitNodevisitIdent))(visitListvisitParam)visitBlockvccandvisitStatement(v:#ast_visitor)(s:statement):unit=letcontinueVisit(s:statement):unit=matchs.contentswith|Blockb->visitBlockvb|VariableDefinitionvd->visitVariableDefvvd|ExpressionStatemente->visitExpressionve|IfStatement(if_,then_,else_)->visitExpressionvif_;visitStatementvthen_;visitOptvisitStatementvelse_|WhileStatement(e,s)->visitExpressionve;visitStatementvs|DoWhileStatement(s,e)->visitStatementvs;visitExpressionve|ForStatement(so,eo1,eo2,s)->visitOptvisitStatementvso;visitOptvisitExpressionveo1;visitOptvisitExpressionveo2;visitStatementvs|TryStatement(e,rl,b,catchs)->visitExpressionve;visitListvisitParamvrl;visitBlockvb;visitListvisitCatchClausevcatchs|Emit(e,fca)->visitExpressionve;visitFunctionCallArgumentsvfca|Returneo->visitOptvisitExpressionveo|Continue|Break|PlaceholderStatement->()inhandleActionv#visitStatementcontinueVisitsandvisitExpression(v:#ast_visitor)(e:expression):unit=letcontinueVisit(e:expression):unit=matche.contentswith|BooleanLiteralb->visitBoolvb|NumberLiteral(q,u,s)->visitQvq;visitNumberUnitvu;visitOptvisitIntvs|StringLiterals->visitStringvs|AddressLiterals->visitStringvs|IdentifierExpressioni->visitNodevisitIdentvi|ImmediateArrayel->visitListvisitExpressionvel|ArrayAccess(e,eo)->visitExpressionve;visitOptvisitExpressionveo|ArraySlice(e,eo1,eo2)->visitExpressionve;visitOptvisitExpressionveo1;visitOptvisitExpressionveo2|TupleExpressioneol->visitList(visitOptvisitExpression)veol|PrefixExpression(u,e)->visitUnaryOperatorvu;visitExpressionve|SuffixExpression(e,u)->visitExpressionve;visitUnaryOperatorvu|CompareExpression(e1,co,e2)->visitExpressionve1;visitCompareOperatorvco;visitExpressionve2|BinaryExpression(e1,bo,e2)|AssignBinaryExpression(e1,bo,e2)->visitExpressionve1;visitBinaryOperatorvbo;visitExpressionve2|AssignExpression(e1,e2)->visitExpressionve1;visitExpressionve2|IfExpression(e1,e2,e3)->visitExpressionve1;visitExpressionve2;visitExpressionve3|FieldExpression(e,i)->visitExpressionve;visitNodevisitIdentvi|FunctionCallExpression(e,fca)->visitExpressionve;visitFunctionCallArgumentsvfca|CallOptions(e,l)->visitExpressionve;visitList(visitXY(visitNodevisitIdent)visitExpression)vl|NewExpressiont|TypeExpressiont->visitTypevtinhandleActionv#visitExpressioncontinueVisiteandvisitVariableDef(v:#ast_visitor)(vd:variable_definition):unit=letcontinueVisit(vd:variable_definition):unit=matchvdwith|VarInfer(iol,e)->visitList(visitOpt(visitNodevisitIdent))viol;visitExpressionve|VarType(l,eo)->visitList(visitOpt(visitXYZvisitType(visitOptvisitStorageLocation)(visitNodevisitIdent)))vl;visitOptvisitExpressionveoinhandleActionv#visitVariableDefcontinueVisitvdandvisitFunctionCallArguments(v:#ast_visitor)(fca:function_call_arguments):unit=letcontinueVisit(fca:function_call_arguments):unit=matchfcawith|ExpressionListel->visitListvisitExpressionvel|NameValueListl->visitList(visitXY(visitNodevisitIdent)visitExpression)vlinhandleActionv#visitFunctionCallArgumentscontinueVisitfcaandvisitSourceUnit(v:#ast_visitor)(su:source_unit):unit=letcontinueVisit(su:source_unit):unit=matchsuwith|Pragma(i,s)->visitIdentvi;visitStringvs|Importid->visitImportDirectivevid|GlobalTypeDefinitiontd->visitTypeDefvtd|GlobalFunctionDefinitionfd->visitFunctionDefvfd|GlobalVariableDefinitionvd->visitStateVariableDefvvd|ContractDefinitioncdn->visitContractDefvcdninhandleActionv#visitSourceUnitcontinueVisitsuandvisitImportDirective(v:#ast_visitor)(id:import_directive):unit=letcontinueVisit({import_from;import_symbols}:import_directive):unit=visitStringvimport_from;visitImportSymbolsvimport_symbolsinhandleActionv#visitImportDirectivecontinueVisitidandvisitImportSymbols(v:#ast_visitor)(is:import_symbols):unit=letcontinueVisit=function|ImportAll(io)->visitOpt(visitNodevisitIdent)vio|ImportIdentsl->visitList(visitXY(visitNodevisitIdent)(visitOpt(visitNodevisitIdent)))vlinhandleActionv#visitImportSymbolscontinueVisitisandvisitModule(v:#ast_visitor)(m:module_):unit=visitList(visitNodevisitSourceUnit)vm.module_units