o
     JAfsk  ã                   @   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__ÚpkgutilZiter_modulesÚ__path__Ú
startswithÚappend)Z	fixer_pkgZremove_prefixZpkgZ	fix_namesÚfinderÚnameZispkg© r   ú'/usr/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r2zt|jƒ}W n ty$   | |¡ Y q
w |D ]	}||  |¡ q'q
|jd ur@||j  |¡ q
| |¡ q
tt	j
j ¡ t	j
jƒD ]	}||  |¡ qQt|ƒ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*   
ÿÿ
ÿr4   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   r9   r   r9   r   Úget_fixers_from_packaged   s   
ÿr;   c                 C   s   | S r)   r   )Úobjr   r   r   Ú	_identityk   s   r=   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|r2ncd}n_|tjkr“|dkr“|ƒ \}}|tjksL|dkrMnR|ƒ \}}|tjks[|dkr\nH|ƒ \}}|tjkro|dkro|ƒ \}}|tjkr’| |¡ |ƒ \}}|tjks‡|d	krˆn
|ƒ \}}|tjkstnn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_docstringrB   ÚignoreÚfeaturesÚtpÚvaluer   r@   r   Ú_detect_future_featureso   s\   










û€çýïòþþrY   c                   @   r   )Ú
FixerErrorNr   r   r   r   r   rZ   —   r   rZ   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\   Úprintr]   Úexecr^   r[   F)ÚconvertÚlogger)&ÚfixersÚexplicitÚ_default_optionsÚcopyÚoptionsr#   r	   r.   ÚgrammarÚkeywordsÚgetr^   ÚerrorsÚloggingÚ	getLoggerrb   Ú	fixer_logÚwroter   ZDriverr   ra   Ú
get_fixersÚ	pre_orderÚ
post_orderÚfilesÚbmZBottomMatcherÚBMZbmi_pre_orderZbmi_post_orderr   ZBM_compatibleZ	add_fixerr   r4   Úbmi_pre_order_headsÚbmi_post_order_heads)ÚselfZfixer_namesrg   rd   r3   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   r6   r   éÿÿÿÿÚ_Ú c                 S   s   g | ]}|  ¡ ‘qS r   )Útitle)r7   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)rc   r   Úrsplitr   ÚFILE_PREFIXÚlenÚsplitÚCLASS_PREFIXÚjoinÚgetattrÚAttributeErrorrZ   rg   rn   rd   Úlog_messageÚ	log_debugÚorderr   ÚoperatorÚ
attrgetterÚsort)rx   Zpre_order_fixersZpost_order_fixersZfix_mod_pathÚmodr8   ÚpartsÚ
class_nameZ	fix_classr3   Zkey_funcr   r   r   rp   Û   s<   

ÿ



zRefactoringTool.get_fixersc                  O   s   	 ‚ r)   r   )rx   ÚmsgÚargsÚkwdsr   r   r   Ú	log_error  s   zRefactoringTool.log_errorc                 G   s   	 |r|| }| j  |¡ d S r)   )rb   Úinfo©rx   r’   r“   r   r   r   r‰     s   zRefactoringTool.log_messagec                 G   s   |r|| }| j  |¡ d S r)   )rb   Údebugr—   r   r   r   rŠ     s   zRefactoringTool.log_debugc                 C   s   	 d S r)   r   )rx   Ú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)rx   Ú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 %sr6   r   c                 S   s   g | ]	}|  d ¡s|‘qS r5   )r   )r7   Zdnr   r   r   r:   2  ó    z0RefactoringTool.refactor_dir.<locals>.<listcomp>)
rž   ÚextsepÚwalkrŠ   rŽ   r   rŸ   Úsplitextr†   r¢   )
rx   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_encodingrJ   ÚcloserH   Úread)rx   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 %srz   )r¤   r³   zNo changes in %s)r¼   rŠ   Úrefactor_docstringr^   Úprocessed_fileÚrefactor_stringÚwas_changedÚstr)rx   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)rY   r	   Z!python_grammar_no_print_statementr   rh   Zparse_stringr$   r•   Ú	__class__r   Úfuture_featuresrŠ   Úrefactor_tree)rx   Údatar   rV   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¾   r^   r¿   rÀ   rÁ   rÂ   )rx   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   rq   rr   Z
start_treeÚtraverse_byrv   rw   ru   ÚrunZleavesÚanyr/   rc   rŽ   r   ZBaseÚdepthZkeep_line_orderZ
get_linenor,   Úremover   Ú
ValueErrorZfixers_appliedÚmatchÚ	transformÚreplacer   r1   Zfinish_treerÁ   )
rx   rÅ   r   r3   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Ö   )rx   rc   Z	traversalr×   r3   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)rs   r   r¼   r   rŠ   r^   Ú
write_file)rx   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)rH   rµ   r¶   r•   r¤   rŠ   ro   )rx   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   ÚPS1r1   Úrefactor_doctestÚfindÚPS2Úrstripr   r†   )
rx   rÃ   r›   ÚresultÚblockZblock_linenoÚindentÚlinenoÚlineÚir   r   r   r¾     sD   ÿÿÿÿ
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   rz   r   c                    s   g | ]	}ˆ ˆj  | ‘qS r   )rä   )r7   rê   ©rè   rx   r   r   r:   ^  r¨   z4RefactoringTool.refactor_doctest.<locals>.<listcomp>)Úparse_blockr$   rb   ÚisEnabledForrl   ÚDEBUGrŠ   rå   r•   rÆ   r   rÈ   rÂ   rß   Úendswithrá   Úpop)
rx   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:)ro   rs   r‰   rn   rk   rƒ   )rx   rò   ÚfileÚmessager’   r“   r”   r   r   r   Ú	summarizea  s(   


úzRefactoringTool.summarizec                 C   s$   	 | j  |  |||¡¡}tƒ |_|S r)   )r   Zparse_tokensÚ	wrap_toksrK   rÇ   )rx   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   rG   Ú	gen_linesÚ__next__)rx   rç   ré   rè   r0   r    rX   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)rx   rç   rè   Úprefix1Zprefix2Úprefixrê   r   r   r   r÷     s   €


ÿzRefactoringTool.gen_linesr±   )FF)F)NFNr)   )r   r   r   re   r…   r‚   ry   rp   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ý   ry   ÚqueueÚoutput_lock©rx   r“   Úkwargs©rÆ   r   r   ry   ª  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)r7   rë   ©Úmultiprocessingrx   r   r   r:   ¼  s    ÿz8MultiprocessRefactoringTool.refactor.<locals>.<listcomp>)rþ   rý   r¦   r  ÚImportErrorrü   rÿ   ÚRuntimeErrorÚJoinableQueueÚLockr   ÚrangeÚstartr†   ÚputÚis_alive)rx   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ÿ   rj   rþ   rý   r¢   Ú	task_done)rx   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   ry   r¦   r  r¢   Ú__classcell__r   r   r  r   rý   ¨  s    ÿrý   )T)"Ú
__author__rH   rž   r   rÊ   rl   rŒ   r*   Ú	itertoolsr   Zpgen2r   r   r   Z
fixer_utilr   r|   r   r	   r
   rt   r   r$   r   r!   r4   r;   r=   rY   rZ   Úobjectr[   rü   rý   r   r   r   r   Ú<module>   s:   
(    