grthtrhthjhtyjytjytkergtrhtrjytjerhrfh3 \=mã@s8dZddlZddlZddlZddlZddlZddlZddlmZddl m Z m Z m Z ddl mZddlmZmZddlmZd%d d „ZGd d „d eƒZdd„Zdd„Zdd„Zdd„Zejd&kràddlZejZdd„Zdd„Z n eZeZeZ dd„Z!Gdd„deƒZ"Gdd „d e#ƒZ$Gd!d"„d"eƒZ%Gd#d$„d$e$ƒZ&dS)'z#Guido van Rossum éN)Úchainé)ÚdriverÚtokenizeÚtoken)Ú find_root)ÚpytreeÚpygram)Ú btm_matcherTcCstt|ggdgƒ}tjj|jƒ}g}xLttj|ƒƒD]:}|jdƒr2|jdƒr2|rZ|dd…}|j |dd…ƒq2W|S)NÚ*Úfix_z.pyéééýÿÿÿ) Ú __import__ÚosÚpathÚdirnameÚ__file__ÚsortedÚlistdirÚ startswithÚendswithÚappend)Z fixer_pkgZ remove_prefixZpkgZ fixer_dirZ fix_namesÚname©rú(/usr/lib64/python3.6/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]}|j 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      r$c CsÊtjtƒ}g}x„|D]|}|jrjyt|jƒ}Wntk rJ|j|ƒYq�XxB|D]}||j|ƒqRWq|jdk r†||jj|ƒq|j|ƒqWx,tt j j j ƒt j j ƒD]}||j|ƒq¬Wt|ƒS)N)Ú collectionsÚ defaultdictÚlistÚpatternr$rrZ _accept_typerr Úpython_grammarZ symbol2numberÚvaluesÚtokensÚextendÚdict)Z fixer_listZ head_nodesZeveryÚfixerZheadsZ node_typerrrÚ_get_headnode_dictKs"    r5cs‡fdd„tˆdƒDƒS)Ncsg|]}ˆd|‘qS)Ú.r)Ú.0Úfix_name)Úpkg_namerrú hsz+get_fixers_from_package..F)r)r9r)r9rÚget_fixers_from_packageds r;cCs|S)Nr)ÚobjrrrÚ _identityksr=rcCs |jddƒS)Nz Ú )Úreplace)ÚinputrrrÚ_from_system_newlinesrsrAcCs tjdkr|jdtjƒS|SdS)Nr>)rÚlinesepr?)r@rrrÚ_to_system_newlinests rCc sTd}tjtj|ƒjƒ‰‡fdd„}ttjtjtj hƒ}t ƒ}yøxò|ƒ\}}||krVq@q@|tj krl|rfPd}q@|tj ko||dk�r,|ƒ\}}|tj ksœ|dkržP|ƒ\}}|tj ksº|dkr¼P|ƒ\}}|tj krâ|dkrâ|ƒ\}}xJ|tj k�r(|j|ƒ|ƒ\}}|tj k�s|d k�rP|ƒ\}}qäWq@Pq@WWntk �rJYnXt|ƒS) NFcstˆƒ}|d|dfS)Nrr)Únext)Útok)ÚgenrrÚadvance‚sz(_detect_future_features..advanceTÚfromZ __future__Úimportú(ú,)rÚgenerate_tokensÚioÚStringIOÚreadlineÚ frozensetrÚNEWLINEÚNLÚCOMMENTr%ÚSTRINGÚNAMEÚOPÚaddÚ StopIteration)ÚsourceZhave_docstringrGÚignoreÚfeaturesÚtpÚvaluer)rFrÚ_detect_future_featuressD          r^c@s eZdZdS)Ú FixerErrorN)rr r!rrrrr_§sr_c@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|_|jjƒ|_|dk r0|jj|ƒ|jdrDtj|_ntj |_|jj dƒ|_ g|_ t jdƒ|_g|_d|_tj|jtj|jd�|_|jƒ\|_|_g|_tjƒ|_g|_g|_xXt|j|jƒD]F}|j rä|jj!|ƒqÌ||jkrü|jj"|ƒqÌ||jkrÌ|jj"|ƒqÌWt#|jƒ|_$t#|jƒ|_%dS)Nrarbr`F)ÚconvertÚlogger)&ÚfixersÚexplicitÚ_default_optionsÚcopyÚoptionsr&r Ú!python_grammar_no_print_statementÚgrammarr/ÚgetrbÚerrorsÚloggingZ getLoggerrdÚ fixer_logÚwroterZDriverrrcÚ get_fixersÚ pre_orderÚ post_orderÚfilesÚbmZ BottomMatcherÚBMZ bmi_pre_orderZbmi_post_orderrZ BM_compatibleZ add_fixerrr5Úbmi_pre_order_headsÚbmi_post_order_heads)ÚselfZ fixer_namesrirfr4rrrÚ__init__³s<           zRefactoringTool.__init__c Cs\g}g}�x&|jD�]}t|iidgƒ}|jddƒd}|j|jƒrV|t|jƒd…}|jdƒ}|jdjdd„|Dƒƒ}yt ||ƒ}Wn$t k r¬t d||fƒ‚YnX||j |j ƒ} | jrä|jd k rä||jkrä|jd |ƒq|jd |ƒ| jd k�r|j| ƒq| jd k�r |j| ƒqt d| jƒ‚qWtjdƒ} |j| d�|j| d�||fS)Nr r6rÚ_ÚcSsg|] }|jƒ‘qSr)Útitle)r7r)rrrr:÷sz.RefactoringTool.get_fixers..zCan't find %s.%sTzSkipping optional fixer: %szAdding transformation: %sZpreZpostzIllegal fixer order: %rZ run_order)Úkeyéÿÿÿÿ)rerÚrsplitrÚ FILE_PREFIXÚlenÚsplitÚ CLASS_PREFIXÚjoinÚgetattrÚAttributeErrorr_rirorfÚ log_messageÚ log_debugÚorderrÚoperatorÚ attrgetterÚsort) ryZpre_order_fixersZpost_order_fixersZ fix_mod_pathÚmodr8ÚpartsÚ class_nameZ fix_classr4Zkey_funcrrrrqçs8            zRefactoringTool.get_fixerscOs‚dS)Nr)ryÚmsgÚargsÚkwdsrrrÚ log_errorszRefactoringTool.log_errorcGs|r ||}|jj|ƒdS)N)rdÚinfo)ryr‘r’rrrrˆszRefactoringTool.log_messagecGs|r ||}|jj|ƒdS)N)rdÚdebug)ryr‘r’rrrr‰szRefactoringTool.log_debugcCsdS)Nr)ryÚold_textÚnew_textÚfilenameÚequalrrrÚ print_outputszRefactoringTool.print_outputcCs<x6|D].}tjj|ƒr&|j|||ƒq|j|||ƒqWdS)N)rrÚisdirÚ refactor_dirÚ refactor_file)ryÚitemsÚwriteÚ doctests_onlyZ dir_or_filerrrÚrefactor#s  zRefactoringTool.refactorc Cs¤tjd}x”tj|ƒD]†\}}}|jd|ƒ|jƒ|jƒxH|D]@}|jdƒ rBtjj|ƒd|krBtjj||ƒ} |j | ||ƒqBWdd„|Dƒ|dd…<qWdS)NÚpyzDescending into %sr6rcSsg|]}|jdƒs|‘qS)r6)r)r7Zdnrrrr:>sz0RefactoringTool.refactor_dir..) rÚextsepÚwalkr‰r�rrÚsplitextr…rž) ryZdir_namer r¡Zpy_extÚdirpathZdirnamesÚ filenamesrÚfullnamerrrr�,s    zRefactoringTool.refactor_dircCsˆyt|dƒ}Wn.tk r<}z|jd||ƒdSd}~XnXztj|jƒd}Wd|jƒXt|d|d��}t|j ƒƒ|fSQRXdS)NÚrbzCan't open %s: %srr()Úencoding)NN) ÚopenÚOSErrorr”rÚdetect_encodingrOÚcloseÚ_open_with_encodingrAÚread)ryr™ÚfÚerrr«rrrÚ_read_python_source@s z#RefactoringTool._read_python_sourcecCsº|j|ƒ\}}|dkrdS|d7}|rn|jd|ƒ|j||ƒ}|jsL||kr`|j|||||ƒq¶|jd|ƒnH|j||ƒ}|jsŠ|rª|jrª|jt|ƒdd…|||d�n |jd|ƒdS)Nr>zRefactoring doctests in %szNo doctest changes in %sr)r r«zNo changes in %sr)r´r‰Úrefactor_docstringrbÚprocessed_fileÚrefactor_stringÚ was_changedÚstr)ryr™r r¡r@r«ÚoutputÚtreerrrržPs    zRefactoringTool.refactor_filecCs”t|ƒ}d|krtj|j_zJy|jj|ƒ}Wn4tk r`}z|jd||jj |ƒdSd}~XnXWd|j|j_X||_ |j d|ƒ|j ||ƒ|S)NrazCan't parse %s: %s: %szRefactoring %s) r^r rjrrkZ parse_stringr'r”Ú __class__rÚfuture_featuresr‰Ú refactor_tree)ryÚdatarr[r»r³rrrr·gs     zRefactoringTool.refactor_stringcCsŒtjjƒ}|rN|jdƒ|j|dƒ}|js2||krB|j|d|ƒqˆ|jdƒn:|j|dƒ}|jsj|r~|jr~|jt |ƒd|ƒn |jdƒdS)NzRefactoring doctests in stdinzzNo doctest changes in stdinzNo changes in stdin) ÚsysÚstdinr±r‰rµrbr¶r·r¸r¹)ryr¡r@rºr»rrrÚrefactor_stdin‚s     zRefactoringTool.refactor_stdinc Csþx"t|j|jƒD]}|j||ƒqW|j|j|jƒƒ|j|j|jƒƒ|jj|j ƒƒ}�xvt |j ƒƒ�rÐ�x`|jj D�]R}||koŠ||rv||j tjjdd�|jr¼||j tjjd��x t||ƒD�]ø}|||krì||j|ƒy t|ƒWntk �rwÌYnX|j�r(||jk�r(qÌ|j|ƒ}|rÌ|j||ƒ}|dk rÌ|j|ƒx,|jƒD] }|j�spg|_|jj|ƒ�q^W|jj|j ƒƒ}x2|D]*} | |k�r®g|| <|| j|| ƒ�q˜WqÌWqvWq\Wx$t|j|jƒD]}|j||ƒ�qâW|jS)NT)r~Úreverse)r~)rrrrsZ start_treeÚ traverse_byrwrxrvZrunZleavesÚanyr0rer�rZBaseZdepthZkeep_line_orderZ get_linenor-ÚremoverÚ ValueErrorZfixers_appliedÚmatchÚ transformr?rr2Z finish_treer¸) ryr»rr4Z match_setÚnodeÚresultsÚnewZ new_matchesZfxrrrrr¾’sJ       $zRefactoringTool.refactor_treecCs^|sdSxP|D]H}xB||jD]4}|j|ƒ}|r|j||ƒ}|dk r|j|ƒ|}qWqWdS)N)r#rÈrÉr?)ryreZ traversalrÊr4rËrÌrrrrÄás     zRefactoringTool.traverse_bycCs†|jj|ƒ|dkr.|j|ƒd}|dkr.dS||k}|j||||ƒ|r`|jd|ƒ|js`dS|rv|j||||ƒn |jd|ƒdS)NrzNo changes to %szNot writing changes to %s)rtrr´r›r‰rbÚ write_file)ryr˜r™r—r r«ršrrrr¶øs  zRefactoringTool.processed_filec%Cs¬yt|d|d�}Wn.tk r@}z|jd||ƒdSd}~XnXzHy|jt|ƒƒWn0tk r†}z|jd||ƒWYdd}~XnXWd|jƒX|jd|ƒd|_dS)NÚw)r«zCan't create %s: %szCan't write %s: %szWrote changes to %sT)r°r­r”r rCr¯r‰rp)ryr˜r™r—r«r²r³rrrrÍ s$  zRefactoringTool.write_filez>>> z... c Csg}d}d}d}d}xØ|jdd�D]È}|d7}|jƒj|jƒr€|dk r\|j|j||||ƒƒ|}|g}|j|jƒ} |d| …}q"|dk rº|j||jƒs®|||jjƒdkrº|j |ƒq"|dk rØ|j|j||||ƒƒd}d}|j |ƒq"W|dk �r|j|j||||ƒƒdj |ƒS)NrT)Úkeependsrr>r|) Ú splitlinesÚlstriprÚPS1r2Úrefactor_doctestÚfindÚPS2Úrstriprr…) ryr@r™ÚresultÚblockZ block_linenoÚindentÚlinenoÚlineÚirrrrµ%s:          z"RefactoringTool.refactor_docstringc syˆj||ˆƒ}Wndtk rv}zHˆjjtjƒrRx|D]}ˆjd|jdƒƒq8Wˆjd|||j j |ƒ|Sd}~XnXˆj ||ƒ�r t |ƒj dd�}|d|d…||dd…} }|d jdƒsÖ|d d7<ˆˆj|jdƒg}|�r |‡‡fdd „|Dƒ7}|S) Nz Source: %sr>z+Can't parse docstring in %s line %s: %s: %sT)rÏrrcsg|]}ˆˆj|‘qSr)rÕ)r7rÛ)rÙryrrr:jsz4RefactoringTool.refactor_doctest..rr)Ú parse_blockr'rdZ isEnabledForrnÚDEBUGr‰rÖr”r¼rr¾r¹rÐrrÒÚpop) ryrØrÚrÙr™r»r³rÛrÌZclippedr)rÙryrrÓPs$ "z RefactoringTool.refactor_doctestcCsÒ|jr d}nd}|js$|jd|ƒn&|jd|ƒx|jD]}|j|ƒq8W|jrt|jdƒx|jD]}|j|ƒqbW|jrÎt|jƒdkr”|jdƒn|jdt|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:)rprtrˆrormr‚)ryràÚfileÚmessager‘r’r“rrrÚ summarizems$     zRefactoringTool.summarizecCs"|jj|j|||ƒƒ}tƒ|_|S)N)rZ parse_tokensÚ wrap_toksrPr½)ryrØrÚrÙr»rrrrÝ„szRefactoringTool.parse_blockc cshtj|j||ƒjƒ}xN|D]F\}}\}}\} } } ||d7}| |d7} ||||f| | f| fVqWdS)Nr)rrLÚ gen_linesÚ__next__) ryrØrÚrÙr1r#r]Zline0Zcol0Zline1Zcol1Z line_textrrrräŽs   zRefactoringTool.wrap_toksccs€||j}||j}|}xV|D]N}|j|ƒr@|t|ƒd…Vn(||jƒdkrXdVntd||fƒ‚|}qWx dVqrWdS)Nr>zline=%r, prefix=%rr|)rÒrÕrr‚rÖÚAssertionError)ryrØrÙÚprefix1Zprefix2ÚprefixrÛrrrråœs    zRefactoringTool.gen_lines)NN)FF)FF)FF)F)NFN)N)rr r!rgr„r�rzrqr”rˆr‰r›r¢r�r´ržr·rÂr¾rÄr¶rÍrÒrÕrµrÓrãrÝrärårrrrr`«s: 4(   O  + r`c@s eZdZdS)ÚMultiprocessingUnsupportedN)rr r!rrrrrê°srêcsBeZdZ‡fdd„Zd ‡fdd„ Z‡fdd„Z‡fd d „Z‡ZS) ÚMultiprocessRefactoringToolcs"tt|ƒj||Žd|_d|_dS)N)ÚsuperrërzÚqueueÚ output_lock)ryr’Úkwargs)r¼rrrz¶sz$MultiprocessRefactoringTool.__init__Frcs|dkrttˆƒj|||ƒSy ddl‰Wntk r@t‚YnXˆjdk rTtdƒ‚ˆjƒˆ_ˆj ƒˆ_ ‡‡fdd„t |ƒDƒ}z.x|D] }|j ƒqˆWttˆƒj|||ƒWdˆjj ƒxt |ƒD]}ˆjjdƒqÄWx|D]}|jƒrÞ|j ƒqÞWdˆ_XdS)Nrrz already doing multiple processescsg|]}ˆjˆjd�‘qS))Útarget)ZProcessÚ_child)r7rÜ)Úmultiprocessingryrrr:Èsz8MultiprocessRefactoringTool.refactor..)rìrër¢ròÚ ImportErrorrêríÚ RuntimeErrorZ JoinableQueueZLockrîÚrangeÚstartr…ÚputZis_alive)ryrŸr r¡Z num_processesZ processesr)rÜ)r¼)ròryrr¢»s2               z$MultiprocessRefactoringTool.refactorc sR|jjƒ}xB|dk rL|\}}ztt|ƒj||ŽWd|jjƒX|jjƒ}q WdS)N)rírlrìrëržZ task_done)ryZtaskr’rï)r¼rrrñØs     z"MultiprocessRefactoringTool._childcs2|jdk r|jj||fƒntt|ƒj||ŽSdS)N)rír÷rìrërž)ryr’rï)r¼rrržãs  z)MultiprocessRefactoringTool.refactor_file)FFr)rr r!rzr¢rñržÚ __classcell__rr)r¼rrë´s   rë)T)rr)'Ú __author__rrÀrnr‹r+rMÚ itertoolsrZpgen2rrrZ fixer_utilrr|rr r rurr'rr$r5r;r=Ú version_infoÚcodecsr¬r°rArCr^r_Úobjectr`rêrërrrrÚ sD      (