PL iOdZddlmZddlmZddlmZddlmZddlmZddlmZddlmZdd lm Z dd lm Z dd lm Z dd lm Z dd lm Z ddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZdd lm Z ed!ed"iZ!ed#ed$ed%ed&e d'ed(ed)ed*ed+ed,ed-i Z"e d.e d/e d0ed1ed2ed3ed4ed5ed6ed7i Z#ed8ed9ed#e d$iZ$iZ%e%jMe!e%jMe"e%jMe#e%jMe$dCd:Z'd;Z(Gd<d=Z)Gd>d?e)Z*Gd@dAe)Z+yB)Dz ast ~~~ This is a stripped down version of Armin Ronacher's ast module. :copyright: Copyright 2008 by Armin Ronacher. :license: Python License. )Add)And)AST)BitAnd)BitOr)BitXor)Div)Eq)FloorDiv)Gt)GtE)If)In)Invert)Is)IsNot)LShift)Lt)LtE)Mod)Mult)Name)Not)NotEq)NotIn)Or) PyCF_ONLY_AST)RShift)Sub)UAdd)USubandor+-*/z//%z<>|&^z==>z>=iniszis notmethods r7 get_visitorzNodeVisitor.get_visitorzs' DNN333tVT**r9cZ|j|}|||S|j|S)z Visit a node.)rI generic_visit)rGr>fs r7visitzNodeVisitor.visits1   T " =T7N!!$''r9ct|D]a\}}t|tr*|D]$}t|ts|j |&@t|tsQ|j |cy)z9Called if no explicit visitor function exists for a node.N)r@ isinstancelistrrM)rGr>r?valueitems r7rKzNodeVisitor.generic_visitsa'- "LE5%&!)D!$, 4()E3' 5!  "r9N)rF __module__ __qualname____doc__rIrMrKr9r7rBrBhs +("r9rBceZdZdZdZy)NodeTransformera Walks the abstract syntax tree and allows modifications of nodes. The `NodeTransformer` will walk the AST and use the return value of the visitor functions to replace or remove the old node. If the return value of the visitor function is `None` the node will be removed from the previous location otherwise it's replaced with the return value. The return value may be the original node in which case no replacement takes place. Here an example transformer that rewrites all `foo` to `data['foo']`:: class RewriteName(NodeTransformer): def visit_Name(self, node): return copy_location(Subscript( value=Name(id='data', ctx=Load()), slice=Index(value=Str(s=node.id)), ctx=node.ctx ), node) Keep in mind that if the node you're operating on has child nodes you must either transform the child nodes yourself or call the generic visit function for the node first. Nodes that were part of a collection of statements (that applies to all statement nodes) may also return a list of nodes rather than just a single node. Usually you use the transformer like this:: node = YourTransformer().visit(node) ct|D]\}}t||d}t|trfg}|D]Y}t|tr6|j |}|'t|ts|j |I|j|[||ddt|ts|j |}| t||t||||SN) r@r<rOrPrrMextendappenddelattrsetattr)rGr>r? old_value new_valuesrQnew_nodes r7rKzNodeTransformer.generic_visits +D 1 3 E9eT2I)T* &-E!%- $ 5 1 =$!+E3!7&--e4$%%e,- * ! Is+::i0#D%(D%2' 3( r9N)rFrSrTrUrKrVr9r7rXrXs  Dr9rXceZdZdZdZdZdDdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#Z%d$Z&d%Z'd&Z(d'Z)d(Z*d)Z+e+d*d+Z,e+d,d-Z-[+d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4Z4d5Z5d6Z6d7Z7d8Z8d9Z9e9d*d+Z:e9d:d;Z;e9d,d-Z<[9d<Z=d=Z>d>Z?d?Z@d@ZAdAZBdBZCyC)ESourceGeneratorz This visitor is able to transform a well formed syntax tree into python sourcecode. For more details have a look at the docstring of the `node_to_source` function. c<g|_||_d|_d|_y)Nr)result indent_with indentation new_lines)rGrfs r7__init__zSourceGenerator.__init__s  &r9c,|jrm|jr(|jjd|jz|jj|j|jzd|_|jj|y)N r)rhrer\rfrg)rGxs r7writezSourceGenerator.writesg >>{{ ""4$..#89 KK  t//$2B2BB CDN 1r9c:t|j||_yrZ)maxrh)rGns r7newlinezSourceGenerator.newlinesT^^Q/r9cd|_|xjdz c_|D]}|j||xjdzc_y)NT)new_linergrM)rG statementsstmts r7bodyzSourceGenerator.bodysF  A D JJt   Ar9c|j|j|jr=|j|jd|j|jyy)Nelse:)rworelserqrmrGr>s r7 body_or_elsezSourceGenerator.body_or_elsesC $)) ;; LLN JJw  IIdkk " r9c4gfd}dgt|jt|jz z}t|j||jzD]B\}}|j ||!j dj |D|j /|j d|j jz|j0|j d|jjzyy)NcPrjdyjdyN, Trmr\rG want_commasr7 write_commaz.SourceGenerator.signature..write_comma  4 !!$'r9=r&**) lenargsdefaultsziprMrmvarargargkwarg)rGr>rpaddingrdefaultrs` @r7 signaturezSourceGenerator.signatures  ( &C NS-??@ 7T]]+BC $LC M JJsO" 3 7#  $ ;; " M JJsT[[__, - :: ! M JJtdjjnn, - "r9c|jD]4}|j|jd|j|6y)N@)decorator_listrqrmrM)rGr> decorators r7 decoratorszSourceGenerator.decoratorss7,, "I LLN JJsO JJy ! "r9c|jt|jD])\}}|r|jd|j |+|jd|j |j y)Nrz = )rq enumeratetargetsrmrMrQrGr>idxtargets r7 visit_AssignzSourceGenerator.visit_Assigns` $T\\2 KC 4 JJv   5 4::r9c|j|j|j|jtt |j dz|j|jy)Nr)rqrMrrm BINOP_SYMBOLStypeoprQr{s r7visit_AugAssignzSourceGenerator.visit_AugAssign sI  4;; =dgg/#56 4::r9c|j|jdd|jz|jdt |j D])\}}|r|jd|j|+y)Nzfrom .z import r)rqrmlevelmodulernamesrGr>rrRs r7visit_ImportFromz SourceGenerator.visit_ImportFrom&s`  # *:DKKHI"4::. IC 4 JJt  r9c|j|jD]$}|jd|j|&y)Nzimport )rqrrmrM)rGr>rRs r7 visit_ImportzSourceGenerator.visit_Import.s6 JJ D JJy ! JJt  r9cF|j|j|yrZ)rqrKr{s r7 visit_ExprzSourceGenerator.visit_Expr4s  4 r9c4|jd|j||j|jd|jz|j |j |jd|j |j y)Nrpzdef %s():)rqrrmnamerrrwr{s r7visit_FunctionDefz!SourceGenerator.visit_FunctionDef8sf q    9tyy() tyy! 4 $))r9c.gfd}jdj|jjd|jz|jD]}|j |t |dr|jD]B}|j|jdzj |jDt|ddr3|jdj |jt|d dr3|jd j |jjxrd xsd j|jy) Ncrrjdyjdjdy)NrT(r) have_argsrGsr7paren_or_commaz6SourceGenerator.visit_ClassDef..paren_or_commaDs+ 4   & 3r9rzclass %skeywordsrstarargsr&kwargsrr:)rqrrmrbasesrMhasattrrrrQr<rrrw)rGr>rbasekeywordrs` @r7visit_ClassDefzSourceGenerator.visit_ClassDefAs9   q    : )*JJ D   JJt   4 $== *  7;;,- 7==) *tZ.  3 4==)tXt,  4  4;;' 9%,- $))r9cr|j|jd|j|j|jd|j |j |j }t |dk(rt|dtrn|d}|j|jd|j|j|jd|j |jn3|j|jd|j |y)Nzif rrsrzelif ry) rqrmrMtestrwrzrrOr)rGr>else_s r7visit_IfzSourceGenerator.visit_Ifds  5 499 3 $))KKE5zQ:eAh#;Qx  7# 499% 3 $))$  7# % r9c|j|jd|j|j|jd|j|j|jd|j |y)Nzfor  in r)rqrmrMriterr|r{s r7 visit_ForzSourceGenerator.visit_Forys\  6 4;; 6 499 3 $r9c|j|jd|j|j|jd|j |y)Nzwhile r)rqrmrMrr|r{s r7 visit_WhilezSourceGenerator.visit_Whiles@  8 499 3 $r9cD|j|jd|j|j|j,|jd|j|j|jd|j |j y)Nzwith  as r)rqrmrM context_expr optional_varsrwr{s r7 visit_WithzSourceGenerator.visit_Withsn  7 4$$%    ) JJv  JJt)) * 3 $))r9cF|j|jdy)Npassrqrmr{s r7 visit_PasszSourceGenerator.visit_Passs  6r9ch|j|jdd}|j.|jd|j|jd}|jD](}|r|jd|j|d}*|j s|jdyy)Nzprint Fz >> Tr,)rqrmdestrMvaluesnl)rGr>rrQs r7 visit_PrintzSourceGenerator.visit_Prints  8 99 JJv  JJtyy !J[[ E 4 JJu J   ww JJsOr9c|j|jdt|D])\}}|r|jd|j|+y)Nzdel r)rqrmrrMrs r7 visit_DeletezSourceGenerator.visit_DeletesI  6$T? KC 4 JJv  r9c|j|jd|j|j|jD]}|j |y)Ntry:)rqrmrwhandlersrM)rGr>handlers r7visit_TryExceptzSourceGenerator.visit_TryExceptsF  6 $))}} G JJw  r9c|j|jd|j|j|j|jd|j|jy)Nrzfinally:)rqrmrw finalbodyr{s r7visit_TryFinallyz SourceGenerator.visit_TryFinallysL  6 $))  : $..!r9c~|j|jddj|jzy)Nzglobal rrqrmjoinrr{s r7 visit_GlobalzSourceGenerator.visit_Globals)  9tyy445r9c~|j|jddj|jzy)Nz nonlocal rrr{s r7visit_NonlocalzSourceGenerator.visit_Nonlocals)  ;4::!667r9c||j|jd|j|jy)Nzreturn )rqrmrMrQr{s r7 visit_ReturnzSourceGenerator.visit_Returns'  9 4::r9cF|j|jdy)Nbreakrr{s r7 visit_BreakzSourceGenerator.visit_Breaks  7r9cF|j|jdy)Ncontinuerr{s r7visit_ContinuezSourceGenerator.visit_Continues  :r9c|j|jdt|drr|jf|jd|j |j|j -|jd|j |j yyt|dr|j |j |j |j,|jd|j |j|j-|jd|j |jyyyy)Nraiseexc z from rr) rqrmrrrMcauserinsttbackr{s r7 visit_RaisezSourceGenerator.visit_Raises  7 4 DHH$8 JJsO JJtxx zz% 8$ 4::&&T6 "tyy'< JJtyy !yy$ 4  499%zz% 4  4::&& (= "r9cv|j|j|jd|jzy)Nr)rMrQrmattrr{s r7visit_AttributezSourceGenerator.visit_Attributes& 4:: 3?#r9cgfd}j|jjd|jD]}|j||jD]B}|j|j dzj|j Dt|ddr3|jdj|jt|ddr3|jdj|jjdy) NcPrjdyjdyrrrsr7rz/SourceGenerator.visit_Call..write_commarr9rrrr&rr)) rMfuncrmrrrrQr<rr)rGr>rrrrs` @r7 visit_CallzSourceGenerator.visit_Calls  ( 499 399 C M JJsO }} &G M JJw{{S( ) JJw}} % & 4T * M JJsO JJt}} % 44 ( M JJt  JJt{{ # 3r9c:|j|jyrZ)rmidr{s r7 visit_NamezSourceGenerator.visit_Name s 477r9cL|jt|jyrZ)rmstrrQr{s r7visit_NameConstantz"SourceGenerator.visit_NameConstant s 3tzz?#r9c:|j|jyrZ)rmrr{s r7 visit_argzSourceGenerator.visit_args 488r9cL|jt|jyrZrmreprsr{s r7 visit_StrzSourceGenerator.visit_Str 4< r9cL|jt|jyrZr r{s r7 visit_ByteszSourceGenerator.visit_Bytesrr9cL|jt|jyrZ)rmrrpr{s r7 visit_NumzSourceGenerator.visit_Numrr9cL|jt|jyrZ)rmrrQr{s r7visit_ConstantzSourceGenerator.visit_Constants 4 #$r9c|jdd}t|jD])\}}|r|jd|j|+|j|xrdxsdy)Nrrrz,)rmreltsrMrs r7 visit_TuplezSourceGenerator.visit_Tuples` 3"499- IC 4 JJt   3;3&$'r9cfd}|S)Nc|jt|jD])\}}|r|jd|j|+|jyNrr)rGr>rrRleftrights r7rMz-SourceGenerator.sequence_visit..visit)sT JJt &tyy1 ! TJJt$ 4  ! JJu r9rVr r!rMs`` r7sequence_visitzSourceGenerator.sequence_visit(s  r9[]{}c<|jdtt|j|jD]N\}\}}|r|jd|j ||jd|j |P|jdy)Nr&r: r')rmrrkeysrrM)rGr>rkeyrQs r7 visit_DictzSourceGenerator.visit_Dict7sx 3!*3tyy$+++F!G  C#u 4 JJsO JJt  JJu    3r9c|jd|j|j|jdtt |j z|j|j |jdyNrz %s r)rmrMr rrrr!r{s r7 visit_BinOpzSourceGenerator.visit_BinOpAsV 3 499 6M$tww-889 4:: 3r9c|jdt|jD]F\}}|r.|jdtt |j z|j |H|jdyr.)rmrrBOOLOP_SYMBOLSrrrM)rGr>rrQs r7 visit_BoolOpzSourceGenerator.visit_BoolOpHsc 3#DKK0 JC 6N4=$AAB JJu   3r9c8|jd|j|jt|j|j D]:\}}|jdt t|z|j|<|jdyr.)rmrMr rops comparators CMPOP_SYMBOLSr)rGr>rr!s r7 visit_ComparezSourceGenerator.visit_ComparePst 3 499TXXt'7'78 IB JJv d2h 77 8 JJu   3r9c|jdtt|j}|j||dk(r|jd|j |j |jdy)Nrr1rr)rmUNARYOP_SYMBOLSrrrMoperand)rGr>rs r7 visit_UnaryOpzSourceGenerator.visit_UnaryOpXsW 3 T$''] + 2 ; JJsO 4<<  3r9c|j|j|jd|j|j|jdy)Nr$r%)rMrQrmslicer{s r7visit_SubscriptzSourceGenerator.visit_Subscriptas8 4:: 3 4:: 3r9c|j|j|j|jd|j|j|j|ja|jdt |jt r|jjdk(s|j|jyyy)NrNone)lowerrMrmuppersteprOrrr{s r7 visit_SlicezSourceGenerator.visit_Slicegs :: ! JJtzz " 3 :: ! JJtzz " 99 JJsOtyy$/DIILLF4J 499%5K !r9ct|jD])\}}|r|jd|j|+yr)dimsrmrMrs r7visit_ExtSlicezSourceGenerator.visit_ExtSlicers4 IC 4 JJt  r9c\|jd|j|jy)Nzyield rmrMrQr{s r7 visit_YieldzSourceGenerator.visit_Yieldxs 8 4::r9c|jd|j|j|jd|j|jy)Nzlambda r))rmrrrMrwr{s r7 visit_LambdazSourceGenerator.visit_Lambda|s: 9 tyy! 4 499r9c&|jdy)NEllipsis)rmr{s r7visit_EllipsiszSourceGenerator.visit_Ellipsiss :r9cfd}|S)Nc|j|j|j|jD]}|j||jyrZ)rmrMelt generators)rGr> comprehensionr r!s r7rMz.SourceGenerator.generator_visit..visitsJ JJt  JJtxx !% *  =) * JJu r9rVr"s`` r7generator_visitzSourceGenerator.generator_visits  r9rrc|jd|j|j|jd|j|j|jD]}|j||jdy)Nr&r)r')rmrMr+rQrS)rGr>rTs r7visit_DictCompzSourceGenerator.visit_DictCompsc 3 488 4 4::!__ &M JJ} % & 3r9c|j|j|jd|j|j|jd|j|jy)N if z else )rMrwrmrrzr{s r7 visit_IfExpzSourceGenerator.visit_IfExpsJ 499 6 499 8 4;;r9c\|jd|j|jy)Nr&rIr{s r7 visit_StarredzSourceGenerator.visit_Starreds 3 4::r9c~|jd|j|j|jdy)N`rIr{s r7 visit_ReprzSourceGenerator.visit_Reprs( 3 4:: 3r9c|j|j|j|jd|jzyy)Nr)rmrasnamer{s r7 visit_aliaszSourceGenerator.visit_aliass6 499 ;; " JJv + , #r9c4|jd|j|j|jd|j|j|jr4|jD]$}|jd|j|&yy)Nz for rrY)rmrMrrifs)rGr>if_s r7visit_comprehensionz#SourceGenerator.visit_comprehensionsp 7 4;; 6 499 88xx  6" 3  r9c~|j|jd|jd|jd|j|j|j,|jd|j|j|jd|j |j y)Nexceptrrr)rqrmrrMrrwr{s r7visit_excepthandlerz#SourceGenerator.visit_excepthandlers}  8 99 JJsO JJtyy !yy$ 6" 499% 3 $))r9N)rs)DrFrSrTrUrirmrqrwr|rrrrrrrrrrrrrrrrrrrrrrrrrrrr r rrrrrr# visit_List visit_Setr,r/r2r7r;r>rDrGrJrLrOrUvisit_ListCompvisit_GeneratorExp visit_SetComprWrZr\r_rbrfrirVr9r7rcrcsv  0#.."  !!F*  " "68 '*$8$!!!%(  S)JsC(I &  %S#.N(c2#C-M -   r9rcN)z exec),rU_astrrrrrrr r r r r rrrrrrrrrrrrrrrrrrr r!r1rr6r9 ALL_SYMBOLSupdater8r@rBrXrcrVr9r7rssyub$'# d D D 3 C C   8 4 8  3UD#tSA >" =! =! ?#8 *"*"Z9k9xxkxr9