gf;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\ejdhZ3d+Z4d-d,Z5y )/z1Utility functions, node construction macros, etc.)token)LeafNode)python_symbols)patcompclttj|ttj d|gS)N=)rsymsargumentrrEQUAL)keywordvalues 9/opt/alt/python312/lib64/python3.12/lib2to3/fixer_util.py KeywordArgrs*  $u{{C0%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%s] fd # fd #   $u{{C<==F HHrNc:ttj||S)zReturn a NAME leafr)rrNAME)namers rNamer)$s  D 00rcN|ttjt|ggS)zA node tuple for obj.attr)rr trailerDot)objattrs rAttrr/(s dllSUDM2 33rc6ttjdS)z A comma leaf,)rrCOMMArrrCommar3,s  S !!rc6ttjdS)zA period (.) leaf.)rrDOTrrrr,r,0s  3 rcttj|j|jg}|r*|j dttj ||S)z-A parenthesised argument list, used by Call()r)rr r+clone insert_childarglist)argslparenrparennodes rArgListr?4sF  v||~v||~> ?D  !T$,,56 Krcbttj|t|g}|||_|S)zA function call)rr powerr?r) func_namer;rr>s rCallrC;s-  Y 6 7D  Krc6ttjdS)zA newline literal rrNEWLINErrrNewlinerHBs  t $$rc6ttjdS)z A blank linerFrrr BlankLinerKFs  r ""rc:ttj||S)Nr)rrNUMBER)nrs rNumberrOJs  a //rc ttjttj d|ttj dgS)zA numeric or string subscript[])rr r+rrLBRACERBRACE) index_nodes r SubscriptrVMs8  tELL#6)#ELL#68 99rc:ttj||S)z A string leafr)rrSTRING)stringrs rStringrZSs  fV 44rc hd|_d|_d|_ttjd}d|_ttjd}d|_||||g}|rSd|_ttjd}d|_|j t t j||gt t j|t t j|g}t t jttjd|ttjdgS)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 BIBIBIEJJ&HHO5::t$GGNB,J  uzz4($t||gt_=> "d4==*&E!F GE  U\\3/U\\3/1 22rc<|D]}|jttjdttj|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 FromImportrxosw UZZ(UZZc:UZZ#6T)):68H t *C Jrc N|dj}|jtjk(r|j}n)t tj|jg}|d}|r|Dcgc]}|j}}t tj t t|dt|dt tj|dj||djggz|z}|j|_ |Scc}w)zfReturns an import statement and calls a method of the module: import module module.name()r-afterrlparrpar) r8typer r:rrAr/r)r+r)r>resultsnamesr- newarglistrzrNnews r ImportAndCallrs %.   C xx4<<YY[ $,, 6 G E $)*EqE* tzzDqNDqN3T\\fo++- fo++-/01149 9 :C CJ J+s6D"ct|tr"|jtt gk(ryt|txrt |jdk(xrt|jdt xrxt|jdtxrYt|jdt xr:|jdjdk(xr|jdjdk(S)z(Does the node represent a tuple literal?Tr{rrr)r rrvrrlenrrr>s ris_tuplers$$--FHfh3G"G tT " .DMM"a' .4==+T2 .4==+T2 .4==+T2  .  a &&#-  .  a &&#- /rcJt|txrt|jdkDxrxt|jdtxrYt|jdtxr:|jdj dk(xr|jdj dk(S)z'Does the node represent a list literal?rr{rQrR)r rrrvrrrs ris_listrs tT " /DMM"Q& /4==+T2 /4==,d3 / a &&#-  /  b!''3. 0rc\ttjt|t gSN)rr r"rrrs r parenthesizers  FHdFH5 66r> allanymaxminsetsumr!tuplesorted enumeratec#PKt||}|r|t||}|ryyw)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_chainrs- 3 D  tT" s!&&zefor_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* > FcDtsMtjtatjtatjt adattt g}t |t|dD]#\}}i}|j||s|d|us#yy)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()CD == )gfo.EE rc|j}||jtjk(ry|j}|jt j t jfvry|jt jk(r|jd|ury|jt jk(sM|jt jk(r1||jtjk(s|jd|uryy)zG Check that something isn't an attribute or function name etc. Fr{T) prev_siblingr~rr6rr funcdefclassdef expr_stmtrv parameters typedargslistr2)r>prevrs ris_probably_builtinrs   D DII2 [[F {{t||T]]33 {{dnn$);t)C {{doo% [[D.. .  $))u{{": OOA $ & rc|||jtjk(rPt|jdkDr8|jd}|jt j k(r |jS|j}||y)zFind the indentation of *node*.rrrJ) r~r suiterrvrINDENTrr)r>indents rfind_indentationrsf   99 "s4=='9A'=]]1%F{{ell*||#{{   rc|jtjk(r|S|j}|jdc}|_t tj|g}||_|Sr)r~r rr8rr)r>rrs r make_suitersR yyDJJ ::bindings rdoes_tree_importr/s 44':G =rcZ|jtjtjfvS)z0Returns true if the node is an import statement.)r~r import_namerrrs r is_importr7s" 99))4+;+;< <\}}||st|j|dD]\}}||rn||z}n|dk(ryt|jD]a\}}|jt j k(s$|js1|jdjtjk(s\|dz}n|Ott jttjdttj|dg} n't|ttj|dg} | tg} |j|tt j | y)z\ Works like `does_tree_import` but adds an import statement if it was not imported. c|jtjk(xr&|jxrt |jdS)Nr{)r~r simple_stmtrvrrs ris_import_stmtz$touch_import..is_import_stmt>s: T---,$--,$--*+ -rNr{rrorr)rrrrvr~r rrrXrrrr'rxrHr9) rr(r>rroot insert_posoffsetidxnode2import_rvs r touch_importr;sh- T?Dt,Jt}}- Td# &t}}ST':;MFE!%(<6\  .Q"4==1IC T---$--}}Q$$ 4 1W  2 t'' X & T# .*   WtEJJS'I&JK#Hj$t'7'7"BCrc |jD]<}d}|jtjk(rGt ||jdr|cSt |t |jd|}|r|}n|jtjtjfvr*t |t |jd|}|rh|}nd|jtjk(rt |t |jd|}|r|}nt|jddD]^\}}|jtjk(s$|jdk(s4t |t |j|dz|}|s]|}`n|jtvr|jdj|k(r|}nst|||r|}nc|jtj k(rt |||}n8|jtj"k(rt ||jdr|}|s(|s|cSt%|s;|cSy) 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{)rvr~r for_stmt_findrrif_stmt while_stmttry_stmtrrCOLONr _def_syms_is_import_bindingrrr)r(r>rchildretrNikids rrris  :: &T5>>!,- T:ennR.@#A7KA# ZZDLL$//: :T:ennR.@#A7KA# ZZ4== (T:ennQ.?#@'JA'qr(:;FAsxx5;;.3993C(z%..1:M/NPWXAc < ZZ9 $):)@)@D)HC tW 5C ZZ4++ +tUG4C ZZ4>> )T5>>!,-  ~ EF rc |g}|r~|j}|jdkDr.|jtvr|j|jn.|jt j k(r|j|k(r|S|r~y)N)popr~ _block_symsextendrvrr'r)r(r>nodess rrrsg FE yy{ 99s?tyy ; LL ' YY%** $t);K  rc,|jtjk(r9|s6|jd}|jtjk(r|jD]q}|jtj k(r!|jdj |k(s=|cS|jtjk(s_|j |k(so|cSy|jtj k(r=|jd}|jtjk(r?|j |k(r0|S|jtjk(r|j |k(r|Sy|jtjk(r|r*t|jdj|k7ry|jd}|r td|ry|jtjk(rt||r|S|jtjk(r>|jd}|jtjk(r|j |k(r|Sy|jtjk(r|j |k(r|S|r|jtjk(r|Sy)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)r~r rrvdotted_as_namesdotted_as_namerrr'rrstrstriprrqimport_as_nameSTAR)r>r(rrwrlastrNs rrrs  yyD$$$WmmA 88t++ +::!4!44~~a(..$6# ZZ5::-%++2EK &> 3XX,, ,<<#DyyEJJ&4::+= XX # T(9K( ' d&& & s4==+,224? MM!  uT1~ VVt++ +dAK VVt** *JJqMEzzUZZ'EKK4,?  VVuzz !aggoK 5::-K rr)NN)6__doc__pgen2rpytreerrpygramrr rJrrrrr%r)r/r3r,r?rCrHrKrOrVrZrlrxrrrrconsuming_callsrrrrrrrrrrrrrrrrrr+rrrrrrrs7*:!! H14"  &(%#09 520&8 /07.#&  &.=*DZ]]DLL ) (T||T]]DLL9 'r