o
    ¯ó®gsk  ã                   @   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   sV   	 t | g g dgƒ}g }t |j¡D ]\}}}| d¡r(|r#|dd … }| |¡ q|S )NÚ*Úfix_é   )Ú
__import__ÚpkgutilÚiter_modulesÚ__path__Ú
startswithÚappend)Z	fixer_pkgZremove_prefixÚpkgZ	fix_namesÚfinderÚnameÚispkg© r   úF/Users/admin/.pyenv/versions/3.10.0/lib/python3.10/lib2to3/refactor.pyÚget_all_fix_names   s   

€r   c                   @   ó   e Zd ZdS )Ú
_EveryNodeN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   +   ó    r   c                 C   s   	 t | tjtjfƒr| jd u rt‚| jhS t | tjƒr%| jr#t| jƒS t‚t | tj	ƒrBt
ƒ }| jD ]}|D ]	}| t|ƒ¡ q5q1|S td|  ƒ‚)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 ]:}|jr1zt|jƒ}W n ty$   | |¡ Y q
w |D ]}||  |¡ q'|jd ur?||j  |¡ q
| |¡ q
tt	j
j ¡ t	j
jƒD ]	}||  |¡ qPt|ƒ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*   
ÿ

€ÿr7   c                    s   	 ‡ fdd„t ˆ dƒD ƒS )Nc                    s   g | ]}ˆ d  | ‘qS ©Ú.r   )Ú.0Úfix_name©Úpkg_namer   r   Ú
<listcomp>h   s    ÿz+get_fixers_from_package.<locals>.<listcomp>F)r   r<   r   r<   r   Úget_fixers_from_packaged   s   
ÿr?   c                 C   s   | S r,   r   )Úobjr   r   r   Ú	_identityk   s   rA   c                    sj  d}t  t | ¡j¡‰ ‡ fdd„}ttjt jtj	hƒ}t
ƒ }zŠ	 |ƒ \}}||v r*q|tjkr5|r2q•d}n_|tjkr“|dkr“|ƒ \}}|tjksL|dkrMqŸ|ƒ \}}|tjks[|dkr\q¤|ƒ \}}|tjkro|dkro|ƒ \}}|tjkr’| |¡ |ƒ \}}|tjks‡|d	krˆq”|ƒ \}}|tjkstnqšq W t|ƒS W t|ƒS W t|ƒS W t|ƒS  ty´   Y t|ƒS w )
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_docstringrF   ÚignoreÚfeaturesÚtpÚvaluer   rD   r   Ú_detect_future_featureso   s\   










û€çýïòþþr]   c                   @   r   )Ú
FixerErrorNr   r   r   r   r   r^   —   r!   r^   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d5dd„Zdd„ Zd5dd„Zdd„ Zd6dd„Zdd„ Zd d!„ Z		d7d"d#„Zd8d$d%„Zd&Zd'Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ ZdS )9ÚRefactoringToolF)Úprint_functionÚexec_functionÚwrite_unchanged_filesZFixr   Nc                 C   sJ  	 || _ |pg | _| j ¡ | _|d ur| j |¡ tj ¡ | _| jd r*| jj	d= n
| jd r4| 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 ]#}|j r| j !|¡ qs|| jv r‹| j "|¡ qs|| jv r–| j "|¡ qst#| jƒ| _$t#| jƒ| _%d S )	Nr`   Úprintra   Úexecrb   r_   F)ÚconvertÚlogger)&ÚfixersÚexplicitÚ_default_optionsÚcopyÚoptionsr&   r	   r1   ÚgrammarÚkeywordsÚgetrb   ÚerrorsÚloggingÚ	getLoggerrf   Ú	fixer_logÚwroter   ZDriverr   re   Ú
get_fixersÚ	pre_orderÚ
post_orderÚfilesÚbmZBottomMatcherÚBMZbmi_pre_orderZbmi_post_orderr   ZBM_compatibleZ	add_fixerr   r7   Úbmi_pre_order_headsÚbmi_post_order_heads)ÚselfZfixer_namesrk   rh   r6   r   r   r   Ú__init__¤   sF   



þ


€zRefactoringTool.__init__c              	   C   sL  	 g }g }| j D ]ˆ}t|i i dgƒ}| dd¡d }| | j¡r)|t| jƒd … }| d¡}| jd dd„ |D ƒ¡ }zt	||ƒ}W n t
yR   td	||f ƒd ‚w || j| jƒ}	|	jrn| jd
urn|| jvrn|  d|¡ q|  d|¡ |	jdkr| |	¡ q|	jdkrŠ| |	¡ qtd|	j ƒ‚t d¡}
|j|
d |j|
d ||fS )Nr   r9   r   éÿÿÿÿÚ_Ú c                 S   s   g | ]}|  ¡ ‘qS r   )Útitle)r:   r*   r   r   r   r>   ë   s    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)rg   r   Úrsplitr   ÚFILE_PREFIXÚlenÚsplitÚCLASS_PREFIXÚjoinÚgetattrÚAttributeErrorr^   rk   rr   rh   Úlog_messageÚ	log_debugÚorderr   ÚoperatorÚ
attrgetterÚsort)r|   Zpre_order_fixersZpost_order_fixersZfix_mod_pathÚmodr;   ÚpartsÚ
class_nameZ	fix_classr6   Zkey_funcr   r   r   rt   Û   s>   

ÿÿ


zRefactoringTool.get_fixersc                  O   s   	 ‚ r,   r   )r|   ÚmsgÚargsÚkwdsr   r   r   Ú	log_error  s   zRefactoringTool.log_errorc                 G   s   	 |r|| }| j  |¡ d S r,   )rf   Úinfo©r|   r–   r—   r   r   r   r     s   zRefactoringTool.log_messagec                 G   s   |r|| }| j  |¡ d S r,   )rf   Údebugr›   r   r   r   rŽ     s   zRefactoringTool.log_debugc                 C   s   	 d S r,   r   )r|   Úold_textÚnew_textÚfilenameÚequalr   r   r   Úprint_output  s   zRefactoringTool.print_outputc                 C   s:   	 |D ]}t j |¡r|  |||¡ q|  |||¡ qd S r,   )ÚosÚpathÚisdirÚrefactor_dirÚrefactor_file)r|   Ú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 %sr9   r   c                 S   s   g | ]	}|  d ¡s|‘qS r8   )r   )r:   Zdnr   r   r   r>   2  ó    z0RefactoringTool.refactor_dir.<locals>.<listcomp>)
r¢   ÚextsepÚwalkrŽ   r’   r   r£   ÚsplitextrŠ   r¦   )
r|   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 n ty" } z|  d||¡ W Y d }~dS d }~ww zt |j¡d }W | ¡  n| ¡  w tj |d|dd}| ¡ |fW  d   ƒ S 1 sQw   Y  d S )NÚrbzCan't open %s: %s©NNr   r)   r€   ©ÚencodingÚnewline)	ÚopenÚOSErrorr™   r   Údetect_encodingrN   ÚcloserL   Úread)r|   rŸ   ÚfÚerrr·   r   r   r   Ú_read_python_source4  s   €þ
$ÿz#RefactoringTool._read_python_sourcec                 C   sÂ   	 |   |¡\}}|d u rd S |d7 }|r:|  d|¡ |  ||¡}| js'||kr2|  |||||¡ d S |  d|¡ d S |  ||¡}| jsH|rY|jrY| jt|ƒd d… |||d d S |  d|¡ d S )NÚ
zRefactoring doctests in %szNo doctest changes in %sr~   )r¨   r·   zNo changes in %s)rÀ   rŽ   Úrefactor_docstringrb   Úprocessed_fileÚrefactor_stringÚwas_changedÚstr)r|   rŸ   r¨   r©   Úinputr·   ÚoutputÚtreer   r   r   r¦   D  s"   
ÿzRefactoringTool.refactor_filec              
   C   s²   	 t |ƒ}d|v rtj| j_z3z| j |¡}W n# ty: } z|  d||jj	|¡ W Y d }~W | j| j_d S d }~ww W | j| j_n| j| j_w ||_
|  d|¡ |  ||¡ |S )Nr`   zCan't parse %s: %s: %szRefactoring %s)r]   r	   Z!python_grammar_no_print_statementr   rl   Zparse_stringr'   r™   Ú	__class__r   Úfuture_featuresrŽ   Úrefactor_tree)r|   Údatar   rZ   rÉ   r¿   r   r   r   rÄ   [  s(   


ÿ€ûÿzRefactoringTool.refactor_stringc                 C   s’   t j ¡ }|r)|  d¡ |  |d¡}| js||kr"|  |d|¡ d S |  d¡ d S |  |d¡}| js7|rB|jrB|  t	|ƒd|¡ d S |  d¡ d S )NzRefactoring doctests in stdinz<stdin>zNo doctest changes in stdinzNo changes in stdin)
ÚsysÚstdinr½   rŽ   rÂ   rb   rÃ   rÄ   rÅ   rÆ   )r|   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 ]˜}||v rÍ|| rÍ|| jtjjdd |jrW|| jtjjd t|| ƒD ]o}||| v rl||  |¡ zt|ƒ W n	 ty{   Y q]w |jr…||jv r…q]| |¡}|rÌ| ||¡}|d urÌ| |¡ | ¡ D ]}|js§g |_|j |¡ qŸ| j | 	¡ ¡}|D ]}	|	|vrÂg ||	< ||	  ||	 ¡ q¸q]q5t
| ¡ ƒs1t | j| jƒD ]}| ||¡ qÛ|jS )NT)r„   Úreverserƒ   )r   ru   rv   Z
start_treeÚtraverse_byrz   r{   ry   ÚrunZleavesÚanyr2   rg   r’   r   ZBaseZdepthZkeep_line_orderZ
get_linenor/   Úremover   Ú
ValueErrorZfixers_appliedÚmatchÚ	transformÚreplacer   r4   Zfinish_treerÅ   )
r|   rÉ   r   r6   Z	match_setÚnodeÚresultsÚnewZnew_matchesZfxrr   r   r   rÌ   †  sR   ý

€Ñ1zRefactoringTool.refactor_treec                 C   sX   	 |sd S |D ]"}||j  D ]}| |¡}|r(| ||¡}|d ur(| |¡ |}qqd S r,   )r#   r×   rØ   rÙ   )r|   rg   Z	traversalrÚ   r6   rÛ   rÜ   r   r   r   rÒ   Õ  s   

€úÿzRefactoringTool.traverse_byc                 C   sŠ   	 | j  |¡ |d u r|  |¡d }|d u rd S ||k}|  ||||¡ |r1|  d|¡ | js1d S |r=|  ||||¡ d S |  d|¡ d S )Nr   zNo changes to %szNot writing changes to %s)rw   r   rÀ   r¡   rŽ   rb   Ú
write_file)r|   rž   rŸ   r   r¨   r·   r    r   r   r   rÃ   ì  s   zRefactoringTool.processed_filec                 C   sÊ   	 zt j|d|dd}W n ty& } z|  d||¡ W Y d }~d S d }~ww |) z| |¡ W n tyJ } z|  d||¡ W Y d }~nd }~ww W d   ƒ n1 sUw   Y  |  d|¡ d| _d S )NÚwr€   r¶   zCan't create %s: %szCan't write %s: %szWrote changes to %sT)rL   r¹   rº   r™   r¨   rŽ   rs   )r|   rž   rŸ   r   r·   Úfpr¿   r   r   r   rÝ     s&   €þ€ÿ€ý
zRefactoringTool.write_filez>>> z... c           
   	   C   s  	 g }d }d }d }d}|j ddD ]d}|d7 }| ¡  | j¡r@|d ur.| |  ||||¡¡ |}|g}| | j¡}	|d |	… }q|d ur]| || j ¡sW||| j ¡  d kr]| 	|¡ q|d url| |  ||||¡¡ d }d }| 	|¡ q|d ur…| |  ||||¡¡ d 
|¡S )Nr   T©Úkeependsr   rÁ   r€   )Ú
splitlinesÚlstripr   ÚPS1r4   Úrefactor_doctestÚfindÚPS2Úrstripr   rŠ   )
r|   rÇ   rŸ   ÚresultÚblockZblock_linenoÚindentÚlinenoÚlineÚir   r   r   rÂ     sF   ÿÿþÿÿ
z"RefactoringTool.refactor_docstringc           
   
      s  	 z	ˆ  ||ˆ ¡}W n4 ty> } z(ˆj tj¡r'|D ]}ˆ d| d¡¡ qˆ d|||j	j
|¡ |W  Y d }~S d }~ww ˆ ||¡r†t|ƒjdd}|d |d … ||d d … }	}|d  d¡sm|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   r~   r   c                    s   g | ]	}ˆ ˆj  | ‘qS r   )rç   )r:   rí   ©rë   r|   r   r   r>   ^  r¬   z4RefactoringTool.refactor_doctest.<locals>.<listcomp>)Úparse_blockr'   rf   ÚisEnabledForrp   ÚDEBUGrŽ   rè   r™   rÊ   r   rÌ   rÆ   râ   Úendswithrä   Úpop)
r|   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 ]}|  |¡ q| jr6|  d¡ | jD ]}|  |¡ q.| jrdt| jƒdkrF|  d¡ n	|  dt| jƒ¡ | jD ]\}}}| j|g|¢R i |¤Ž qRd S 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:)rs   rw   r   rr   ro   r‡   )r|   rõ   ÚfileÚmessager–   r—   r˜   r   r   r   Ú	summarizea  s(   


úzRefactoringTool.summarizec                 C   s$   	 | j  |  |||¡¡}tƒ |_|S r,   )r   Zparse_tokensÚ	wrap_toksrO   rË   )r|   rê   rì   rë   rÉ   r   r   r   rð   x  s   zRefactoringTool.parse_blockc                 c   sh    	 t  |  ||¡j¡}|D ]#\}}\}}\}	}
}||d 7 }|	|d 7 }	||||f|	|
f|fV  qd S )Nr   )r   rK   Ú	gen_linesÚ__next__)r|   rê   rì   rë   r3   r#   r\   Zline0Zcol0Zline1Zcol1Z	line_textr   r   r   rù   ‚  s   €øzRefactoringTool.wrap_toksc                 c   sz    	 || j  }|| j }|}|D ]'}| |¡r!|t|ƒd … V  n|| ¡ d kr-dV  ntd||f ƒ‚|}q	 dV  q9)NrÁ   zline=%r, prefix=%rTr€   )rä   rç   r   r‡   rè   ÚAssertionError)r|   rê   rë   Úprefix1Zprefix2Úprefixrí   r   r   r   rú     s   €


ÿzRefactoringTool.gen_linesrµ   )FF)F)NFNr,   )r   r   r    ri   r‰   r†   r}   rt   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   r_   ›   sB    þ
7(

	

O
ÿ
+
r_   c                   @   r   )ÚMultiprocessingUnsupportedNr   r   r   r   r   rÿ   ¤  r!   rÿ   c                       sF   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   r}   ÚqueueÚoutput_lock©r|   r—   Úkwargs©rÊ   r   r   r}   ª  s   
z$MultiprocessRefactoringTool.__init__Fr   c              
      s2  |dkrt tˆƒ |||¡S zdd l‰ W n	 ty   t‚w ˆjd ur'tdƒ‚ˆ  ¡ ˆ_ˆ  	¡ ˆ_
‡ ‡fdd„t|ƒD ƒ}z8|D ]}| ¡  q@t tˆƒ |||¡ W ˆj ¡  t|ƒD ]}ˆj d ¡ q[|D ]
}| ¡ rp| ¡  qfd ˆ_d S ˆj ¡  t|ƒD ]}ˆj d ¡ q|D ]
}| ¡ r”| ¡  qŠd ˆ_w )Nr   r   z already doing multiple processesc                    s   g | ]	}ˆ j ˆjd ‘qS ))Útarget)ÚProcessÚ_child)r:   rî   ©Úmultiprocessingr|   r   r   r>   ¼  s    ÿz8MultiprocessRefactoringTool.refactor.<locals>.<listcomp>)r  r   rª   r  ÚImportErrorrÿ   r  ÚRuntimeErrorÚJoinableQueueÚLockr  ÚrangeÚstartrŠ   ÚputÚis_alive)r|   r§   r¨   r©   Znum_processesÚ	processesr*   rî   r  r
  r   rª   ¯  sL   
ÿÿ


ÿ
ÿ
€

ú€z$MultiprocessRefactoringTool.refactorc                    sf   | j  ¡ }|d ur1|\}}ztt| ƒj|i |¤Ž W | j  ¡  n| j  ¡  w | j  ¡ }|d us	d S d S r,   )r  rn   r  r   r¦   Ú	task_done)r|   Ztaskr—   r  r  r   r   r	  Ì  s   

ÿÿ
ùz"MultiprocessRefactoringTool._childc                    s4   | j d ur| j  ||f¡ d S tt| ƒj|i |¤ŽS r,   )r  r  r  r   r¦   r  r  r   r   r¦   ×  s   

ÿÿz)MultiprocessRefactoringTool.refactor_file)FFr   )r   r   r    r}   rª   r	  r¦   Ú__classcell__r   r   r  r   r   ¨  s    ÿr   )T)"Ú
__author__rL   r¢   r   rÎ   rp   r   r-   Ú	itertoolsr   Zpgen2r   r   r   Z
fixer_utilr   r€   r   r	   r
   rx   r   r'   r   r$   r7   r?   rA   r]   r^   Úobjectr_   rÿ   r   r   r   r   r   Ú<module>   s:   
(    