o !bk@sPdZddlmZmZmZmZmZdZddZ Gddde Z Gdd d e Z d S) z?Support classes for generating code from abstract syntax trees.)ast _ast_Constant IS_PYTHON2isstring _ast_Ellipsiszrestructuredtext encCst|d|tjS)N)compile_ast PyCF_ONLY_AST)sourcemoder 9/usr/lib/python3/dist-packages/genshi/template/astutil.pyparserc@seZdZdZddZddZddZdd Zd d Zd d Z e Z e Z ddZ ddZ es0ddZddZddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)Zd*d+Zd,d-Zd.d/Zd0d1ZeZd2d3Z d4d5Z!d6d7Z"d8d9Z#d:d;Z$dd?Z&d@dAZ'dBdCZ(dDdEZ)dFdGZ*dHdIZ+dJdKZ,e-j.dLe-j/dMiZ0e,dNdOZ1e-j2dPe-j3dQe-j4dRe-j5dSe-j6dTe-j7dUe-j8dVe-j9dWe-j:dXe-j;dYe-je,d\d]Z?e-j@d^e-jAd_e-jBdPe-jCdQiZDd`daZEe,dbdcZFe,dddeZGdfdgZHdhdiZIdjdkZJdldmZKe-jLdne-jMdoe-jNdpe-jOdqe-jPdre-jQdse-jRdte-jSdue-jTdve-jUdwi ZVe,dxdyZWdzd{ZXd|d}ZYd~dZZddZ[ddZ\esKddZ]ddZ^ddZ_ddZ`ddZaddZbddZcdS)ASTCodeGeneratorzGeneral 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|_|||jr0|j|jd7_|j |jd|_d|_dS)Nrr ) lines_info line_infocodelinelastindent blame_stackvisitstripappend)selftreer r r__init__s   zASTCodeGenerator.__init__cCs|j|7_dSN)r)rdeltar r r_change_indent.szASTCodeGenerator._change_indentcCsx|jdur|j|jd7_|j|jd|j|_t|jdkr+g|_d|_dSd|jdfg|_|jd|_dS)Nrz r) rrrrrrlenrrrr r r _new_line1s   zASTCodeGenerator._new_linecCst|dkrdSt|jdkr$|jdur#d|_|jt|j|jfn|j|jdkr>|jd|_|jt|j|jf|j|7_dS)Nrr#)r$rrrrr)rsr r r_write=s   zASTCodeGenerator._writecs|durdSt|turtfdd|DSzj|j|jfd}Wn ty0d}Ynwt|tt t t t fr?t |}td|jjd}|durUtdt|||}|r`j|S)Ncg|]}|qSr r.0nr%r r Nz*ASTCodeGenerator.visit..TFvisit_%szUnhandled node type %r)typetuplerrlineno col_offsetAttributeError isinstanceboolbytesfloatintstrrgetattr __class____name__ Exceptionpop)rnodeinfovisitorretr r%rrJs&   zASTCodeGenerator.visitcCs|jD]}||qdSr )bodyr)rrAr-r r r visit_Module`s  zASTCodeGenerator.visit_ModulecCs|||jSr )r&rrErrAr r rvisit_Expressionfs z!ASTCodeGenerator.visit_Expressioncsfdddgfdd}||j|jt|ddr8dt|jr2|jn|jt|ddrE||j|jt|d drhd t|j r`|j dS|j dSdS) Ncs"dr dd<dSddS)NrF, r(r )_firstrr rwrite_possible_commars z>ASTCodeGenerator.visit_arguments..write_possible_commaTcsnt|t|}t|D](\}}|||}|dkr4||dur4d|||q dS)Nr=)r$ enumeraterr()argsdefaultsno_default_countiarg default_idx)rrLr r write_argsys  z4ASTCodeGenerator.visit_arguments..write_argsvararg* kwonlyargskwarg**) rOrPr<r(rrVrrX kw_defaultsrY)rrArUr )rKrrLrvisit_argumentsqs&        z ASTCodeGenerator.visit_argumentscC||jdSr )r(rSrGr r r visit_argrzASTCodeGenerator.visit_argcCs|d||jdS)NrWr(rvaluerGr r r visit_Starreds zASTCodeGenerator.visit_StarredcCsd}t|dr 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(rnamerOr"rE)rrA decaratorsrc decorator statementr r rvisit_FunctionDefs           z"ASTCodeGenerator.visit_FunctionDefcCs||d|j|jr5|d||jd|jddD] }|d||q#|d|d|d|jD]}||qB|ddS) Nzclass rerrfrI):r#)r&r(rhbasesrr"rE)rrAbaserkr r rvisit_ClassDefs        zASTCodeGenerator.visit_ClassDefcCs<||dt|ddr|d||jdSdS)Nreturnr` )r&r(r<rr`rGr r r visit_Returns    zASTCodeGenerator.visit_ReturncCN||d||jd|jddD] }|d||qdS)Nzdel rrfrI)r&r(rtargetsrrAtargetr r r visit_Delete   zASTCodeGenerator.visit_DeletecCs8||jD] }|||dq||jdS)Nz = )r&rvrr(r`rwr r r visit_Assigns    zASTCodeGenerator.visit_AssigncCs@|||j|d|j|jjd||jdS)Nrsz= )r&rrxr(binary_operatorsopr=r`rGr r rvisit_AugAssigns z ASTCodeGenerator.visit_AugAssigncCs||dt|ddr&|d||jt|ddr%|dn|dt|ddrM||jd|jddD] }|d||q@|jsW|d dSdS) Nprintdestz >> valuesrIrsrrf,)r&r(r<rrrnl)rrAr`r r r visit_Prints"          zASTCodeGenerator.visit_PrintcCs||d||j|d||j|d|d|jD]}||q'|dt|ddrZ||d|d|jD]}||qK|ddSdS)Nzfor  in rnrfr#orelseelse:) r&r(rrxiterr"rEr<rrrArkr r r visit_Fors$              zASTCodeGenerator.visit_ForcC||d||j|d|d|jD]}||q|dt|ddrO||d|d|jD]}||q@|ddSdS)Nzwhile rnrfr#rrr&r(rtestr"rEr<rrr r r visit_While              zASTCodeGenerator.visit_WhilecCr)Nzif rnrfr#rrrrr r rvisit_IfrzASTCodeGenerator.visit_IfcCs||dt|dd}d}|dur|g}|D]"}|s#|dd}||jt|ddr<|d||jq|d|d |jD]}||qJ|d dS) Nzwith itemsTrIF optional_vars as rnrfr#)r&r(r<r context_exprrr"rE)rrArfirstitemrkr r r visit_With1s(           zASTCodeGenerator.visit_WithcCs||dtr=|jsdS|d||j|js dS|d||j|js0dS|d||jdS|jsBdS|d||j|jsRdS|d||jdS)NraisersrIz from ) r&r(rr1rinsttbackexccauserGr r r visit_RaiseGs.         zASTCodeGenerator.visit_RaisecCs||d|d|jD]}||q|dt|ddr/|jD]}||q'|t|ddrU|d|d|jD]}||qF|ddSdS)Ntry:rfr#handlersrr)r&r(r"rErr<rrrrArkhandlerr r rvisit_TryExceptbs"             z ASTCodeGenerator.visit_TryExceptcCs||dt|ddr|d||jt|ddr+|d||j|d|d|jD]}||q8|ddS) Nexceptr1rsrhrIrnrfr#)r&r(r<rr1rhr"rErr r rvisit_ExceptHandlerus           z$ASTCodeGenerator.visit_ExceptHandlercCs||d|d|jD]}||q|dt|ddrD||d|d|jD]}||q5|ddSdS)Nrrfr# finalbodyfinally:)r&r(r"rErr<rrr r rvisit_TryFinallys          z!ASTCodeGenerator.visit_TryFinallycCs||d|d|jD]}||q|dt|ddr/|jD]}||q'|t|ddrS|d|d|jD]}||qF|dt|ddry||d|d|jD]}||qj|ddSdS) Nrrfr#rrrrr) r&r(r"rErr<rrrrr r r visit_Trys0                   zASTCodeGenerator.visit_TrycCsH||d||jt|ddr"|d||jdSdS)Nzassert msgrI)r&r(rrr<rrGr r r visit_Asserts    zASTCodeGenerator.visit_AssertcCs6||jt|ddr|d||jdSdS)Nasnamer)r(rhr<rrGr r r visit_aliass   zASTCodeGenerator.visit_aliascCru)Nzimport rrfrIr&r(rnamesrrArhr r r visit_ImportrzzASTCodeGenerator.visit_ImportcCsz||d|jr|d|j||j|d||jd|jddD] }|d||q.dS)Nzfrom .z import rrfrI)r&r(levelmodulerrrr r rvisit_ImportFroms     z!ASTCodeGenerator.visit_ImportFromcCsb||d||j|jsdS|d||j|js$dS|d||jdS)Nzexec rI)r&r(rrEglobalslocalsrGr r r visit_Execs     zASTCodeGenerator.visit_ExeccCru)Nzglobal rrfrIrrr r r visit_GlobalrzzASTCodeGenerator.visit_GlobalcCs|||jdSr )r&rr`rGr r r visit_ExprszASTCodeGenerator.visit_ExprcC||ddS)Npassr&r(rGr r r visit_PasszASTCodeGenerator.visit_PasscCr)NbreakrrGr r r visit_BreakrzASTCodeGenerator.visit_BreakcCr)NcontinuerrGr r rvisit_ContinuerzASTCodeGenerator.visit_Continuecsfdd}|S)Ncs"|d|||ddS)NrermrJrGfr r_fs  z(ASTCodeGenerator.with_parens.._fr )rrr rr with_parenss zASTCodeGenerator.with_parensandorcCsRd|j|jjd}||jd|jddD] }||||qdS)Nrsrrf)bool_operatorsr}r=rrr()rrAjoinerr`r r r visit_BoolOp s   zASTCodeGenerator.visit_BoolOp+-rW/%rZz<>|^&z//cCs8||j|d|j|jjd||jdSNrs)rleftr(r|r}r=rightrGr r r visit_BinOp$s zASTCodeGenerator.visit_BinOp~notcCs(||j|jjd||jdSr)r(unary_operatorsr}r=roperandrGr r r visit_UnaryOp2szASTCodeGenerator.visit_UnaryOpcCs0|d||j|d||jdS)Nzlambda : )r(rrOrErGr r r visit_Lambda7s   zASTCodeGenerator.visit_LambdacCs<||j|d||j|d||jdS)N if z else )rrEr(rrrGr r r visit_IfExp?s    zASTCodeGenerator.visit_IfExpcCsX|dt|j|jD]\}}|||d|||dq |ddS)N{rrI})r(zipkeysrr)rrAkeyr`r r r visit_DictHs     zASTCodeGenerator.visit_DictcC||d||j|jD](}|d||j|d||j|jD] }|d||q)q|ddS)N[ for rr]r(relt generatorsrxrifsrrA generatorifexprr r rvisit_ListCompR          zASTCodeGenerator.visit_ListCompcCr)Nrerrrrmrrr r rvisit_GeneratorExparz#ASTCodeGenerator.visit_GeneratorExpcCs4|dt|ddr|d||jdSdS)Nyieldr`rs)r(r<rr`rGr r r visit_Yieldps   zASTCodeGenerator.visit_Yieldz==z!=z>=iszis notinznot incCsL||jt|j|jD]\}}|d|j|jd||q dSr)rrrops comparatorsr(comparision_operatorsr=)rrAr} comparatorr r r visit_Compares  zASTCodeGenerator.visit_ComparecCs ||j|dd}|jD]}|s|dd}||q|jD]%}|s-|dd}|js8|dn ||j|d||jq$t|ddrd|sW|dd}|d||jt|d dr~|sq|dd}|d||j |d dS) NreTrIFrZrMstarargsrWkwargsrm) rfuncr(rOkeywordsrSr`r<rr)rrArrSkeywordr r r visit_Calls<                  zASTCodeGenerator.visit_CallcCs$|d||j|ddS)N`r_rGr r r visit_Reprs  zASTCodeGenerator.visit_ReprcC|t|jdSr )r(reprr-rGr r r visit_NumzASTCodeGenerator.visit_NumcCrr r(rr'rGr r r visit_Strr zASTCodeGenerator.visit_StrcCrr )r(rr`rGr r rvisit_Constantr zASTCodeGenerator.visit_ConstantcCrr r rGr r r visit_Bytesr zASTCodeGenerator.visit_BytescCs&||j|d||jdS)Nr)rr`r(attrrGr r rvisit_Attributes  z ASTCodeGenerator.visit_Attributecs:|jdfdd}||jddS)Nrcst|tr ddSt|tjrDt|ddr|jdt|ddr/|jt|ddrBd|j dSdSt|tj rR|j dSt|tj rv|j d|j ddD] }d |qgdS|dS) Nz...lowerNonernuppersteprrfrI)r6rr(r Slicer<rrrrIndexr`ExtSlicedims)rAdimr%r r_process_slices*             z8ASTCodeGenerator.visit_Subscript.._process_slicer)rr`r(slice)rrArr r%rvisit_Subscripts    z ASTCodeGenerator.visit_SubscriptcCr]r )r(idrGr r r visit_NamerzASTCodeGenerator.visit_NamecCsX|jdur |ddS|jdur|ddS|jdur$|ddStd|jf)NrTTrueFFalsezUnknown NameConstant %r)r`r(r?rGr r rvisit_NameConstants   z#ASTCodeGenerator.visit_NameConstantcCs8|d|jD] }|||dq|ddS)NrrIrr(eltsrrrArr r r visit_Lists    zASTCodeGenerator.visit_ListcCsJ|d|jD]}|dur||n|d|dq|ddS)NrerrIrmr"r$r r r visit_Tuples   zASTCodeGenerator.visit_TupleN)dr> __module__ __qualname____doc__rr"r&r(rrFvisit_Interactive visit_SuiterHr\rr^rarlrqrtryr{r~rrrrrrrrvisit_excepthandlerrrrrrrrrrrrrrr AndOrrrAddSubMultDivModPowLShiftRShiftBitOrBitXorBitAndFloorDivr|rInvertNotUAddUSubrrrrrrrrEqNotEqLtLtEGtGtEIsIsNotInNotInrrrrr r r rrrrr!r%r&r r r rrs   $          & rc@seZdZdZddZddZeZeZeZeZ eZ eZ eZ eZ eZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZeZ eZ!eZ"eZ#eZ$eZ%eZ&eZ'eZ(eZ)eZ*eZ+eZ,eZ-eZ.eZ/eZ0eZ1eZ2eZ3eZ4eZ5eZ6eZ7eZ8eZ9[dS)ASTTransformerzGeneral 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|turtfdd|DStd|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|ddD]}z t||t||Wq ty Yq w|jD]C}zt||}Wn ty6Yq$w|dur.c3s|]}|VqdSr r*rKr%r r 3sz(ASTTransformer._clone..) r=r<setattrr5_fieldsr6listr2r)rrAclonerhr`r r%r_clone!s,      zASTTransformer._cloneN):r>r'r(r)rrRrFr*rHr+rlrqrtryr{r~rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr!r%r&visit_comprehensionr,r\ visit_keywordr visit_Slicevisit_ExtSlice visit_Indexr r r rrIsr rIN) r) genshi.compatrr rrrr __docformat__robjectrrIr r r rs |