\df;dZddlmZddlmZmZddlmZddl m Z dZ dZ dZ d Zd-d Zd Zd ZdZe e fdZd.dZdZdZd-dZdZd-dZd-dZdZdZdZdZdZhdZ dZ!da"da#d a$d!a%d"Z&d#Z'd$Z(d%Z)d&Z*d'Z+d(Z,d)Z-ej.ej/hZ0d-d*Z1ej/ej.ej2hZ3d+Z4d-d,Z5d S)/z1Utility functions, node construction macros, etc.)token)LeafNode)python_symbols)patcompclttj|ttjd|gS)N=)rsymsargumentrrEQUAL)keywordvalues #..\python\lib\lib2to3\fixer_util.py KeywordArgrs.  $u{C00%8 : ::c6ttjdS)N()rrLPARrrLParenr  C  rc6ttjdS)N))rrRPARrrrRParenrrrc t|ts|g}t|ts d|_|g}ttj|t tjddgz|zS)zBuild an assignment statement r prefix) isinstancelistrrr atomrrr )targetsources rAssignr%su fd # # fd # #   $u{C<<<==F H HHrNc:ttj||S)zReturn a NAME leafr)rrNAME)namers rNamer)$s  D 0 0 00rcV|ttjt|ggS)zA node tuple for obj.attr)rr trailerDot)objattrs rAttrr/(s! dlSUUDM22 33rc6ttjdS)z A comma leaf,)rrCOMMArrrCommar3,s  S ! !!rc6ttjdS)zA period (.) leaf.)rrDOTrrrr,r,0s  3  rcttj||g}|r.|dttj||S)z-A parenthesised argument list, used by Call()r)rr r+clone insert_childarglist)argslparenrparennodes rArgListr?4sW  v||~~v||~~> ? ?D 7 !T$,55666 Krcjttj|t|g}|||_|S)zA function call)rr powerr?r) func_namer;rr>s rCallrC;s0  Y 6 7 7D  Krc6ttjdS)zA newline literal rrNEWLINErrrNewlinerHBs  t $ $$rc6ttjdS)z A blank linerFrrr BlankLinerKFs  r " ""rc:ttj||S)Nr)rrNUMBER)nrs rNumberrOJs  a / / //rc ttjttjd|ttjdgS)zA numeric or string subscript[])rr r+rrLBRACERBRACE) index_nodes r SubscriptrVMs=  tEL#66)#EL#668 9 99rc:ttj||S)z A string leafr)rrSTRING)stringrs rStringrZSs  fV 4 4 44rc pd|_d|_d|_ttjd}d|_ttjd}d|_||||g}|rWd|_ttjd}d|_|t t j||gt t j|t t j |g}t t j ttj d|ttj dgS)zuA list comprehension of the form [xp for fp in it if test]. If test is None, the "if test" part is omitted. rJrforinifrQrR) rrrr'appendrr comp_if listmakercomp_forr"rSrT) xpfpittestfor_leafin_leaf inner_argsif_leafinners rListComprlWs BIBIBIEJ&&HHO5:t$$GGNB,J ? uz4(($t|gt_==>>> "d4=*&E&E!F G GE  U\3//U\3//1 2 22rc@|D]}|ttjdttj|dttjddt t j|g}t t j|}|S)zO Return an import statement in the form: from package import name_leafsfromrrimport)removerrr'rr import_as_names import_from) package_name name_leafsleafchildrenimps r FromImportrxos UZ((UZc:::UZ#666T):668H t * *C Jrc l|d}|jtjkr|}n-t tj|g}|d}|r d|D}t tjt t|dt|dt tj|d||dggz|z}|j |_ |S)zfReturns an import statement and calls a method of the module: import module module.name()r-afterc6g|]}|Sr)r8).0rNs r z!ImportAndCall..s ***q***rrlparrpar) r8typer r:rrAr/r)r+r)r>resultsnamesr- newarglistrznews r ImportAndCallrs %.   C x4<YY[[ $, 66 G E +**E*** tzDqNNDqNN33T\fo++-- fo++--/001149 9 : :C CJ Jrct|tr'|jtt gkrdSt|tot |jdkot|jdt okt|jdtoKt|jdt o+|jdjdko|jdjdkS)z(Does the node represent a tuple literal?Tr~rrr)r rrvrrlenrrr>s ris_tuplers$$-FHHfhh3G"G"Gt tT " " .DM""a' .4=+T22 .4=+T22 .4=+T22  .  a &#-  .  a &#- /rc4t|tot|jdkokt|jdtoKt|jdto+|jdjdko|jdjdkS)z'Does the node represent a list literal?rr~rQrR)r rrrvrrrs ris_listrs tT " " /DM""Q& /4=+T22 /4=,d33 / a &#-  /  b!'3. 0rclttjt|t gSN)rr r"rrrs r parenthesizers#  FHHdFHH5 6 66r> allanymaxminsetsumr!tuplesorted enumeratec#^Kt||}|r|Vt||}|dSdS)alFollow an attribute chain. If you have a chain of objects where a.foo -> b, b.foo-> c, etc, use this to iterate over all objects in the chain. Iteration is terminated by getattr(x, attr) is None. Args: obj: the starting object attr: the name of the chaining attribute Yields: Each successive object in the chain. N)getattr)r-r.nexts r attr_chainrsU 3  D # tT"" #####rzefor_stmt< 'for' any 'in' node=any ':' any* > | comp_for< 'for' any 'in' node=any any* > z power< ( 'iter' | 'list' | 'tuple' | 'sorted' | 'set' | 'sum' | 'any' | 'all' | 'enumerate' | (any* trailer< '.' 'join' >) ) trailer< '(' node=any ')' > any* > z` power< ( 'sorted' | 'enumerate' ) trailer< '(' arglist ')' > any* > FchtsMtjtatjtatjt adattt g}t |t|dD]*\}}i}|||r |d|urdS+dS)a Returns true if node is in an environment where all that is required of it is being iterable (ie, it doesn't matter if it returns a list or an iterator). See test_map_nochange in test_fixers.py for some examples and tests. Tparentr>F) pats_builtrcompile_patternp0p1p2ziprmatch)r>patternspatternrrs rin_special_contextrs   $R ( (  $R ( (  $R ( ( B|HxD()C)CDD == ) ) gfo.E.E44 5rc|j}||jtjkrdS|j}|jt jt jfvrdS|jt jkr|j d|urdS|jt j ks;|jt j kr(||jtj ks|j d|urdSdS)zG Check that something isn't an attribute or function name etc. NFr~T) prev_siblingrrr6rr funcdefclassdef expr_stmtrv parameters typedargslistr2)r>prevrs ris_probably_builtinrs  D DI22u [F {t|T]333u {dn$$);t)C)Cu {do%% [D. . .  $)u{":": OA $ & &u 4rc|_|jtjkrAt|jdkr)|jd}|jt jkr|jS|j}|_dS)zFind the indentation of *node*.NrrrJ) rr suiterrvrINDENTrr)r>indents rfind_indentationrsd   9 " "s4='9'9A'='=]1%F{el**|#{   2rc|jtjkr|S|}|jdc}|_t tj|g}||_|Sr)rr rr8rr)r>rrs r make_suitersR yDJ ::<bindings rdoes_tree_importr/s' 44'::G ==rc@|jtjtjfvS)z0Returns true if the node is an import statement.)rr import_namerrrs r is_importr7s 9)4+;< <.is_import_stmt>s4 T--,$-,$-*++ -rNr~rrorr)rrrrvrr rrrXrrrr'rxrHr9) rr(r>rroot insert_posoffsetidxnode2import_rvs r touch_importr;s--- T??Dt,,Jt}-- T~d##  &t}STT':;;  MFE!>%((  6\  Q"4=11  IC T---$--}Q$ 44 1W t' X & & T# . . .*    WtEJS'I'I'I&JKK#Hj$t'7"B"BCCCCCrc P|jD]}d}|jtjkrNt ||jdr|cSt |t |jd|}|r|}n|jtjtjfvr/t |t |jd|}|r|}nK|jtj krt |t |jd|}|r|}nt|jddD]U\}}|jtj kr;|j dkr0t |t |j|dz|}|r|}Vn|jtvr|jdj |kr|}nmt|||r|}nY|jtjkrt |||}n2|jtjkrt ||jdr|}|r|s|cSt%|r|cSdS) z Returns the node which binds variable name, otherwise None. If optional argument package is supplied, only imports will be returned. See test cases for examples.Nrrrr:r~)rvrr for_stmt_findrrif_stmt while_stmttry_stmtrrCOLONr _def_syms_is_import_bindingrrr)r(r>rchildretrNikids rrris3 "" : & &T5>!,--  T:enR.@#A#A7KKAM# ZDL$/: : :T:enR.@#A#A7KKAM# Z4= ( (T:enQ.?#@#@'JJA &'qrr(:;;&&FAsx5;..393C3C(z%.1:M/N/NPWXX Ac & Z9 $ $):)@D)H)HCC tW 5 5 CC Z4+ + +tUG44CC Z4> ) )T5>!,--     ~~  4rc|g}|rl|}|jdkr)|jtvr||jn"|jt jkr |j|kr|S|ldS)N)popr _block_symsextendrvrr'r)r(r>nodess rrrs} FE yy{{ 9s??ty ;; LL ' ' ' ' Y%* $ $t););K  4rc.|jtjkr|s|jd}|jtjkr`|jD]V}|jtjkr|jdj|kr|cS2|jtjkr|j|kr|cSWn{|jtjkr1|jd}|jtjkr |j|kr|Sn5|jtjkr |j|kr|Sn|jtj kr|r2t|jd |krdS|jd}|rtd|rdS|jtj krt||r|S|jtjkr0|jd}|jtjkr |j|kr|Sn;|jtjkr |j|kr|S|r|jtjkr|SdS)z Will return node if node will import name, or node will import * from package. None is returned otherwise. See test cases for examples. rrrNras)rr rrvdotted_as_namesdotted_as_namerrr'rrstrstriprrqimport_as_nameSTAR)r>r(rrwrlastrNs rrrs   yD$$$W$mA 8t+ + +  :!444~a(.$66# 7Z5:--%+2E2EKKK  X, , ,<#DyEJ&&4:+=+= X # # T(9(9K d& & &  s4=+,,2244??4 M!   uT1~~ 4 Vt+ + +dA +K Vt* * *JqMEzUZ''EK4,?,? Vuz ! !agooK  5:--K 4rr)NN)6__doc__pgen2rpytreerrpygramrr rJrrrrr%r)r/r3r,r?rCrHrKrOrVrZrlrxrrrrconsuming_callsrrrrrrrrrrrrrrrrrr+rrrrrrrs77******:::!!!!!! H H H1111444"""    &&((%%%###0000999 555522220&8 / / /000777...###&  &.===*D*D*DZ]DL ) ((((T|T]DL9 ''''''r