B ;Ôð‰'B¢Sã@s dZddlZddlZddlZddlZddlZddlZddlZddlm Z ddl m Z m Z m Z ddlmZddlmZmZddlmZd d d „ZGd d „d eƒZdd„Zdd„Zdd„Zdd„Zdd„ZGdd„deƒZGdd„deƒZGdd„deƒZ Gdd„deƒZ!dS)!z#Guido van Rossum éN)Úchainé)ÚdriverÚtokenizeÚtoken)Ú find_root)ÚpytreeÚpygram)Ú btm_matcherTcCsXt|ggdgƒ}g}x>t |j¡D].\}}}| d¡r"|rF|dd…}| |¡q"W|S)NÚ*Úfix_é)Ú __import__ÚpkgutilZ iter_modulesÚ__path__Ú startswithÚappend)Z fixer_pkgZ remove_prefixZpkgZ fix_namesÚfinderÚnameZispkg©rú3/opt/alt/python37/lib/python3.7/lib2to3/refactor.pyÚget_all_fix_namess  rc@s eZdZdS)Ú _EveryNodeN)Ú__name__Ú __module__Ú __qualname__rrrrr+srcCsšt|tjtjfƒr(|jdkr t‚|jhSt|tjƒrH|jrDt|jƒSt‚t|tj ƒrŠt ƒ}x*|jD] }x|D]}|  t|ƒ¡qlWqbW|St d|ƒ‚dS)Nz$Oh no! I don't understand pattern %s) Ú isinstancerZ NodePatternZ LeafPatternÚtyperZNegatedPatternZcontentÚ_get_head_typesZWildcardPatternÚsetÚupdateÚ Exception)ZpatÚrÚpÚxrrrr/s      rc CsÊt t¡}g}x„|D]|}|jrjyt|jƒ}Wntk rJ| |¡YqXxB|D]}|| |¡qRWq|jdk r†||j |¡q| |¡qWx,tt j j   ¡t j j ƒD]}|| |¡q¬Wt|ƒS)N)Ú collectionsÚ defaultdictÚlistÚpatternrrrZ _accept_typerr Úpython_grammarZ symbol2numberÚvaluesÚtokensÚextendÚdict)Z fixer_listZ head_nodesZeveryÚfixerZheadsZ node_typerrrÚ_get_headnode_dictKs"    r/cs‡fdd„tˆdƒDƒS)Ncsg|]}ˆd|‘qS)Ú.r)Ú.0Úfix_name)Úpkg_namerrú hsz+get_fixers_from_package..F)r)r3r)r3rÚget_fixers_from_packageds r5cCs|S)Nr)ÚobjrrrÚ _identityksr7csVd}t t |¡j¡‰‡fdd„}ttjtjtj hƒ}t ƒ}yúxô|ƒ\}}||krVq@q@|tj krl|rfPd}q@|tj kr.|dkr.|ƒ\}}|tj ksž|dkr P|ƒ\}}|tj ks¼|dkr¾P|ƒ\}}|tj krä|dkrä|ƒ\}}xJ|tj kr*| |¡|ƒ\}}|tj ks|d krP|ƒ\}}qæWq@Pq@WWntk rLYnXt|ƒS) NFcstˆƒ}|d|dfS)Nrr)Únext)Útok)ÚgenrrÚadvancersz(_detect_future_features..advanceTÚfromZ __future__Úimportú(ú,)rÚgenerate_tokensÚioÚStringIOÚreadlineÚ frozensetrÚNEWLINEÚNLÚCOMMENTrÚSTRINGÚNAMEÚOPÚaddÚ StopIteration)ÚsourceZhave_docstringr;ÚignoreÚfeaturesÚtpÚvaluer)r:rÚ_detect_future_featuresosD          rRc@s eZdZdS)Ú FixerErrorN)rrrrrrrrS—srSc@säeZdZdddœZdZdZd4dd„Zdd „Zd d „Zd d „Z dd„Z dd„Z d5dd„Z d6dd„Z dd„Zd7dd„Zdd„Zd8dd„Zdd„Zd d!„Zd9d"d#„Zd:d$d%„Zd&Zd'Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„ZdS);ÚRefactoringToolF)Úprint_functionÚwrite_unchanged_filesZFixr NcCs2||_|p g|_|j ¡|_|dk r0|j |¡|jdrDtj|_ntj |_|j  d¡|_ g|_ t  d¡|_g|_d|_tj|jtj|jd|_| ¡\|_|_g|_t ¡|_g|_g|_xXt|j|jƒD]F}|j rä|j !|¡qÌ||jkrü|j "|¡qÌ||jkrÌ|j "|¡qÌWt#|jƒ|_$t#|jƒ|_%dS)NrUrVrTF)ÚconvertÚlogger)&ÚfixersÚexplicitÚ_default_optionsÚcopyÚoptionsr r Ú!python_grammar_no_print_statementÚgrammarr)ÚgetrVÚerrorsÚloggingZ getLoggerrXÚ fixer_logÚwroterZDriverrrWÚ get_fixersÚ pre_orderÚ post_orderÚfilesÚbmZ BottomMatcherÚBMZ bmi_pre_orderZbmi_post_orderrZ BM_compatibleZ add_fixerrr/Úbmi_pre_order_headsÚbmi_post_order_heads)ÚselfZ fixer_namesr]rZr.rrrÚ__init__£s<           zRefactoringTool.__init__c Cs^g}g}x(|jD]}t|iidgƒ}| dd¡d}| |j¡rV|t|jƒd…}| d¡}|jd dd„|Dƒ¡}yt ||ƒ}Wn&t k r®t d ||fƒd‚YnX||j |j ƒ} | jræ|jd k ræ||jkræ| d |¡q| d |¡| jd kr | | ¡q| jdkr"| | ¡qt d| jƒ‚qWt d¡} |j| d|j| d||fS)Nr r0réÿÿÿÿÚ_ÚcSsg|] }| ¡‘qSr)Útitle)r1r#rrrr4çsz.RefactoringTool.get_fixers..zCan't find %s.%sTzSkipping optional fixer: %szAdding transformation: %sZpreZpostzIllegal fixer order: %rZ run_order)Úkey)rYrÚrsplitrÚ FILE_PREFIXÚlenÚsplitÚ CLASS_PREFIXÚjoinÚgetattrÚAttributeErrorrSr]rcrZÚ log_messageÚ log_debugÚorderrÚoperatorÚ attrgetterÚsort) rmZpre_order_fixersZpost_order_fixersZ fix_mod_pathÚmodr2ÚpartsÚ class_nameZ fix_classr.Zkey_funcrrrre×s8            zRefactoringTool.get_fixerscOs‚dS)Nr)rmÚmsgÚargsÚkwdsrrrÚ log_errorÿszRefactoringTool.log_errorcGs|r ||}|j |¡dS)N)rXÚinfo)rmr…r†rrrr|szRefactoringTool.log_messagecGs|r ||}|j |¡dS)N)rXÚdebug)rmr…r†rrrr} szRefactoringTool.log_debugcCsdS)Nr)rmÚold_textÚnew_textÚfilenameÚequalrrrÚ print_outputszRefactoringTool.print_outputcCs<x6|D].}tj |¡r&| |||¡q| |||¡qWdS)N)ÚosÚpathÚisdirÚ refactor_dirÚ refactor_file)rmÚitemsÚwriteÚ doctests_onlyZ dir_or_filerrrÚrefactors  zRefactoringTool.refactorc Cs¢tjd}x’t |¡D]„\}}}| d|¡| ¡| ¡xF|D]>}| d¡sBtj |¡d|krBtj ||¡} |  | ||¡qBWdd„|Dƒ|dd…<qWdS)NÚpyzDescending into %sr0rcSsg|]}| d¡s|‘qS)r0)r)r1Zdnrrrr4.sz0RefactoringTool.refactor_dir..) rÚextsepÚwalkr}rrr‘Úsplitextryr”) rmZdir_namer–r—Zpy_extÚdirpathZdirnamesÚ filenamesrÚfullnamerrrr“s    zRefactoringTool.refactor_dirc CsŠyt|dƒ}Wn0tk r>}z| d||¡dSd}~XYnXzt |j¡d}Wd| ¡Xtj|d|dd}| ¡|fSQRXdS)NÚrbzCan't open %s: %s)NNrr"rq)ÚencodingÚnewline) ÚopenÚOSErrorrˆrÚdetect_encodingrCÚcloserAÚread)rmrÚfÚerrr¡rrrÚ_read_python_source0s z#RefactoringTool._read_python_sourcecCsº| |¡\}}|dkrdS|d7}|rn| d|¡| ||¡}|jsL||kr`| |||||¡q¶| d|¡nH| ||¡}|jsŠ|rª|jrª|jt|ƒdd…|||dn | d|¡dS)NÚ zRefactoring doctests in %szNo doctest changes in %sro)r–r¡zNo changes in %s)rªr}Úrefactor_docstringrVÚprocessed_fileÚrefactor_stringÚ was_changedÚstr)rmrr–r—Úinputr¡ÚoutputÚtreerrrr”@s    zRefactoringTool.refactor_filec Cs–t|ƒ}d|krtj|j_zLy|j |¡}Wn6tk rb}z| d||jj |¡dSd}~XYnXWd|j|j_X||_ |  d|¡|  ||¡|S)NrUzCan't parse %s: %s: %szRefactoring %s) rRr r^rr_Z parse_stringr!rˆÚ __class__rÚfuture_featuresr}Ú refactor_tree)rmÚdatarrOr³r©rrrr®Ws     zRefactoringTool.refactor_stringcCsŒtj ¡}|rN| d¡| |d¡}|js2||krB| |d|¡qˆ| d¡n:| |d¡}|jsj|r~|jr~| t |ƒd|¡n | d¡dS)NzRefactoring doctests in stdinzzNo doctest changes in stdinzNo changes in stdin) ÚsysÚstdinr§r}r¬rVr­r®r¯r°)rmr—r±r²r³rrrÚrefactor_stdinrs     zRefactoringTool.refactor_stdinc Csüx"t|j|jƒD]}| ||¡qW| |j| ¡¡| |j| ¡¡|j |  ¡¡}xtt |  ¡ƒrÎx^|jj D]P}||krv||rv||j tjjdd|jr¼||j tjjdxt||ƒD]ø}|||krê|| |¡y t|ƒWntk rwÌYnX|jr&||jkr&qÌ| |¡}|rÌ| ||¡}|dk rÌ| |¡x,| ¡D] }|jsng|_|j |¡q\W|j |  ¡¡}x2|D]*} | |kr¬g|| <||  || ¡q–WqÌWqvWq\Wx$t|j|jƒD]}| ||¡qàW|jS)NT)rsÚreverse)rs)rrfrgZ start_treeÚ traverse_byrkrlrjÚrunZleavesÚanyr*rYrrZBaseÚdepthZkeep_line_orderZ get_linenor'ÚremoverÚ ValueErrorZfixers_appliedÚmatchÚ transformÚreplacerr,Z finish_treer¯) rmr³rr.Z match_setÚnodeÚresultsÚnewZ new_matchesZfxrrrrr¶‚sJ       $zRefactoringTool.refactor_treecCs^|sdSxP|D]H}xB||jD]4}| |¡}|r| ||¡}|dk r| |¡|}qWqWdS)N)rrÂrÃrÄ)rmrYZ traversalrÅr.rÆrÇrrrr¼Ñs     zRefactoringTool.traverse_bycCs†|j |¡|dkr.| |¡d}|dkr.dS||k}| ||||¡|r`| d|¡|js`dS|rv| ||||¡n | d|¡dS)NrzNo changes to %szNot writing changes to %s)rhrrªrr}rVÚ write_file)rmrŒrr‹r–r¡rŽrrrr­ès  zRefactoringTool.processed_filec Cs®ytj|d|dd}Wn0tk rF}z| d||¡dSd}~XYnX|Fy| |¡Wn0tk rŒ}z| d||¡Wdd}~XYnXWdQRX| d|¡d|_dS)NÚwrq)r¡r¢zCan't create %s: %szCan't write %s: %szWrote changes to %sT)rAr£r¤rˆr–r}rd)rmrŒrr‹r¡Úfpr©rrrrÈýs* zRefactoringTool.write_filez>>> z... c Csg}d}d}d}d}xØ|jddD]È}|d7}| ¡ |j¡r€|dk r\| | ||||¡¡|}|g}| |j¡} |d| …}q"|dk rº| ||j¡s®|||j ¡dkrº|  |¡q"|dk rØ| | ||||¡¡d}d}|  |¡q"W|dk r| | ||||¡¡d  |¡S)NrT)Úkeependsrr«rq) Ú splitlinesÚlstriprÚPS1r,Úrefactor_doctestÚfindÚPS2Úrstriprry) rmr±rÚresultÚblockZ block_linenoÚindentÚlinenoÚlineÚirrrr¬s:          z"RefactoringTool.refactor_docstringc syˆ ||ˆ¡}Wnftk rx}zHˆj tj¡rRx|D]}ˆ d| d¡¡q8Wˆ d|||j j |¡|Sd}~XYnXˆ  ||¡r t |ƒj dd}|d|d…||dd…} }|d d¡sØ|dd7<ˆˆj| d¡g}|r |‡‡fd d „|Dƒ7}|S) Nz Source: %sr«z+Can't parse docstring in %s line %s: %s: %sT)rËrrorcsg|]}ˆˆj|‘qSr)rÑ)r1r×)rÕrmrrr4Zsz4RefactoringTool.refactor_doctest..)Ú parse_blockr!rXZ isEnabledForrbÚDEBUGr}rÒrˆr´rr¶r°rÌÚendswithrÎÚpop) rmrÔrÖrÕrr³r©r×rÇZclippedr)rÕrmrrÏ@s$ "z RefactoringTool.refactor_doctestcCsÒ|jr d}nd}|js$| d|¡n&| d|¡x|jD]}| |¡q8W|jrt| d¡x|jD]}| |¡qbW|jrÎt|jƒdkr”| d¡n| dt|jƒ¡x&|jD]\}}}|j|f|ž|Žq®WdS) NÚwerez need to bezNo files %s modified.zFiles that %s modified:z$Warnings/messages while refactoring:rzThere was 1 error:zThere were %d errors:)rdrhr|rcrarv)rmrÝÚfileÚmessager…r†r‡rrrÚ summarize]s$     zRefactoringTool.summarizecCs"|j | |||¡¡}tƒ|_|S)N)rZ parse_tokensÚ wrap_toksrDrµ)rmrÔrÖrÕr³rrrrÙtszRefactoringTool.parse_blockc csht | ||¡j¡}xN|D]F\}}\}}\} } } ||d7}| |d7} ||||f| | f| fVqWdS)Nr)rr@Ú gen_linesÚ__next__) rmrÔrÖrÕr+rrQZline0Zcol0Zline1Zcol1Z line_textrrrrá~s   zRefactoringTool.wrap_toksccs€||j}||j}|}xV|D]N}| |¡r@|t|ƒd…Vn(|| ¡dkrXdVntd||fƒ‚|}qWx dVqrWdS)Nr«zline=%r, prefix=%rrq)rÎrÑrrvrÒÚAssertionError)rmrÔrÕÚprefix1Zprefix2Úprefixr×rrrrâŒs    zRefactoringTool.gen_lines)NN)FF)FF)FF)F)NFN)N)rrrr[rxrurnrerˆr|r}rr˜r“rªr”r®rºr¶r¼r­rÈrÎrÑr¬rÏràrÙrárârrrrrT›s: 4(   O  + rTc@s eZdZdS)ÚMultiprocessingUnsupportedN)rrrrrrrrç srçcsBeZdZ‡fdd„Zd ‡fdd„ Z‡fdd„Z‡fd d „Z‡ZS) ÚMultiprocessRefactoringToolcs"tt|ƒj||Žd|_d|_dS)N)ÚsuperrèrnÚqueueÚ output_lock)rmr†Úkwargs)r´rrrn¦sz$MultiprocessRefactoringTool.__init__Frc s|dkrttˆƒ |||¡Sy ddl‰Wntk r@t‚YnXˆjdk rTtdƒ‚ˆ ¡ˆ_ˆ  ¡ˆ_ ‡‡fdd„t |ƒDƒ}z.x|D] }|  ¡qˆWttˆƒ |||¡Wdˆj  ¡xt |ƒD]}ˆj d¡qÄWx|D]}| ¡rÞ|  ¡qÞWdˆ_XdS)Nrrz already doing multiple processescsg|]}ˆjˆjd‘qS))Útarget)ZProcessÚ_child)r1rØ)Úmultiprocessingrmrrr4¸sz8MultiprocessRefactoringTool.refactor..)rérèr˜rïÚ ImportErrorrçrêÚ RuntimeErrorZ JoinableQueueZLockrëÚrangeÚstartryÚputZis_alive)rmr•r–r—Z num_processesZ processesr#rØ)r´)rïrmrr˜«s2               z$MultiprocessRefactoringTool.refactorcsR|j ¡}xB|dk rL|\}}ztt|ƒj||ŽWd|j ¡X|j ¡}q WdS)N)rêr`rérèr”Z task_done)rmZtaskr†rì)r´rrrîÈs     z"MultiprocessRefactoringTool._childcs2|jdk r|j ||f¡ntt|ƒj||ŽSdS)N)rêrôrérèr”)rmr†rì)r´rrr”Ós  z)MultiprocessRefactoringTool.refactor_file)FFr)rrrrnr˜rîr”Ú __classcell__rr)r´rrè¤s   rè)T)"Ú __author__rArrr¸rbrr%Ú itertoolsrZpgen2rrrZ fixer_utilrrqrr r rirr!rrr/r5r7rRrSÚobjectrTrçrèrrrrÚ s6    (