U e5dkã@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_matcherTcCsTt|ggdgƒ}g}t |j¡D].\}}}| d¡r |rD|dd…}| |¡q |S)NÚ*Úfix_é)Ú __import__ÚpkgutilZ iter_modulesÚ__path__Ú startswithÚappend)Z fixer_pkgZ remove_prefixZpkgZ fix_namesÚfinderÚnameZispkg©rú(/usr/lib64/python3.8/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 ƒ}|jD]}|D]}|  t|ƒ¡qhq`|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}|D]x}|jrdzt|jƒ}Wntk rH| |¡YqŠX|D]}|| |¡qNq|jdk r€||j |¡q| |¡qtt j j   ¡t j j ƒD]}|| |¡q¢t|ƒ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$    ÿr1cs‡fdd„tˆdƒDƒS)Ncsg|]}ˆd|‘qS©Ú.r)Ú.0Úfix_name©Zpkg_namerrÚ hsÿz+get_fixers_from_package..F)rr6rr6rÚget_fixers_from_packageds ÿr8cCs|Sr&r)ÚobjrrrÚ _identityksr:csXd}t t |¡j¡‰‡fdd„}ttjtjtj hƒ}t ƒ}zü|ƒ\}}||krTq>q>|tj krl|rf�q6d}q>|tj k�r6|dk�r6|ƒ\}}|tj ksž|dkr¢�q6|ƒ\}}|tj ks¾|dkrÂ�q6|ƒ\}}|tj krè|dkrè|ƒ\}}|tj k�r4| |¡|ƒ\}}|tj k�s.|d k�r"�q4|ƒ\}}qèq>�q6q>Wntk �rNYnXt|ƒ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Úvaluerr=rÚ_detect_future_featuresosB           rVc@s eZdZdS)Ú FixerErrorNrrrrrrW—srWc@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 NcCs.||_|p g|_|j ¡|_|dk r0|j |¡|jdrDtj|_ntj |_|j  d¡|_ g|_ t  d¡|_g|_d|_tj|jtj|jd�|_| ¡\|_|_g|_t ¡|_g|_g|_t|j|jƒD]F}|j râ|j !|¡qÊ||jkrú|j "|¡qÊ||jkrÊ|j "|¡qÊt#|jƒ|_$t#|jƒ|_%dS)NrYrZrXF)ÚconvertÚlogger)&ÚfixersÚexplicitÚ_default_optionsÚcopyÚoptionsr!r Ú!python_grammar_no_print_statementÚgrammarr+ÚgetrZÚerrorsÚloggingZ getLoggerr\Ú fixer_logÚwroterZDriverrr[Ú get_fixersÚ pre_orderÚ post_orderÚfilesÚbmZ BottomMatcherÚBMZ bmi_pre_orderZbmi_post_orderrZ BM_compatibleZ add_fixerrr1Úbmi_pre_order_headsÚbmi_post_order_heads)ÚselfZ fixer_namesrar^r0rrrÚ__init__£s>      þ    zRefactoringTool.__init__c CsXg}g}|jD�]}t|iidgƒ}| dd¡d}| |j¡rR|t|jƒd…}| d¡}|jd dd„|Dƒ¡}zt ||ƒ}Wn&t k rªt d ||fƒd‚YnX||j |j ƒ} | jrâ|jd k râ||jkrâ| d |¡q| d |¡| jd k�r| | ¡q| jdk�r| | ¡qt d| jƒ‚qt d¡} |j| d�|j| d�||fS)Nr r3réÿÿÿÿÚ_ÚcSsg|] }| ¡‘qSr)Útitle)r4r$rrrr7çsz.RefactoringTool.get_fixers..zCan't find %s.%sTzSkipping optional fixer: %szAdding transformation: %sZpreZpostzIllegal fixer order: %rZ run_order©Úkey)r]rÚrsplitrÚ FILE_PREFIXÚlenÚsplitÚ CLASS_PREFIXÚjoinÚgetattrÚAttributeErrorrWrargr^Ú log_messageÚ log_debugÚorderrÚoperatorÚ attrgetterÚsort) rqZpre_order_fixersZpost_order_fixersZ fix_mod_pathÚmodr5ÚpartsÚ class_nameZ fix_classr0Zkey_funcrrrri×s:   ÿ         zRefactoringTool.get_fixerscOs‚dSr&r)rqÚmsgÚargsÚkwdsrrrÚ log_errorÿszRefactoringTool.log_errorcGs|r ||}|j |¡dSr&)r\Úinfo©rqrŠr‹rrrr�szRefactoringTool.log_messagecGs|r ||}|j |¡dSr&)r\Údebugr�rrrr‚ szRefactoringTool.log_debugcCsdSr&r)rqÚold_textÚnew_textÚfilenameÚequalrrrÚ print_outputszRefactoringTool.print_outputcCs8|D].}tj |¡r$| |||¡q| |||¡qdSr&)ÚosÚpathÚisdirÚ refactor_dirÚ refactor_file)rqÚitemsÚwriteÚ doctests_onlyZ dir_or_filerrrÚrefactors zRefactoringTool.refactorc Csštjd}t |¡D]€\}}}| d|¡| ¡| ¡|D]>}| d¡s>tj |¡d|kr>tj ||¡} |  | ||¡q>dd„|Dƒ|dd…<qdS)NÚpyzDescending into %sr3rcSsg|]}| d¡s|‘qSr2)r)r4Zdnrrrr7.s z0RefactoringTool.refactor_dir..) r–ÚextsepÚwalkr‚r†rr—Úsplitextr~rš) rqZdir_namerœr�Zpy_extÚdirpathZdirnamesÚ filenamesrÚfullnamerrrr™s   ÿzRefactoringTool.refactor_dirc Csœzt|dƒ}Wn6tk rD}z| d||¡WY¢dSd}~XYnXzt |j¡d}W5| ¡Xtj|d|dd��}| ¡|fW5QR£SQRXdS)NÚrbzCan't open %s: %s)NNrr#ru©ÚencodingÚnewline) ÚopenÚOSErrorr�ÚcloserÚdetect_encodingrGrEÚread)rqr“Ú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…|||d�n | d|¡dS)NÚ zRefactoring doctests in %szNo doctest changes in %srs)rœr¨zNo changes in %s)r±r‚Úrefactor_docstringrZÚprocessed_fileÚrefactor_stringÚ was_changedÚstr)rqr“rœr�Úinputr¨ÚoutputÚtreerrrrš@s"   ÿzRefactoringTool.refactor_filec Cs t|ƒ}d|krtj|j_zVz|j |¡}Wn@tk rl}z"| d||jj |¡WY¢W¢dSd}~XYnXW5|j|j_X||_ |  d|¡|  ||¡|S)NrYzCan't parse %s: %s: %szRefactoring %s) rVr rbrrcZ parse_stringr"r�Ú __class__rÚfuture_featuresr‚Ú refactor_tree)rqÚdatarrSrº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³rZr´rµr¶r·)rqr�r¸r¹rºrrrÚrefactor_stdinrs     zRefactoringTool.refactor_stdinc CsÜt|j|jƒD]}| ||¡q| |j| ¡¡| |j| ¡¡|j |  ¡¡}t |  ¡ƒ�r´|jj D�]D}||krj||rj||j tjjdd�|jr°||j tjjd�t||ƒD]ò}|||krÚ|| |¡z t|ƒWntk �rYq¼YnX|j�r||jk�rq¼| |¡}|r¼| ||¡}|dk r¼| |¡| ¡D] }|j�s^g|_|j |¡�qL|j |  ¡¡}|D]*} | |k�r˜g|| <||  || ¡�q‚q¼qjqTt|j|jƒD]}| ||¡�qÂ|jS)NT)rxÚreverserw)rrjrkZ start_treeÚ traverse_byrorprnÚrunZleavesÚanyr,r]r†rZBaseZdepthZkeep_line_orderZ get_linenor)ÚremoverÚ ValueErrorZfixers_appliedÚmatchÚ transformÚreplacerr.Z finish_treer¶) rqrºrr0Z match_setÚnodeÚresultsÚnewZ new_matchesZfxrrrrr½‚sJ        zRefactoringTool.refactor_treecCsV|sdS|D]D}||jD]4}| |¡}|r| ||¡}|dk r| |¡|}qq dSr&)rrÈrÉrÊ)rqr]Z traversalrËr0rÌ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)rlrr±r•r‚rZÚ write_file)rqr’r“r‘rœr¨r”rrrr´ès  zRefactoringTool.processed_filec Cs´ztj|d|dd�}Wn6tk rL}z| d||¡WY¢dSd}~XYnX|�Fz| |¡Wn0tk r’}z| d||¡W5d}~XYnXW5QRX| d|¡d|_dS)NÚwrur§zCan't create %s: %szCan't write %s: %szWrote changes to %sT)rErªr«r�rœr‚rh)rqr’r“r‘r¨Úfpr°rrrrÎýs* zRefactoringTool.write_filez>>> z... c Csg}d}d}d}d}|jdd�D]È}|d7}| ¡ |j¡r~|dk rZ| | ||||¡¡|}|g}| |j¡} |d| …}q |dk r¸| ||j¡s¬|||j ¡dkr¸|  |¡q |dk rÖ| | ||||¡¡d}d}|  |¡q |dk �r | | ||||¡¡d  |¡S)NrT©Úkeependsrr²ru) Ú splitlinesÚlstriprÚPS1r.Úrefactor_doctestÚfindÚPS2Úrstriprr~) rqr¸r“ÚresultÚblockZ block_linenoÚindentÚlinenoÚlineÚirrrr³sJ  ÿ ÿþ  ÿ   ÿz"RefactoringTool.refactor_docstringc szˆ ||ˆ¡}Wnjtk r|}zLˆj tj¡rN|D]}ˆ d| d¡¡q6ˆ d|||j j |¡|WY¢Sd}~XYnXˆ  ||¡�rt |ƒ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: %sTrÑrrsrcsg|]}ˆˆj|‘qSr)rØ)r4rÞ©rÜrqrrr7Zsz4RefactoringTool.refactor_doctest..)Ú parse_blockr"r\Z isEnabledForrfÚDEBUGr‚rÙr�r»rr½r·rÓÚendswithrÕÚpop) rqrÛrÝrÜr“rºr°rÞrÍZclippedrràrrÖ@s,ÿ"z RefactoringTool.refactor_doctestcCsÆ|jr d}nd}|js$| d|¡n"| d|¡|jD]}| |¡q6|jrl| d¡|jD]}| |¡q\|jrÂt|jƒdkrŒ| d¡n| dt|jƒ¡|jD]\}}}|j|f|ž|Žq¤dS) 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:)rhrlr�rgrer{)rqråÚfileÚmessagerŠr‹rŒrrrÚ summarize]s$       zRefactoringTool.summarizecCs"|j | |||¡¡}tƒ|_|Sr&)rZ parse_tokensÚ wrap_toksrHr¼)rqrÛrÝrÜrºrrrrátszRefactoringTool.parse_blockc csdt | ||¡j¡}|D]F\}}\}}\} } } ||d7}| |d7} ||||f| | f| fVqdS)Nr)rrDÚ gen_linesÚ__next__) rqrÛrÝrÜr-rrUZline0Zcol0Zline1Zcol1Z line_textrrrré~s   zRefactoringTool.wrap_toksccsx||j}||j}|}|D]N}| |¡r>|t|ƒd…Vn(|| ¡dkrVdVntd||fƒ‚|}qdVqldS)Nr²zline=%r, prefix=%rru)rÕrØrr{rÙÚAssertionError)rqrÛrÜÚprefix1Zprefix2ÚprefixrÞrrrrêŒs   zRefactoringTool.gen_lines)NN)FF)FF)FF)F)NFN)N)rrrr_r}rzrrrir�r�r‚r•ržr™r±ršrµrÁr½rÃr´rÎrÕrØr³rÖrèrárérêrrrrrX›s>ÿ 4(   Oÿ  + rXc@s eZdZdS)ÚMultiprocessingUnsupportedNrrrrrrï srïcsBeZdZ‡fdd„Zd ‡fdd„ Z‡fdd„Z‡fd d „Z‡ZS) ÚMultiprocessRefactoringToolcs"tt|ƒj||Žd|_d|_dSr&)ÚsuperrðrrÚqueueÚ output_lock©rqr‹Úkwargs©r»rrrr¦sz$MultiprocessRefactoringTool.__init__Frc sö|dkrttˆƒ |||¡Sz ddl‰Wntk r@t‚YnXˆjdk rTtdƒ‚ˆ ¡ˆ_ˆ  ¡ˆ_ ‡‡fdd„t |ƒDƒ}z*|D] }| ¡q†ttˆƒ |||¡W5ˆj  ¡t |ƒD]}ˆj  d¡q¾|D]}| ¡rÔ|  ¡qÔdˆ_XdS)Nrrz already doing multiple processescsg|]}ˆjˆjd�‘qS))Útarget)ZProcessÚ_child)r4rß©Úmultiprocessingrqrrr7¸sÿz8MultiprocessRefactoringTool.refactor..)rñrðržrúÚ ImportErrorrïròÚ RuntimeErrorZ JoinableQueueZLockróÚranger~ÚputZis_aliveÚstart)rqr›rœr�Z num_processesZ processesrßr$rörùrrž«s< ÿ      ÿ ÿ   z$MultiprocessRefactoringTool.refactorcsN|j ¡}|dk rJ|\}}ztt|ƒj||ŽW5|j ¡X|j ¡}q dSr&)ròrdZ task_donerñrðrš)rqZtaskr‹rõrörrrøÈs  ÿ z"MultiprocessRefactoringTool._childcs2|jdk r|j ||f¡ntt|ƒj||ŽSdSr&)ròrþrñrðršrôrörrršÓs   ÿz)MultiprocessRefactoringTool.refactor_file)FFr)rrrrrržrøršÚ __classcell__rrrörrð¤s  ÿ rð)T)"Ú __author__rEr–rr¿rfr„r'Ú itertoolsrZpgen2rrrZ fixer_utilrrurr r rmrr"rrr1r8r:rVrWÚobjectrXrïrðrrrrÚ s6    (