a
    åzesk  ã                   @   s
  d Z ddlZddlZddlZddlZddlZddlZddlZddlm	Z	 ddl
mZmZmZ ddlmZ ddlmZmZ ddlmZ d d
d„ZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!dS )!z#Guido van Rossum <guido@python.org>é    N)Úchainé   )ÚdriverÚtokenizeÚtoken)Ú	find_root)ÚpytreeÚpygram)Úbtm_matcherTc                 C   sT   t | g g dgƒ}g }t |j¡D ].\}}}| d¡r |rD|dd … }| |¡ q |S )NÚ*Úfix_é   )Ú
__import__ÚpkgutilZiter_modulesÚ__path__Ú
startswithÚappend)Z	fixer_pkgZremove_prefixZpkgZ	fix_namesÚfinderÚnameZispkg© r   ú&/usr/lib/python3.9/lib2to3/refactor.pyÚget_all_fix_names   s    
r   c                   @   s   e Zd ZdS )Ú
_EveryNodeN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   +   s   r   c                 C   s’   t | tjtjfƒr(| jd u r t‚| jhS t | tjƒrH| jrDt| jƒS t‚t | tj	ƒr‚t
ƒ }| jD ]}|D ]}| t|ƒ¡ qhq`|S td|  ƒ‚d S )Nz$Oh no! I don't understand pattern %s)Ú
isinstancer   ZNodePatternZLeafPatternÚtyper   ZNegatedPatternZcontentÚ_get_head_typesZWildcardPatternÚsetÚupdateÚ	Exception)ÚpatÚrÚpÚxr   r   r   r   /   s    


r   c              	   C   s¼   t  t¡}g }| D ]v}|jrbzt|jƒ}W n tyF   | |¡ Y qˆ0 |D ]}||  |¡ qLq|jd ur~||j  |¡ q| |¡ qtt	j
j ¡ t	j
jƒD ]}||  |¡ q t|ƒS ©N)ÚcollectionsÚdefaultdictÚlistÚpatternr   r   r   Z_accept_typer   r	   Úpython_grammarZsymbol2numberÚvaluesÚtokensÚextendÚdict)Z
fixer_listZ
head_nodesZeveryÚfixerZheadsZ	node_typer   r   r   Ú_get_headnode_dictK   s$    

ÿr2   c                    s   ‡ fdd„t ˆ dƒD ƒS )Nc                    s   g | ]}ˆ d  | ‘qS ©Ú.r   )Ú.0Úfix_name©Zpkg_namer   r   Ú
<listcomp>h   s   ÿz+get_fixers_from_package.<locals>.<listcomp>F)r   r7   r   r7   r   Úget_fixers_from_packaged   s    
ÿr9   c                 C   s   | S r'   r   )Úobjr   r   r   Ú	_identityk   s    r;   c                    sV  d}t  t | ¡j¡‰ ‡ fdd„}ttjt jtj	hƒ}t
ƒ }zü|ƒ \}}||v rTq>q>|tjkrl|rfq6d}q>|tjkr6|dkr6|ƒ \}}|tjksž|dkr¢q6|ƒ \}}|tjks¾|dkrÂq6|ƒ \}}|tjkrè|dkrè|ƒ \}}|tjkr4| |¡ |ƒ \}}|tjks.|d	kr"q4|ƒ \}}qèq>q6q>W n tyL   Y n0 t|ƒS )
NFc                     s   t ˆ ƒ} | d | d fS )Nr   r   )Únext)Útok©Úgenr   r   Úadvancer   s    z(_detect_future_features.<locals>.advanceTÚfromZ
__future__Úimportú(ú,)r   Úgenerate_tokensÚioÚStringIOÚreadlineÚ	frozensetr   ÚNEWLINEÚNLÚCOMMENTr    ÚSTRINGÚNAMEÚOPÚaddÚStopIteration)ÚsourceZhave_docstringr@   ÚignoreÚfeaturesÚtpÚvaluer   r>   r   Ú_detect_future_featureso   sB    








rW   c                   @   s   e Zd ZdS )Ú
FixerErrorNr   r   r   r   r   rX   —   s   rX   c                   @   sæ   e Zd ZddddœZdZdZd4dd„Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zd5dd„Zd6dd„Zdd„ Zd7dd„Zdd„ Zd8dd„Zdd„ Zd d!„ Zd9d"d#„Zd:d$d%„Zd&Zd'Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ ZdS );ÚRefactoringToolF)Úprint_functionÚexec_functionÚwrite_unchanged_filesZFixr   Nc                 C   sJ  || _ |pg | _| j ¡ | _|d ur0| j |¡ tj ¡ | _| jd rR| jj	d= n| jd rf| jj	d= | j 
d¡| _g | _t d¡| _g | _d| _tj| jtj| jd| _|  ¡ \| _| _g | _t ¡ | _g | _g | _t| j| jƒD ]H}|j rü| j !|¡ qä|| jv r| j "|¡ qä|| jv rä| j "|¡ qät#| jƒ| _$t#| jƒ| _%d S )	NrZ   Úprintr[   Úexecr\   rY   F)ÚconvertÚlogger)&ÚfixersÚexplicitÚ_default_optionsÚcopyÚoptionsr!   r	   r,   ÚgrammarÚkeywordsÚgetr\   ÚerrorsÚloggingÚ	getLoggerr`   Ú	fixer_logÚwroter   ZDriverr   r_   Ú
get_fixersÚ	pre_orderÚ
post_orderÚfilesÚbmZBottomMatcherÚBMZbmi_pre_orderZbmi_post_orderr   ZBM_compatibleZ	add_fixerr   r2   Úbmi_pre_order_headsÚbmi_post_order_heads)ÚselfZfixer_namesre   rb   r1   r   r   r   Ú__init__¤   sB    



þ

zRefactoringTool.__init__c              	   C   sV  g }g }| j D ]}t|i i dgƒ}| dd¡d }| | j¡rR|t| jƒd … }| d¡}| jd dd„ |D ƒ¡ }zt	||ƒ}W n$ t
y¨   td	||f ƒd ‚Y n0 || j| jƒ}	|	jrà| jd
urà|| jvrà|  d|¡ q|  d|¡ |	jdkr| |	¡ q|	jdkr| |	¡ qtd|	j ƒ‚qt d¡}
|j|
d |j|
d ||fS )Nr   r4   r   éÿÿÿÿÚ_Ú c                 S   s   g | ]}|  ¡ ‘qS r   )Útitle)r5   r%   r   r   r   r8   ë   ó    z.RefactoringTool.get_fixers.<locals>.<listcomp>zCan't find %s.%sTzSkipping optional fixer: %szAdding transformation: %sÚpreZpostzIllegal fixer order: %rZ	run_order©Úkey)ra   r   Úrsplitr   ÚFILE_PREFIXÚlenÚsplitÚCLASS_PREFIXÚjoinÚgetattrÚAttributeErrorrX   re   rl   rb   Úlog_messageÚ	log_debugÚorderr   ÚoperatorÚ
attrgetterÚsort)rv   Zpre_order_fixersZpost_order_fixersZfix_mod_pathÚmodr6   ÚpartsÚ
class_nameZ	fix_classr1   Zkey_funcr   r   r   rn   Û   s:    
ÿ
zRefactoringTool.get_fixersc                  O   s   ‚ d S r'   r   )rv   ÚmsgÚargsÚkwdsr   r   r   Ú	log_error  s    zRefactoringTool.log_errorc                 G   s   |r|| }| j  |¡ d S r'   )r`   Úinfo©rv   r‘   r’   r   r   r   rˆ     s    zRefactoringTool.log_messagec                 G   s   |r|| }| j  |¡ d S r'   )r`   Údebugr–   r   r   r   r‰     s    zRefactoringTool.log_debugc                 C   s   d S r'   r   )rv   Úold_textÚnew_textÚfilenameÚequalr   r   r   Úprint_output  s    zRefactoringTool.print_outputc                 C   s8   |D ].}t j |¡r$|  |||¡ q|  |||¡ qd S r'   )ÚosÚpathÚisdirÚrefactor_dirÚrefactor_file)rv   ÚitemsÚwriteÚdoctests_onlyZdir_or_filer   r   r   Úrefactor  s    zRefactoringTool.refactorc           
      C   sš   t jd }t  |¡D ]€\}}}|  d|¡ | ¡  | ¡  |D ]>}| d¡s>t j |¡d |kr>t j ||¡}	|  	|	||¡ q>dd„ |D ƒ|d d …< qd S )NÚpyzDescending into %sr4   r   c                 S   s   g | ]}|  d ¡s|‘qS r3   )r   )r5   Zdnr   r   r   r8   2  r|   z0RefactoringTool.refactor_dir.<locals>.<listcomp>)
r   ÚextsepÚwalkr‰   r   r   rž   Úsplitextr…   r¡   )
rv   Zdir_namer£   r¤   Zpy_extÚdirpathÚdirnamesÚ	filenamesr   Úfullnamer   r   r   r       s    

ÿzRefactoringTool.refactor_dirc              
   C   s®   zt |dƒ}W n4 tyB } z|  d||¡ W Y d }~dS d }~0 0 zt |j¡d }W | ¡  n
| ¡  0 tj |d|dd}| ¡ |fW  d   ƒ S 1 s 0    Y  d S )NÚrbzCan't open %s: %s)NNr   r$   rz   ©ÚencodingÚnewline)	ÚopenÚOSErrorr”   r   Údetect_encodingrH   ÚcloserF   Úread)rv   rš   ÚfÚerrr°   r   r   r   Ú_read_python_source4  s    z#RefactoringTool._read_python_sourcec                 C   sº   |   |¡\}}|d u rd S |d7 }|rn|  d|¡ |  ||¡}| jsL||kr`|  |||||¡ q¶|  d|¡ nH|  ||¡}| jsŠ|rª|jrª| jt|ƒd d… |||d n|  d|¡ d S )NÚ
zRefactoring doctests in %szNo doctest changes in %srx   )r£   r°   zNo changes in %s)r¹   r‰   Úrefactor_docstringr\   Úprocessed_fileÚrefactor_stringÚwas_changedÚstr)rv   rš   r£   r¤   Úinputr°   ÚoutputÚtreer   r   r   r¡   D  s     ÿzRefactoringTool.refactor_filec              
   C   s°   t |ƒ}d|v rtj| j_zfz| j |¡}W nF tyr } z.|  d||jj	|¡ W Y d }~W | j| j_d S d }~0 0 W | j| j_n| j| j_0 ||_
|  d|¡ |  ||¡ |S )NrZ   zCan't parse %s: %s: %szRefactoring %s)rW   r	   Z!python_grammar_no_print_statementr   rf   Zparse_stringr"   r”   Ú	__class__r   Úfuture_featuresr‰   Úrefactor_tree)rv   Údatar   rT   rÂ   r¸   r   r   r   r½   [  s"    

ÿ
þzRefactoringTool.refactor_stringc                 C   sŒ   t j ¡ }|rN|  d¡ |  |d¡}| js2||krB|  |d|¡ qˆ|  d¡ n:|  |d¡}| jsj|r~|jr~|  t	|ƒd|¡ n
|  d¡ d S )NzRefactoring doctests in stdinz<stdin>zNo doctest changes in stdinzNo changes in stdin)
ÚsysÚstdinr¶   r‰   r»   r\   r¼   r½   r¾   r¿   )rv   r¤   rÀ   rÁ   rÂ   r   r   r   Úrefactor_stdinv  s    

zRefactoringTool.refactor_stdinc           
   
   C   sÚ  t | j| jƒD ]}| ||¡ q|  | j| ¡ ¡ |  | j| ¡ ¡ | j | 	¡ ¡}t
| ¡ ƒr²| jjD ]B}||v rj|| rj|| jtjjdd |jr°|| jtjjd t|| ƒD ]ð}||| v rÚ||  |¡ zt|ƒ W n t yþ   Y q¼Y n0 |jr||jv rq¼| |¡}|r¼| ||¡}|d ur¼| |¡ | ¡ D ] }|js\g |_|j |¡ qJ| j | 	¡ ¡}|D ]*}	|	|vr–g ||	< ||	  ||	 ¡ q€q¼qjqTt | j| jƒD ]}| ||¡ qÀ|jS )NT)r   Úreverser~   )r   ro   rp   Z
start_treeÚtraverse_byrt   ru   rs   ÚrunZleavesÚanyr-   ra   r   r   ZBaseÚdepthZkeep_line_orderZ
get_linenor*   Úremover   Ú
ValueErrorZfixers_appliedÚmatchÚ	transformÚreplacer   r/   Zfinish_treer¾   )
rv   rÂ   r   r1   Z	match_setÚnodeÚresultsÚnewZnew_matchesZfxrr   r   r   rÅ   †  sJ    



zRefactoringTool.refactor_treec                 C   sV   |sd S |D ]D}||j  D ]4}| |¡}|r| ||¡}|d ur| |¡ |}qqd S r'   )r   rÑ   rÒ   rÓ   )rv   ra   Z	traversalrÔ   r1   rÕ   rÖ   r   r   r   rË   Õ  s    

zRefactoringTool.traverse_byc                 C   s†   | j  |¡ |d u r.|  |¡d }|d u r.d S ||k}|  ||||¡ |r`|  d|¡ | js`d S |rv|  ||||¡ n|  d|¡ d S )Nr   zNo changes to %szNot writing changes to %s)rq   r   r¹   rœ   r‰   r\   Ú
write_file)rv   r™   rš   r˜   r£   r°   r›   r   r   r   r¼   ì  s    zRefactoringTool.processed_filec                 C   sÈ   zt j|d|dd}W n4 tyJ } z|  d||¡ W Y d }~d S d }~0 0 |R z| |¡ W n2 ty’ } z|  d||¡ W Y d }~n
d }~0 0 W d   ƒ n1 s¨0    Y  |  d|¡ d| _d S )NÚwrz   r¯   zCan't create %s: %szCan't write %s: %szWrote changes to %sT)rF   r²   r³   r”   r£   r‰   rm   )rv   r™   rš   r˜   r°   Úfpr¸   r   r   r   r×     s    BzRefactoringTool.write_filez>>> z... c           
   	   C   s  g }d }d }d }d}|j ddD ]È}|d7 }| ¡  | j¡r~|d urZ| |  ||||¡¡ |}|g}| | j¡}	|d |	… }q |d ur¸| || j ¡s¬||| j ¡  d kr¸| 	|¡ q |d urÖ| |  ||||¡¡ d }d }| 	|¡ q |d ur
| |  ||||¡¡ d 
|¡S )Nr   T©Úkeependsr   rº   rz   )Ú
splitlinesÚlstripr   ÚPS1r/   Úrefactor_doctestÚfindÚPS2Úrstripr   r…   )
rv   rÀ   rš   ÚresultÚblockZblock_linenoÚindentÚlinenoÚlineÚir   r   r   r»     sD    ÿÿþÿ
ÿz"RefactoringTool.refactor_docstringc           
   
      s  zˆ  ||ˆ ¡}W nh tyz } zPˆj tj¡rL|D ]}ˆ d| d¡¡ q4ˆ d|||j	j
|¡ |W  Y d }~S d }~0 0 ˆ ||¡rt|ƒjdd}|d |d … ||d d …  }	}|d  d¡sÚ|d  d7  < ˆ ˆj | d¡ g}|r|‡ ‡fd	d
„|D ƒ7 }|S )Nz
Source: %srº   z+Can't parse docstring in %s line %s: %s: %sTrÚ   r   rx   r   c                    s   g | ]}ˆ ˆj  | ‘qS r   )rá   )r5   rç   ©rå   rv   r   r   r8   ^  r|   z4RefactoringTool.refactor_doctest.<locals>.<listcomp>)Úparse_blockr"   r`   ÚisEnabledForrj   ÚDEBUGr‰   râ   r”   rÃ   r   rÅ   r¿   rÜ   ÚendswithrÞ   Úpop)
rv   rä   ræ   rå   rš   rÂ   r¸   rç   rÖ   Zclippedr   ré   r   rß   D  s&    ÿ"z RefactoringTool.refactor_doctestc                 C   sÌ   | j rd}nd}| js$|  d|¡ n"|  d|¡ | jD ]}|  |¡ q6| jrl|  d¡ | jD ]}|  |¡ q\| jrÈt| jƒdkrŒ|  d¡ n|  dt| jƒ¡ | jD ]"\}}}| j|g|¢R i |¤Ž q¤d S )	NÚwerez
need to bezNo files %s modified.zFiles that %s modified:z$Warnings/messages while refactoring:r   zThere was 1 error:zThere were %d errors:)rm   rq   rˆ   rl   ri   r‚   )rv   rï   ÚfileÚmessager‘   r’   r“   r   r   r   Ú	summarizea  s$    


zRefactoringTool.summarizec                 C   s"   | j  |  |||¡¡}tƒ |_|S r'   )r   Zparse_tokensÚ	wrap_toksrI   rÄ   )rv   rä   ræ   rå   rÂ   r   r   r   rê   x  s    zRefactoringTool.parse_blockc                 c   sd   t  |  ||¡j¡}|D ]F\}}\}}\}	}
}||d 7 }|	|d 7 }	||||f|	|
f|fV  qd S )Nr   )r   rE   Ú	gen_linesÚ__next__)rv   rä   ræ   rå   r.   r   rV   Zline0Zcol0Zline1Zcol1Z	line_textr   r   r   ró   ‚  s
    zRefactoringTool.wrap_toksc                 c   sx   || j  }|| j }|}|D ]N}| |¡r>|t|ƒd … V  n(|| ¡ d krVdV  ntd||f ƒ‚|}qdV  qld S )Nrº   zline=%r, prefix=%rrz   )rÞ   rá   r   r‚   râ   ÚAssertionError)rv   rä   rå   Úprefix1Zprefix2Úprefixrç   r   r   r   rô     s    


zRefactoringTool.gen_lines)NN)FF)FF)FF)F)NFN)N)r   r   r   rc   r„   r   rw   rn   r”   rˆ   r‰   rœ   r¥   r    r¹   r¡   r½   rÉ   rÅ   rË   r¼   r×   rÞ   rá   r»   rß   rò   rê   ró   rô   r   r   r   r   rY   ›   s@   þ
7(
	


O  ÿ

+
rY   c                   @   s   e Zd ZdS )ÚMultiprocessingUnsupportedNr   r   r   r   r   rù   ¤  s   rù   c                       sB   e Zd Z‡ fdd„Zd‡ fdd„	Z‡ fdd„Z‡ fd	d
„Z‡  ZS )ÚMultiprocessRefactoringToolc                    s&   t t| ƒj|i |¤Ž d | _d | _d S r'   )Úsuperrú   rw   ÚqueueÚoutput_lock©rv   r’   Úkwargs©rÃ   r   r   rw   ª  s    z$MultiprocessRefactoringTool.__init__Fr   c              
      s>  |dkrt tˆƒ |||¡S zdd l‰ W n ty>   t‚Y n0 ˆjd urRtdƒ‚ˆ  ¡ ˆ_ˆ  	¡ ˆ_
‡ ‡fdd„t|ƒD ƒ}zn|D ]}| ¡  q„t tˆƒ |||¡ W ˆj ¡  t|ƒD ]}ˆj d ¡ qº|D ]}| ¡ rÐ| ¡  qÐd ˆ_nLˆj ¡  t|ƒD ]}ˆj d ¡ q |D ]}| ¡ r| ¡  qd ˆ_0 d S )Nr   r   z already doing multiple processesc                    s   g | ]}ˆ j ˆjd ‘qS ))Útarget)ÚProcessÚ_child)r5   rè   ©Úmultiprocessingrv   r   r   r8   ¼  s   ÿz8MultiprocessRefactoringTool.refactor.<locals>.<listcomp>)rû   rú   r¥   r  ÚImportErrorrù   rü   ÚRuntimeErrorÚJoinableQueueÚLockrý   ÚrangeÚstartr…   ÚputÚis_alive)rv   r¢   r£   r¤   Znum_processesÚ	processesr%   rè   r   r  r   r¥   ¯  sF    
ÿ



ÿ
ÿ

ú

z$MultiprocessRefactoringTool.refactorc                    s\   | j  ¡ }|d urX|\}}z$tt| ƒj|i |¤Ž W | j  ¡  n| j  ¡  0 | j  ¡ }q
d S r'   )rü   rh   rû   rú   r¡   Ú	task_done)rv   Ztaskr’   rÿ   r   r   r   r  Ì  s    

ÿÿz"MultiprocessRefactoringTool._childc                    s6   | j d ur| j  ||f¡ ntt| ƒj|i |¤ŽS d S r'   )rü   r  rû   rú   r¡   rþ   r   r   r   r¡   ×  s    

ÿÿz)MultiprocessRefactoringTool.refactor_file)FFr   )r   r   r   rw   r¥   r  r¡   Ú__classcell__r   r   r   r   rú   ¨  s     ÿrú   )T)"Ú
__author__rF   r   r   rÇ   rj   r‹   r(   Ú	itertoolsr   Zpgen2r   r   r   Z
fixer_utilr   rz   r   r	   r
   rr   r   r"   r   r   r2   r9   r;   rW   rX   ÚobjectrY   rù   rú   r   r   r   r   Ú<module>   s6   
(    