o !Ôb„kã@sPdZddlmZmZmZmZmZdZdd„Z Gdd„de ƒZ Gdd „d e ƒZ d S) z?Support classes for generating code from abstract syntax trees.é)ÚastÚ _ast_ConstantÚ IS_PYTHON2ÚisstringÚ _ast_Ellipsiszrestructuredtext encCst|d|tjƒS)NÚ)ÚcompileÚ_astÚ PyCF_ONLY_AST)ÚsourceÚmode©r ú9/usr/lib/python3/dist-packages/genshi/template/astutil.pyÚparseórc@sÊeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z e Z e Z dd„Z dd„Z es0dd„Zdd„Zdd„Zdd„Zdd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„ZeZd2d3„Z d4d5„Z!d6d7„Z"d8d9„Z#d:d;„Z$dd?„Z&d@dA„Z'dBdC„Z(dDdE„Z)dFdG„Z*dHdI„Z+dJdK„Z,e-j.dLe-j/dMiZ0e,dNdO„ƒZ1e-j2dPe-j3dQe-j4dRe-j5dSe-j6dTe-j7dUe-j8dVe-j9dWe-j:dXe-j;dYe-je,d\d]„ƒZ?e-j@d^e-jAd_e-jBdPe-jCdQiZDd`da„ZEe,dbdc„ƒZFe,ddde„ƒZGdfdg„ZHdhdi„ZIdjdk„ZJdldm„ZKe-jLdne-jMdoe-jNdpe-jOdqe-jPdre-jQdse-jRdte-jSdue-jTdve-jUdwi ZVe,dxdy„ƒZWdzd{„ZXd|d}„ZYd~d„ZZd€d„Z[d‚dƒ„Z\esKd„d…„Z]d†d‡„Z^dˆd‰„Z_dŠd‹„Z`dŒd„ZadŽd„Zbdd‘„Zcd’S)“ÚASTCodeGeneratorz­General purpose base class for AST transformations. Every visitor method can be overridden to return an AST node that has been altered or replaced in some way. cCspg|_d|_d|_d|_d|_d|_g|_| |¡|j ¡r0|j|jd7_|j  |j¡d|_d|_dS)NrrÚ ) Ú lines_infoÚ line_infoÚcodeÚlineÚlastÚindentÚ blame_stackÚvisitÚstripÚappend)ÚselfÚtreer r rÚ__init__s   zASTCodeGenerator.__init__cCs|j|7_dS©N)r)rÚdeltar r rÚ_change_indent.szASTCodeGenerator._change_indentcCsx|jdur|j|jd7_|j |j¡d|j|_t|jƒdkr+g|_d|_dSd|jdfg|_|jd|_dS)Nrz réÿÿÿÿ) rrrrrrÚlenrr©rr r rÚ _new_line1s   zASTCodeGenerator._new_linecCsŽt|ƒdkrdSt|jƒdkr$|jdur#d|_|j t|jƒ|jf¡n|j|jdkr>|jd|_|j t|jƒ|jf¡|j|7_dS)Nrr#)r$rrrrr)rÚsr r rÚ_write=s  € zASTCodeGenerator._writecsÄ|durdSt|ƒturt‡fdd„|DƒƒSzˆj |j|jf¡d}Wn ty0d}Ynwt|tt t t t fƒr?t |ƒ}tˆd|jjdƒ}|durUtdt|ƒƒ‚||ƒ}|r`ˆj ¡|S)Ncóg|]}ˆ |¡‘qSr ©r©Ú.0Únr%r rÚ Nóz*ASTCodeGenerator.visit..TFúvisit_%szUnhandled node type %r)ÚtypeÚtuplerrÚlinenoÚ col_offsetÚAttributeErrorÚ isinstanceÚboolÚbytesÚfloatÚintÚstrrÚgetattrÚ __class__Ú__name__Ú ExceptionÚpop)rÚnodeÚinfoÚvisitorÚretr r%rrJs&  ÿ zASTCodeGenerator.visitcCs|jD]}| |¡qdSr )Úbodyr)rrAr-r r rÚ visit_Module`s  ÿzASTCodeGenerator.visit_ModulecCs| ¡| |j¡Sr )r&rrE©rrAr r rÚvisit_Expressionfs z!ASTCodeGenerator.visit_ExpressioncsÔ‡‡fdd„‰dg‰‡‡fdd„}||j|jƒt|ddƒr8ˆƒˆ d¡t|jƒr2ˆ |j¡nˆ |j¡t|ddƒrE||j|jƒt|d dƒrhˆƒˆ d ¡t|j ƒr`ˆ |j ¡dSˆ |j ¡dSdS) Ncs"ˆdr dˆd<dSˆ d¡dS)NrFú, ©r(r )Ú_firstrr rÚwrite_possible_commars z>ASTCodeGenerator.visit_arguments..write_possible_commaTcsnt|ƒt|ƒ}t|ƒD](\}}ˆƒˆ |¡||}|dkr4||dur4ˆ d¡ˆ |||¡q dS)Nrú=)r$Ú enumeraterr()ÚargsÚdefaultsÚno_default_countÚiÚargÚ default_idx)rrLr rÚ write_argsys  €úz4ASTCodeGenerator.visit_arguments..write_argsÚvarargÚ*Ú kwonlyargsÚkwargú**) rOrPr<r(rrVrrXÚ kw_defaultsrY)rrArUr )rKrrLrÚvisit_argumentsqs&        úz ASTCodeGenerator.visit_argumentscCó| |j¡dSr )r(rSrGr r rÚ visit_arg—rzASTCodeGenerator.visit_argcCs| d¡| |j¡dS)NrW©r(rÚvaluerGr r rÚ visit_Starredšs zASTCodeGenerator.visit_StarredcCs¬d}t|dƒr t|dƒ}nt|ddƒ}|D]}| ¡| d¡| |¡q| ¡| d|jd¡| |j¡| d¡| d¡|jD]}| |¡qG| d ¡dS) Nr Údecorator_listÚ decoratorsú@zdef ú(z):ér#) Úhasattrr<r&r(rÚnamerOr"rE)rrAÚ decaratorsrcÚ decoratorÚ statementr r rÚvisit_FunctionDef s           z"ASTCodeGenerator.visit_FunctionDefcCs¢| ¡| d|j¡|jr5| d¡| |jd¡|jdd…D] }| d¡| |¡q#| d¡| d¡| d¡|jD]}| |¡qB| d¡dS) Nzclass rerrfrIú)ú:r#)r&r(rhÚbasesrr"rE)rrAÚbaserkr r rÚvisit_ClassDef´s        zASTCodeGenerator.visit_ClassDefcCs<| ¡| d¡t|ddƒr| d¡| |j¡dSdS)NÚreturnr`ú )r&r(r<rr`rGr r rÚ visit_ReturnÅs    þzASTCodeGenerator.visit_ReturncCóN| ¡| d¡| |jd¡|jdd…D] }| d¡| |¡qdS)Nzdel rrfrI)r&r(rÚtargets©rrAÚtargetr r rÚ visit_DeleteÍó   þzASTCodeGenerator.visit_DeletecCs8| ¡|jD] }| |¡| d¡q| |j¡dS)Nz = )r&rvrr(r`rwr r rÚ visit_AssignÖs    zASTCodeGenerator.visit_AssigncCs@| ¡| |j¡| d|j|jjd¡| |j¡dS)Nrsz= )r&rrxr(Úbinary_operatorsÚopr=r`rGr r rÚvisit_AugAssignÞs z ASTCodeGenerator.visit_AugAssigncCs²| ¡| d¡t|ddƒr&| d¡| |j¡t|ddƒr%| d¡n| d¡t|ddƒrM| |jd¡|jdd…D] }| d¡| |¡q@|jsW| d ¡dSdS) NÚprintÚdestz >> ÚvaluesrIrsrrfú,)r&r(r<rr€rÚnl)rrAr`r r rÚ visit_Printås"      €    ÿzASTCodeGenerator.visit_PrintcCs¸| ¡| d¡| |j¡| d¡| |j¡| d¡| d¡|jD]}| |¡q'| d¡t|ddƒrZ| ¡| d¡| d¡|jD]}| |¡qK| d¡dSdS)Nzfor ú in rnrfr#Úorelseúelse:) r&r(rrxÚiterr"rEr<r†©rrArkr r rÚ visit_Forøs$              úzASTCodeGenerator.visit_ForcCó¢| ¡| d¡| |j¡| d¡| d¡|jD]}| |¡q| d¡t|ddƒrO| ¡| d¡| d¡|jD]}| |¡q@| d¡dSdS)Nzwhile rnrfr#r†r‡©r&r(rÚtestr"rEr<r†r‰r r rÚ visit_While ó             úzASTCodeGenerator.visit_WhilecCr‹)Nzif rnrfr#r†r‡rŒr‰r r rÚvisit_IfrzASTCodeGenerator.visit_IfcCs²| ¡| d¡t|ddƒ}d}|dur|g}|D]"}|s#| d¡d}| |j¡t|ddƒr<| d¡| |j¡q| d¡| d ¡|jD]}| |¡qJ| d ¡dS) Nzwith ÚitemsTrIFÚ optional_varsú as rnrfr#)r&r(r<rÚ context_exprr’r"rE)rrAr‘ÚfirstÚitemrkr r rÚ visit_With1s(       €    zASTCodeGenerator.visit_WithcCs¾| ¡| d¡tr=|jsdS| d¡| |j¡|js dS| d¡| |j¡|js0dS| d¡| |j¡dS|jsBdS| d¡| |j¡|jsRdS| d¡| |j¡dS)NÚraisersrIz from ) r&r(rr1rÚinstÚtbackÚexcÚcauserGr r rÚ visit_RaiseGs.         zASTCodeGenerator.visit_RaisecCs®| ¡| d¡| d¡|jD]}| |¡q| d¡t|ddƒr/|jD]}| |¡q'| ¡t|ddƒrU| d¡| d¡|jD]}| |¡qF| d¡dSdS)Nútry:rfr#Úhandlersr†r‡)r&r(r"rErr<rŸr†©rrArkÚhandlerr r rÚvisit_TryExceptbs"             ûz ASTCodeGenerator.visit_TryExceptcCsŽ| ¡| d¡t|ddƒr| d¡| |j¡t|ddƒr+| d¡| |j¡| d¡| d¡|jD]}| |¡q8| d¡dS) NÚexceptr1rsrhrIrnrfr#)r&r(r<rr1rhr"rEr‰r r rÚvisit_ExceptHandlerus           z$ASTCodeGenerator.visit_ExceptHandlercCsŒ| ¡| d¡| d¡|jD]}| |¡q| d¡t|ddƒrD| ¡| d¡| d¡|jD]}| |¡q5| d¡dSdS)Nržrfr#Ú finalbodyúfinally:)r&r(r"rErr<r¥r‰r r rÚvisit_TryFinally†s          úz!ASTCodeGenerator.visit_TryFinallycCsö| ¡| d¡| d¡|jD]}| |¡q| d¡t|ddƒr/|jD]}| |¡q'| ¡t|ddƒrS| d¡| d¡|jD]}| |¡qF| d¡t|ddƒry| ¡| d¡| d¡|jD]}| |¡qj| d¡dSdS) Nržrfr#rŸr†r‡r¥r¦) r&r(r"rErr<rŸr†r¥r r r rÚ visit_Try˜s0                   úzASTCodeGenerator.visit_TrycCsH| ¡| d¡| |j¡t|ddƒr"| d¡| |j¡dSdS)Nzassert ÚmsgrI)r&r(rrr<r©rGr r rÚ visit_Assert²s    þzASTCodeGenerator.visit_AssertcCs6| |j¡t|ddƒr| d¡| |j¡dSdS)NÚasnamer“)r(rhr<r«rGr r rÚ visit_aliasºs   þzASTCodeGenerator.visit_aliascCru)Nzimport rrfrI©r&r(rÚnames©rrArhr r rÚ visit_ImportÁrzzASTCodeGenerator.visit_ImportcCsz| ¡| d¡|jr| d|j¡| |j¡| d¡| |jd¡|jdd…D] }| d¡| |¡q.dS)Nzfrom Ú.z import rrfrI)r&r(ÚlevelÚmodulerr®r¯r r rÚvisit_ImportFromÊs     þz!ASTCodeGenerator.visit_ImportFromcCsb| ¡| d¡| |j¡|jsdS| d¡| |j¡|js$dS| d¡| |j¡dS)Nzexec rI)r&r(rrEÚglobalsÚlocalsrGr r rÚ visit_Exec×s     zASTCodeGenerator.visit_ExeccCru)Nzglobal rrfrIr­r¯r r rÚ visit_GlobalårzzASTCodeGenerator.visit_GlobalcCs| ¡| |j¡dSr )r&rr`rGr r rÚ visit_ExprîszASTCodeGenerator.visit_ExprcCó| ¡| d¡dS)NÚpass©r&r(rGr r rÚ visit_PassóózASTCodeGenerator.visit_PasscCrº)NÚbreakr¼rGr r rÚ visit_Breakør¾zASTCodeGenerator.visit_BreakcCrº)NÚcontinuer¼rGr r rÚvisit_Continueýr¾zASTCodeGenerator.visit_Continuecs‡fdd„}|S)Ncs"| d¡ˆ||ƒ| d¡dS)NrermrJrG©Úfr rÚ_fs  z(ASTCodeGenerator.with_parens.._fr )rÄrÅr rÃrÚ with_parenss zASTCodeGenerator.with_parensÚandÚorcCsRd|j|jjd}| |jd¡|jdd…D] }| |¡| |¡qdS)Nrsrrf)Úbool_operatorsr}r=rrr()rrAÚjoinerr`r r rÚ visit_BoolOp s   þzASTCodeGenerator.visit_BoolOpú+ú-rWú/ú%rZz<>ú|ú^ú&z//cCs8| |j¡| d|j|jjd¡| |j¡dS©Nrs)rÚleftr(r|r}r=ÚrightrGr r rÚ visit_BinOp$s zASTCodeGenerator.visit_BinOpú~ÚnotcCs(| |j|jjd¡| |j¡dSrÓ)r(Úunary_operatorsr}r=rÚoperandrGr r rÚ visit_UnaryOp2szASTCodeGenerator.visit_UnaryOpcCs0| d¡| |j¡| d¡| |j¡dS)Nzlambda ú: )r(rrOrErGr r rÚ visit_Lambda7s   zASTCodeGenerator.visit_LambdacCs<| |j¡| d¡| |j¡| d¡| |j¡dS)Nú if z else )rrEr(rr†rGr r rÚ visit_IfExp?s    zASTCodeGenerator.visit_IfExpcCsX| d¡t|j|jƒD]\}}| |¡| d¡| |¡| d¡q | d¡dS)Nú{rÜrIú})r(ÚzipÚkeysrr)rrAÚkeyr`r r rÚ visit_DictHs     zASTCodeGenerator.visit_DictcCó|| d¡| |j¡|jD](}| d¡| |j¡| d¡| |j¡|jD] }| d¡| |¡q)q| d¡dS)Nú[ú for r…rÞú]©r(rÚeltÚ generatorsrxrˆÚifs©rrAÚ generatorÚifexprr r rÚvisit_ListCompRó          þzASTCodeGenerator.visit_ListCompcCræ)Nrerèr…rÞrmrêrîr r rÚvisit_GeneratorExparòz#ASTCodeGenerator.visit_GeneratorExpcCs4| d¡t|ddƒr| d¡| |j¡dSdS)NÚyieldr`rs)r(r<rr`rGr r rÚ visit_Yieldps   þzASTCodeGenerator.visit_Yieldz==z!=úz>=Úiszis notÚinznot incCsL| |j¡t|j|jƒD]\}}| d|j|jd¡| |¡q dSrÓ)rrÔrâÚopsÚ comparatorsr(Úcomparision_operatorsr=)rrAr}Ú comparatorr r rÚ visit_Compare„s  þzASTCodeGenerator.visit_ComparecCs | |j¡| d¡d}|jD]}|s| d¡d}| |¡q|jD]%}|s-| d¡d}|js8| d¡n | |j¡| d¡| |j¡q$t|ddƒrd|sW| d¡d}| d¡| |j¡t|d dƒr~|sq| d¡d}| d¡| |j ¡| d ¡dS) NreTrIFrZrMÚstarargsrWÚkwargsrm) rÚfuncr(rOÚkeywordsrSr`r<rÿr)rrAr•rSÚkeywordr r rÚ visit_Calls<                  zASTCodeGenerator.visit_CallcCs$| d¡| |j¡| d¡dS)Nú`r_rGr r rÚ visit_Repr³s  zASTCodeGenerator.visit_ReprcCó| t|jƒ¡dSr )r(Úreprr-rGr r rÚ visit_Num¹ózASTCodeGenerator.visit_NumcCrr ©r(rr'rGr r rÚ visit_Str½r zASTCodeGenerator.visit_StrcCrr )r(rr`rGr r rÚvisit_ConstantÁr zASTCodeGenerator.visit_ConstantcCrr r rGr r rÚ visit_BytesÆr zASTCodeGenerator.visit_BytescCs&| |j¡| d¡| |j¡dS)Nr±)rr`r(ÚattrrGr r rÚvisit_AttributeÊs  z ASTCodeGenerator.visit_Attributecs:ˆ |j¡ˆ d¡‡fdd„}||jƒˆ d¡dS)Nrçcsút|tƒr ˆ d¡dSt|tjƒrDt|ddƒrˆ |j¡ˆ d¡t|ddƒr/ˆ |j¡t|ddƒrBˆ d¡ˆ |j ¡dSdSt|tj ƒrRˆ |j ¡dSt|tj ƒrvˆ |j d¡|j dd…D] }ˆ d ¡ˆ |¡qgdSˆ |¡dS) Nz...ÚlowerÚNonernÚupperÚsteprrfrI)r6rr(r ÚSlicer<rrrrÚIndexr`ÚExtSliceÚdims)rAÚdimr%r rÚ_process_sliceÓs*         þ    þz8ASTCodeGenerator.visit_Subscript.._process_sliceré)rr`r(Úslice)rrArr r%rÚvisit_SubscriptÐs    z ASTCodeGenerator.visit_SubscriptcCr]r )r(ÚidrGr r rÚ visit_NameìrzASTCodeGenerator.visit_NamecCsX|jdur | d¡dS|jdur| d¡dS|jdur$| d¡dStd|jfƒ‚)NrTÚTrueFÚFalsezUnknown NameConstant %r)r`r(r?rGr r rÚvisit_NameConstantðs   z#ASTCodeGenerator.visit_NameConstantcCs8| d¡|jD] }| |¡| d¡q| d¡dS)NrçrIré©r(Úeltsr©rrArër r rÚ visit_Listûs    zASTCodeGenerator.visit_ListcCsJ| d¡|jD]}|dur| |¡n| d¡| d¡q| d¡dS)NrerrIrmr"r$r r rÚ visit_Tuples  € zASTCodeGenerator.visit_TupleN)dr>Ú __module__Ú __qualname__Ú__doc__rr"r&r(rrFÚvisit_InteractiveÚ visit_SuiterHr\rr^rarlrqrtryr{r~r„rŠrŽrr—rr¢r¤Úvisit_excepthandlerr§r¨rªr¬r°r´r·r¸r¹r½rÀrÂrÆr ÚAndÚOrrÉrËÚAddÚSubÚMultÚDivÚModÚPowÚLShiftÚRShiftÚBitOrÚBitXorÚBitAndÚFloorDivr|rÖÚInvertÚNotÚUAddÚUSubrÙrÛrÝrßrårñrórõÚEqÚNotEqÚLtÚLtEÚGtÚGtEÚIsÚIsNotÚInÚNotInrürþrrr r r rrrrr!r%r&r r r rrsÊ   $     ô ü   ö & rc@sòeZdZdZdd„Zdd„ZeZeZeZeZ eZ eZ eZ eZ eZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZ eZ!eZ"eZ#eZ$eZ%eZ&eZ'eZ(eZ)eZ*eZ+eZ,eZ-eZ.eZ/eZ0eZ1eZ2eZ3eZ4eZ5eZ6eZ7eZ8eZ9[dS)ÚASTTransformerz±General purpose base class for AST transformations. Every visitor method can be overridden to return an AST node that has been altered or replaced in some way. csV|durdSt|ƒturt‡fdd„|DƒƒStˆd|jjdƒ}|dur'|S||ƒS)Ncr)r r*r+r%r rr.r/z(ASTTransformer.visit..r0)r1r2r<r=r>)rrArCr r%rrs zASTTransformer.visitc sÔ| ¡}t|ddƒD]}z t||t||ƒƒWq ty Yq w|jD]C}zt||ƒ}Wn ty6Yq$w|dur.c3s|]}ˆ |¡VqdSr r*rKr%r rÚ 3s€z(ASTTransformer._clone..) r=r<Úsetattrr5Ú_fieldsr6Úlistr2r)rrAÚclonerhr`r r%rÚ_clone!s, ÿ  ÿ   zASTTransformer._cloneN):r>r'r(r)rrRrFr*rHr+rlrqrtryr{r~r„rŠrŽrr—rr¢r§r¨rªr¤r°r´r·r¸r¹rËrÖrÛrÝrßrårñrórõrþrrrrrr!r%r&Úvisit_comprehensionr,r\Ú visit_keywordr¬Ú visit_SliceÚvisit_ExtSliceÚ visit_Indexr r r rrIsr rIN) r)Ú genshi.compatrr rrrrÚ __docformat__rÚobjectrrIr r r rÚs |