Ë \µÔ ~W)ãó¸—dZddlmZddlmZmZddlmZddl m Z d„Z d„Z d„Z d „Zd-d „Zd „Zd „Zd„Ze «e «fd„Zd.d„Zd„Zd„Zd-d„Zd„Zd-d„Zd-d„Zd„Zd„Zd„Zd„Zd„Zhd£Z d„Z!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)ÚLeafÚNode)Úpython_symbols)Úpatcompcól—ttj|ttj d«|g«S)NÚ=)rÚsymsÚargumentrrÚEQUAL)ÚkeywordÚvalues ú)/usr/lib/python3.12/lib2to3/fixer_util.pyÚ KeywordArgrs*€Ü ”— ‘ Øœ$œuŸ{™{¨CÓ0°%Ð8ó :ð:ócó6—ttjd«S)NÚ()rrÚLPAR©rrÚLParenró€Ü ”— ‘ ˜CÓ Ð rcó6—ttjd«S)NÚ))rrÚRPARrrrÚRParenrrrc óÒ—t|t«s|g}t|t«s d|_|g}ttj |t tjdd¬«gz|z«S)zBuild an assignment statementÚ r ©Úprefix) Ú isinstanceÚlistrrr Úatomrrr )ÚtargetÚsources rÚAssignr%s]€ä �fœdÔ #Ø�ˆÜ �fœdÔ #؈Œ Ø�ˆä ”— ‘ Øœ$œuŸ{™{¨C¸Ô<Ð=Ñ=ÀÑFó HðHrNcó:—ttj||¬«S)zReturn a NAME leafr)rrÚNAME)Únamers rÚNamer)$s€ä ”— ‘ ˜D¨Ô 0Ð0rcóN—|ttjt«|g«gS)zA node tuple for obj.attr)rr ÚtrailerÚDot)ÚobjÚattrs rÚAttrr/(s€à ””d—l‘l¤S£U¨D MÓ2Ð 3Ð3rcó6—ttjd«S)z A comma leafÚ,)rrÚCOMMArrrÚCommar3,s€ä ”— ‘ ˜SÓ !Ð!rcó6—ttjd«S)zA period (.) leafÚ.)rrÚDOTrrrr,r,0s€ä ”— ‘ ˜3Ó ÐrcóΗttj|j«|j«g«}|r*|j dttj |««|S)z-A parenthesised argument list, used by Call()r)rr r+ÚcloneÚ insert_childÚarglist)ÚargsÚlparenÚrparenÚnodes rÚArgListr?4sF€ä ”— ‘ ˜vŸ|™|›~¨v¯|©|«~Ð>Ó ?€DÙ Ø ×ј!œT¤$§,¡,°Ó5Ô6Ø €Krcób—ttj|t|«g«}|�||_|S)zA function call)rr Úpowerr?r)Ú func_namer;rr>s rÚCallrC;s-€ä ”— ‘ ˜Y¬°« Ð6Ó 7€DØ ÐØˆŒ Ø €Krcó6—ttjd«S)zA newline literalÚ ©rrÚNEWLINErrrÚNewlinerHBs€ä ”— ‘ ˜tÓ $Ð$rcó6—ttjd«S)z A blank lineÚrFrrrÚ BlankLinerKFs€ä ”— ‘ ˜rÓ "Ð"rcó:—ttj||¬«S)Nr)rrÚNUMBER)Únrs rÚNumberrOJs€Ü ”— ‘ ˜a¨Ô /Ð/rc óœ—ttjttj d«|ttj d«g«S)zA numeric or string subscriptÚ[Ú])rr r+rrÚLBRACEÚRBRACE)Ú index_nodes rÚ SubscriptrVMs8€ä ”— ‘ œt¤E§L¡L°#Ó6Ø)Ü#¤E§L¡L°#Ó6ð8ó 9ð9rcó:—ttj||¬«S)z A string leafr)rrÚSTRING)Ústringrs rÚStringrZSs€ä ”— ‘ ˜f¨VÔ 4Ð4rc óh—d|_d|_d|_ttjd«}d|_ttjd«}d|_||||g}|rSd|_ttjd«}d|_|j t t j||g««t t j|t t j|«g«}t t jttjd«|ttjd«g«S)zuA list comprehension of the form [xp for fp in it if test]. If test is None, the "if test" part is omitted. rJrÚforÚinÚifrQrR) rrrr'Úappendrr Úcomp_ifÚ listmakerÚcomp_forr"rSrT) ÚxpÚfpÚitÚtestÚfor_leafÚin_leafÚ inner_argsÚif_leafÚinners rÚListComprlWsê€ð €B„IØ€B„IØ€B„IÜ”E—J‘J Ó&€HØ€H„OÜ”5—:‘:˜tÓ$€GØ€G„NؘB ¨Ð,€J٠؈Œ Ü”u—z‘z 4Ó(ˆØˆŒØ×Ñœ$œtŸ|™|¨g°t¨_Ó=Ô>Ü ”—‘ "¤d¬4¯=©=¸*Ó&EÐ!FÓ G€EÜ ”— ‘ ÜœUŸ\™\¨3Ó/ØÜœUŸ\™\¨3Ó/ð1ó 2ð2rcó<—|D]}|j«Œttjd«ttj|d¬«ttjdd¬«t t j |«g}t t j|«}|S)zO Return an import statement in the form: from package import name_leafsÚfromrrÚimport)Úremoverrr'rr Úimport_as_namesÚ import_from)Ú package_nameÚ name_leafsÚleafÚchildrenÚimps rÚ FromImportrxosw€óˆà � ‰ � ðô”U—Z‘Z Ó(Ü”U—Z‘Z °cÔ:Ü”U—Z‘Z °#Ô6Ü”T×)Ñ)¨:Ó6ð8€Hô Œt×Ñ Ó *€CØ €Jrc óN—|dj«}|jtjk(r|j«}n)t tj|j«g«}|d}|r|D�cgc]}|j«‘Œ}}t tj t t|d«t|d««t tj|dj«||dj«g«gz|z«}|j|_ |Scc}w)zfReturns an import statement and calls a method of the module: import module module.name()r-ÚafterérÚlparÚrpar) r8Útyper r:rrAr/r)r+r)r>ÚresultsÚnamesr-Ú newarglistrzrNÚnews rÚ ImportAndCallrƒ‚sû€ð �%‰.× Ñ Ó €CØ ‡x�x”4—<‘<ÒØ—Y‘Y“[‰ äœ$Ÿ,™,¨¯©«¨ Ó6ˆ Ø �GÑ €EÙ Ù$)Ó*¡E˜q�—‘• EˆÐ*Ü Œt�z‰zÜ”D˜˜q™“N¤D¨¨q©£NÓ3Ü”T—\‘\ؘf‘o×+Ñ+Ó-Ø Ø˜f‘o×+Ñ+Ó-ð/ó0ð1ñ1ð49ñ 9ó :€Cð —‘€C„JØ €Jùò+sÁ6D"cóì—t|t«r"|jt«t «gk(ryt|t«xr±t |j«dk(xr—t|jdt «xrxt|jdt«xrYt|jdt «xr:|jdjdk(xr|jdjdk(S)z(Does the node represent a tuple literal?Tér{rérr)r rrvrrÚlenrr©r>s rÚis_tupler‰žsЀä�$œÔ $§-¡-´F³H¼f»hÐ3GÒ"GØÜ �tœTÓ "ò .Ü�D—M‘MÓ" aÑ'ò .ä˜4Ÿ=™=¨Ñ+¬TÓ2ò .ô˜4Ÿ=™=¨Ñ+¬TÓ2ò .ô˜4Ÿ=™=¨Ñ+¬TÓ2ò  .ð — ‘ ˜aÑ ×&Ñ&¨#Ñ-ò  .ð — ‘ ˜aÑ ×&Ñ&¨#Ñ-ð /rcóJ—t|t«xr’t|j«dkDxrxt|jdt«xrYt|jdt«xr:|jdj dk(xr|jdj dk(S)z'Does the node represent a list literal?rr{éÿÿÿÿrQrR)r rr‡rvrrrˆs rÚis_listrŒªs•€ä �tœTÓ "ò /Ü�D—M‘MÓ" QÑ&ò /ä˜4Ÿ=™=¨Ñ+¬TÓ2ò /ô˜4Ÿ=™=¨Ñ,¬dÓ3ò /ð— ‘ ˜aÑ ×&Ñ&¨#Ñ-ò  /ð — ‘ ˜bÑ!×'Ñ'¨3Ñ.ð 0rcó\—ttjt«|t «g«S©N)rr r"rrrˆs rÚ parenthesizer�¸s€Ü ”— ‘ œF›H d¬F«HÐ5Ó 6Ð6r> ÚallÚanyÚmaxÚminÚsetÚsumr!ÚtupleÚsortedÚ enumeratec#óPK—t||«}|r|–—t||«}|rŒyy­w)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_chainrœ¿s-èø€ô �3˜Ó €DÙ ØŠ Ü�t˜TÓ"ˆô ù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* > FcóD—tsMtjt«atjt«atjt «adattt g}t |t|d««D]#\}}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. TÚparentr>F) Ú pats_builtrÚcompile_patternÚp0Úp1Úp2ÚziprœÚmatch)r>ÚpatternsÚpatternržrs rÚin_special_contextr¨åsŠ€õ Ü × $Ñ $¤RÓ (ˆÜ × $Ñ $¤RÓ (ˆÜ × $Ñ $¤RÓ (ˆØˆ Ü”Bœˆ|€Hܘx¬°D¸(Ó)CÖD‰ˆ�ØˆØ �=‰=˜ Õ )¨g°f©oÀÒ.EÙðEð 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~rr6ržr ÚfuncdefÚclassdefÚ expr_stmtrvÚ parametersÚ typedargslistr2)r>Úprevržs rÚis_probably_builtinr±øs¿€ð × Ñ €DØ Ð˜DŸI™I¬¯©Ò2àØ �[‰[€FØ ‡{�{”t—|‘|¤T§]¡]Ð3Ñ3ØØ ‡{�{”d—n‘nÒ$¨¯©¸Ñ);¸tÑ)CàØ ‡{�{”d—o‘oÒ%Ø �[‰[œD×.Ñ.Ò .Ø Ð  $§)¡)¬u¯{©{Ò":Ø �O‰O˜AÑ  $Ñ &ðØ rcó—|�||jtjk(rPt|j«dkDr8|jd}|jt j k(r |jS|j}|�Œ|y)zFind the indentation of *node*.r†rrJ) r~r Úsuiter‡rvrÚINDENTrrž)r>Úindents rÚfind_indentationr¶sf€à Ð Ø �9‰9œŸ ™ Ò "¤s¨4¯=©=Ó'9¸AÒ'=Ø—]‘] 1Ñ%ˆFØ�{‰{œeŸl™lÒ*Ø—|‘|Ð#Ø�{‰{ˆð Ñ ð rcóЗ|jtjk(r|S|j«}|jdc}|_t tj|g«}||_|SrŽ)r~r r³r8ržr)r>ržr³s rÚ make_suiter¸sR€Ø ‡y�y”D—J‘JÒØˆ Ø �:‰:‹<€DØŸ+™+ tЀFˆDŒKÜ ”—‘˜d˜VÓ $€EØ€E„LØ €Lrcó®—|jtjk7r7|j}|s t d«‚|jtjk7rŒ7|S)zFind the top level namespace.z,root found before file_input node was found.)r~r Ú file_inputržÚ ValueErrorrˆs rÚ find_rootr¼&sE€ð �)‰)”t—‘Ò &Ø�{‰{ˆÙÜÐKÓLÐ Lð �)‰)”t—‘Ó &ð €KrcóD—t|t|«|«}t|«S)zÞ Returns true if name is imported from package at the top level of the tree which node belongs to. To cover the case of an import like 'import foo', use None for the package and 'foo' for the name. )Ú find_bindingr¼Úbool)Úpackager(r>Úbindings rÚdoes_tree_importrÂ/s €ô ˜4¤¨4£°'Ó:€GÜ �‹=ÐrcóZ—|jtjtjfvS)z0Returns true if the node is an import statement.)r~r Ú import_namerrrˆs rÚ is_importrÅ7s"€à �9‰9œ×)Ñ)¬4×+;Ñ+;Ð<Ð <Ð\}}||«sŒt|j|d«D]\}}||«rŒn||z}n|dk(ryt|j«D]a\}}|jt j k(sŒ$|jsŒ1|jdjtjk(sŒ\|dz}n|€Ott jttjd«ttj|d¬«g«} n't|ttj|d¬«g«} | t«g} |j|tt j | ««y)z\ Works like `does_tree_import` but adds an import statement if it was not imported. cóŒ—|jtjk(xr&|jxrt |jd«S)Nr{)r~r Ú simple_stmtrvrÅrˆs rÚis_import_stmtz$touch_import..is_import_stmt>s:€Ø— ‘ œT×-Ñ-Ñ-ò,°$·-±-ò,ܘ$Ÿ-™-¨Ñ*Ó+ð -rNr{rrorr)r¼rÂr˜rvr~r rÈrrXrrÄrr'rxrHr9) rÀr(r>rÉÚrootÚ insert_posÚoffsetÚidxÚnode2Úimport_rvs rÚ touch_importrÐ;sh€ò-ô �T‹?€D䘠 tÔ,ØðЀJ�ܘtŸ}™}Ö-‰ ˆˆTÙ˜dÔ#Ø Ü& t§}¡}°S°TÐ':Ö;‰MˆF�EÙ! %Õ(Ùð<ð˜6‘\ˆ Ù ð.ð�Q‚Ü" 4§=¡=Ö1‰IˆC�Ø— ‘ œT×-Ñ-Ó-°$·-³-Ø�}‰}˜QÑ×$Ñ$¬¯ © Ó4Ø  1™W� Ùð 2ð €Ü”t×'Ñ'Ü ”—‘˜XÓ &Ü ”—‘˜T¨#Ô .ð* ó ‰ô ˜W¤t¬E¯J©J¸ÀSÔ'IÐ&JÓKˆàœ›Ð#€HØ×Ñ�j¤$¤t×'7Ñ'7¸Ó"BÕCrc óœ—|jD�]<}d}|jtjk(rGt ||jd«r|cSt |t |jd«|«}|�r¾|}�nº|jtjtjfvr*t |t |jd«|«}|�rh|}�nd|jtjk(r£t |t |jd«|«}|r|}�nt|jdd«D]^\}}|jtjk(sŒ$|jdk(sŒ4t |t |j|dz«|«}|sŒ]|}Œ`n¤|jtvr|jdj|k(r|}nst|||«r|}nc|jtj k(rt |||«}n8|jtj"k(rt ||jd«r|}|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.Nrr‹r†r…Ú:ér{)rvr~r Úfor_stmtÚ_findr¾r¸Úif_stmtÚ while_stmtÚtry_stmtr˜rÚCOLONrÚ _def_symsÚ_is_import_bindingrÈr­rÅ)r(r>rÀÚchildÚretrNÚiÚkids rr¾r¾isӀ𠗕ˆØˆØ �:‰:œŸ™Ò &Ü�T˜5Ÿ>™>¨!Ñ,Ô-Ø’ ܘT¤:¨e¯n©n¸RÑ.@Ó#AÀ7ÓKˆAÚ˜’#Ø �Z‰ZœDŸL™L¬$¯/©/Ð:Ñ :ܘT¤:¨e¯n©n¸RÑ.@Ó#AÀ7ÓKˆAÚ˜’#Ø �Z‰Zœ4Ÿ=™=Ò (ܘT¤:¨e¯n©n¸QÑ.?Ó#@À'ÓJˆAÙØ’ä'¨¯©°q°rÐ(:Ö;‘F�A�sØ—x‘x¤5§;¡;Ó.°3·9±9ÀÓ3Cä(¨¬z¸%¿.¹.ÈÈ1ÉÑ:MÓ/NÐPWÓX˜Ú A™cñ <ð �Z‰Zœ9Ñ $¨¯©¸Ñ):×)@Ñ)@ÀDÒ)H؉CÜ   t¨WÔ 5؉CØ �Z‰Zœ4×+Ñ+Ò +ܘt U¨GÓ4‰CØ �Z‰Zœ4Ÿ>™>Ò )Ü�T˜5Ÿ>™>¨!Ñ,Ô-Ø�ã ÙØ’ ܘŽ~Ø’ ðEðF rcó —|g}|r~|j«}|jdkDr.|jtvr|j|j«n.|jt j k(r|j|k(r|S|rŒ~y)Né)Úpopr~Ú _block_symsÚextendrvrr'r)r(r>Únodess rrÕrÕ”sg€Ø ˆF€EÙ Ø�y‰y‹{ˆØ �9‰9�sŠ?˜tŸy™y´ Ñ;Ø �L‰L˜Ÿ™Õ 'Ø �Y‰Yœ%Ÿ*™*Ò $¨¯©°tÒ);؈Kò ð rcó,—|jtjk(�r9|�s6|jd}|jtjk(r�|jD]q}|jtj k(r!|jdj |k(sŒ=|cS|jtjk(sŒ_|j |k(sŒo|cSy|jtj k(r=|jd}|jtjk(r?|j |k(r0|S|jtjk(r|j |k(r|Sy|jtjk(�r|r*t|jd«j«|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. rr†r‹Nr…Úas)r~r rÄrvÚdotted_as_namesÚdotted_as_namerrr'rrÚstrÚstriprÕrqÚimport_as_nameÚSTAR)r>r(rÀrwrÜÚlastrNs rrÛrÛžsô€ð  ‡y�y”D×$Ñ$Ó$ªWØ�m‰m˜AÑˆØ �8‰8”t×+Ñ+Ò +ØŸœ�Ø—:‘:¤×!4Ñ!4Ò4Ø—~‘~ aÑ(×.Ñ.°$Ó6Ø#š Ø—Z‘Z¤5§:¡:Ó-°%·+±+ÀÓ2EØ’Kð &ð> ð3�X‰Xœ×,Ñ,Ò ,Ø—<‘< Ñ#ˆDØ�y‰yœEŸJ™JÒ&¨4¯:©:¸Ò+=Ø� Ø �X‰XœŸ™Ò #¨¯ © °TÒ(9؈Kð( ð' �‰”d×&Ñ&Ó &ñ ”s˜4Ÿ=™=¨Ñ+Ó,×2Ñ2Ó4¸Ò?ØØ �M‰M˜!Ñ ˆÙ ”u˜T 1”~àØ �V‰V”t×+Ñ+Ò +´°d¸A´ØˆKØ �V‰V”t×*Ñ*Ò *Ø—J‘J˜q‘MˆEØ�z‰zœUŸZ™ZÒ'¨E¯K©K¸4Ò,?Ø� ð ð �V‰V”u—z‘zÒ ! a§g¡g°¢o؈KÙ ˜Ÿ™¤5§:¡:Ò-؈KØ rrŽ)NN)6Ú__doc__Úpgen2rÚpytreerrÚpygramrr rJrrrrr%r)r/r3r,r?rCrHrKrOrVrZrlrxrƒr‰rŒr�Úconsuming_callsrœr¡r¢r£rŸr¨r±r¶r¸r¼rÂrÅrÐr¬r«rÚr¾r+rãrÕrÛrrrÚrôsðÙ7õßÝ*Ýò:ò!ò!ò Hó1ò4ò"ò ñ ›©&«(óóò%ò#ó0ò9ó 5ó2ò0ò&ò8 /ò0ò7ò.€ò#ð& €ð€ð€ð€ òò&ò.òòòò=ò*DðZ�]‰]˜DŸL™LÐ )€ ó(ðT�|‰|˜TŸ]™]¨D¯L©LÐ9€ òô'r