Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file solidity_ast.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467(**************************************************************************)(* *)(* 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_commontypeident=Ident.tnodetypelongident=relativeLongIdent.tnodetypeprogram={program_modules:module_list;program_modules_by_id:module_IdentMap.t;program_modules_by_file:module_StringMap.t;}andmodule_={module_file:string;(* *absolute* path *)module_id:Ident.t;(* the module id: @n *)module_units:module_units;}andmodule_units=(source_unitnode)listandsource_unit=|Pragmaof(Ident.t*string)|Importofimport_directive|GlobalTypeDefinitionoftype_definition|GlobalFunctionDefinitionoffunction_definition|GlobalVariableDefinitionofstate_variable_definition|ContractDefinitionofcontract_definitionandimport_directive={import_from:string;import_symbols:import_symbols;}andimport_symbols=|ImportAllofidentoption|ImportIdentsof(ident*identoption)listandcontract_definition={contract_name:ident;contract_kind:contract_kind;contract_abstract:bool;contract_inheritance:inheritance_specifierlist;contract_parts:(contract_partnode)list;}andinheritance_specifier=longident*expressionlistandcontract_part=|TypeDefinitionoftype_definition|StateVariableDeclarationofstate_variable_definition|FunctionDefinitionoffunction_definition|ModifierDefinitionofmodifier_definition|EventDefinitionofevent_definition|UsingForDeclarationoflongident*type_optionandtype_definition=|EnumDefinitionofenum_definition|StructDefinitionofstruct_definitionandenum_definition=ident*identlistandstruct_definition=ident*field_definitionlistandfield_definition=type_*identandstate_variable_definition={var_name:ident;var_type:type_;var_visibility:visibility;(* def: internal *)var_mutability:var_mutability;(* def: mutable *)var_override:longidentlistoption;var_init:expressionoption;}andfunction_definition={fun_name:ident;fun_params:paramlist;fun_returns:returnlist;fun_modifiers:(longident*expressionlistoption)list;fun_visibility:visibility;(* def: public (external in interface) *)fun_mutability:fun_mutability;(* ctor: public/forbidden ? *)fun_override:longidentlistoption;(* fallback/receive: external *)fun_virtual:bool;(* but public if missing... *)fun_body:blockoption;(* mutability : nonpayable by default *)}andmodifier_definition={mod_name:ident;mod_params:paramlist;mod_override:longidentlistoption;mod_virtual:bool;mod_body:blockoption;}andevent_definition={event_name:ident;event_params:(type_*bool*identoption)list;(* indexed *)event_anonymous:bool;}andparam=type_*storage_locationoption*identoptionandreturn=type_*storage_locationoption*identoptionandtype_=|ElementaryTypeofelementary_type|Arrayoftype_*expressionoption|Mappingoftype_*type_|FunctionTypeoffunction_type|UserDefinedTypeoflongidentandelementary_type=|TypeBool|TypeIntofint|TypeUintofint|TypeFixedofint*int|TypeUfixedofint*int|TypeAddressofbool(* false = address, true = address payable *)|TypeBytesofintoption(* None = bytes, Some (N) = bytesN *)|TypeStringandfunction_type={fun_type_params:paramlist;fun_type_returns:(type_*storage_locationoption)list;(* ident forbid *)fun_type_visibility:visibility;(* def: internal *)(* only intern/extern *)fun_type_mutability:fun_mutability;(* def: non-payable *)}andstatement=raw_statementnodeandraw_statement=|Blockofblock|VariableDefinitionofvariable_definition|ExpressionStatementofexpression|IfStatementofexpression*statement*statementoption|WhileStatementofexpression*statement|DoWhileStatementofstatement*expression|ForStatementofstatementoption*expressionoption*expressionoption*statement|TryStatementofexpression*returnlist*block*catch_clauselist|Emitofexpression*function_call_arguments|Returnofexpressionoption|Continue|Break|PlaceholderStatementandexpression=raw_expressionnodeandraw_expression=|BooleanLiteralofbool|NumberLiteralofQ.t*number_unit*intoption(* hex size / use type *)|StringLiteralofstring|AddressLiteralofstring|IdentifierExpressionofident|ImmediateArrayofexpressionlist|ArrayAccessofexpression*expressionoption|ArraySliceofexpression*expressionoption*expressionoption|TupleExpressionofexpressionoptionlist|PrefixExpressionofunary_operator*expression|SuffixExpressionofexpression*unary_operator|CompareExpressionofexpression*compare_operator*expression|BinaryExpressionofexpression*binary_operator*expression|AssignExpressionofexpression*expression|AssignBinaryExpressionofexpression*binary_operator*expression|IfExpressionofexpression*expression*expression|FieldExpressionofexpression*ident|FunctionCallExpressionofexpression*function_call_arguments|CallOptionsofexpression*(ident*expression)list|NewExpressionoftype_|TypeExpressionoftype_andblock=statementlistandcatch_clause=identoption*paramlist*blockandvariable_definition=|VarInferofidentoptionlist*expression|VarTypeof(type_*storage_locationoption*ident)optionlist*expressionoptionandfunction_call_arguments=|ExpressionListofexpressionlist|NameValueListof(ident*expression)listandcontract_kind=|Contract|Library|Interfaceandstorage_location=|Memory|Storage|Calldataandvar_mutability=|MMutable|MConstant|MImmutableandfun_mutability=|MPure|MView|MPayable|MNonPayableandvisibility=|VInternal|VExternal(* not for variables *)|VPublic|VPrivateandnumber_unit=|Unit|Wei|Kwei(* Babbage *)|Mwei(* Lovelace *)|Gwei(* Shannon *)|Twei(* Szabo *)|Pwei(* Finney *)|Ether|Hours|Minutes|Seconds|Days|Weeks|Yearsandunary_operator=|UPlus|UMinus|UNot|ULNot|UInc|UDec|UDeleteandbinary_operator=|BPlus|BMinus|BDiv|BMod|BTimes|BExp|BLShift|BRShift|BAnd|BOr|BXor|BLAnd|BLOrandcompare_operator=|CEq|CNeq|CLt|CGt|CLeq|CGeqletis_contract=function|Contract->true|Library|Interface->falseletis_library=function|Library->true|Contract|Interface->falseletis_interface=function|Interface->true|Contract|Library->falseletis_mutable=function|MMutable->true|MConstant|MImmutable->falseletis_constant=function|MConstant->true|MMutable|MImmutable->falseletis_immutable=function|MImmutable->true|MConstant|MMutable->falseletis_payable=function|MPayable->true|MNonPayable|MView|MPure->falseletis_nonpayable=function|MNonPayable->true|MPayable|MView|MPure->falseletis_external=function|VExternal->true|VInternal|VPublic|VPrivate->falseletis_internal=function|VInternal->true|VExternal|VPublic|VPrivate->falseletis_private=function|VPrivate->true|VExternal|VInternal|VPublic->falseletis_public=function|VPublic->true|VExternal|VInternal|VPrivate->falseletis_inheritable=function|VPublic|VExternal|VInternal->true|VPrivate->falseletsame_mutabilitym1m2=matchm1,m2with|MPure,MPure->true|MView,MView->true|MPayable,MPayable->true|MNonPayable,MNonPayable->true|_->false(* for the purpose of overriding *)letconvertible_mutability~from~to_=matchfrom,to_with|MNonPayable,(MView|MPure|MNonPayable)->true|MNonPayable,MPayable->false|MView,(MPure|MView)->true|MView,(MPayable|MNonPayable)->false|MPure,MPure->true|MPure,(MView|MPayable|MNonPayable)->false|MPayable,MPayable->true|MPayable,(MPure|MView|MNonPayable)->falseletsame_visibilityv1v2=matchv1,v2with|VExternal,VExternal->true|VInternal,VInternal->true|VPublic,VPublic->true|VPrivate,VPrivate->true|_->false(* for the purpose of overriding *)letconvertible_visibility~from~to_=matchfrom,to_with|VExternal,(VPublic|VExternal)->true|VExternal,(VInternal|VPrivate)->false|VPublic,VPublic->true|VPublic,(VExternal|VInternal|VPrivate)->false|VInternal,VInternal->true|VInternal,(VExternal|VPublic|VPrivate)->false|VPrivate,VPrivate->true|VPrivate,(VExternal|VPublic|VInternal)->falseletunit_factorunit=letz=matchunitwith|Unit->Z.one|Wei->Z.one|Kwei->ExtZ._10_3|Mwei->ExtZ._10_6|Gwei->ExtZ._10_9|Twei->ExtZ._10_12|Pwei->ExtZ._10_15|Ether->ExtZ._10_18|Hours->ExtZ._3600|Minutes->ExtZ._60|Seconds->Z.one|Days->ExtZ._24x3600|Weeks->ExtZ._7x24x3600|Years->ExtZ._365x24x3600inQ.of_bigintzletapply_unitqunit=matchunitwith|Unit|Wei|Seconds->q|_->Q.mulq(unit_factorunit)letapply_unopopq=matchopwith|UPlus->Some(q)|UMinus->Some(Q.negq)|UNot->ifExtQ.is_intqthenSome(Q.of_bigint(Z.lognot(Q.numq)))elseNone|ULNot|UInc|UDec|UDelete->Noneletapply_binopq1opq2=matchopwith|BPlus->Some(Q.addq1q2)|BMinus->Some(Q.subq1q2)|BTimes->Some(Q.mulq1q2)|BDiv->Some(Q.divq1q2)|BMod->(* TODO: Solidity allows this on fractions *)ifExtQ.is_intq1&&ExtQ.is_intq2thenSome(Q.of_bigint(snd(Z.ediv_rem(Q.numq1)(Q.numq2))))elseNone|BExp->ifExtQ.is_intq2thenlete=Z.to_int(Q.numq2)in(* Warning: may overflow *)letn=Z.pow(Q.numq1)einletd=Z.pow(Q.denq1)einSome(Q.makend)elseNone|BAnd->ifExtQ.is_intq1&&ExtQ.is_intq2thenSome(Q.of_bigint(Z.logand(Q.numq1)(Q.numq2)))elseNone|BOr->ifExtQ.is_intq1&&ExtQ.is_intq2thenSome(Q.of_bigint(Z.logor(Q.numq1)(Q.numq2)))elseNone|BXor->ifExtQ.is_intq1&&ExtQ.is_intq2thenSome(Q.of_bigint(Z.logxor(Q.numq1)(Q.numq2)))elseNone|BLShift->ifExtQ.is_intq1&&ExtQ.is_intq2&&ExtQ.is_posq2thenSome(Q.of_bigint(Z.shift_left(Q.numq1)(Q.to_intq2)))elseNone|BRShift->ifExtQ.is_intq1&&ExtQ.is_intq2&&ExtQ.is_posq2thenSome(Q.of_bigint(Z.shift_right(Q.numq1)(Q.to_intq2)))elseNone|BLAnd|BLOr->None