a
XC?hsk ã @ s d Z dZddlZddlZddlZddlZddlZddlZddlZddl m
Z
ddlmZm
Z
mZ ddlmZ ddlmZmZ dd lmZ d!dd„ZG d
d„ deƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZ G dd„ deƒZ!G dd „ d e ƒZ"dS )"zÛRefactoring framework.
Used as a main program, this can refactor any number of files and/or
recursively descend down directories. Imported as a module, this
provides infrastructure to write your own refactoring tool.
z#Guido van Rossum é N)Úchainé )ÚdriverÚtokenizeÚtoken)Ú find_root)ÚpytreeÚpygram)Úbtm_matcherTc C sT t | g g dgƒ}g }t |j¡D ].\}}}| d¡r |rD|dd… }| |¡ q |S )zEReturn a sorted list of all available fix names in the given package.Ú*Úfix_é N)Ú
__import__ÚpkgutilZiter_modulesÚ__path__Ú
startswithÚappend)Z fixer_pkgZ
remove_prefixZpkgZ fix_namesÚfinderÚnameZispkg© r ú5/opt/alt/python39/lib64/python3.9/lib2to3/refactor.pyÚget_all_fix_names s
r c @ s e Zd ZdS )Ú
_EveryNodeN©Ú__name__Ú
__module__Ú__qualname__r r r r r + s r c C s’ t | tjtjfƒr(| jdu r t‚| jhS t | tjƒrH| jrDt| jƒS t‚t | tj ƒr‚t
ƒ }| jD ]}|D ]}| t|ƒ¡ qhq`|S td| ƒ‚dS )zf Accepts a pytree Pattern Node and returns a set
of the pattern types which will match first. Nz$Oh no! I don't understand pattern %s)
Ú
isinstancer ZNodePatternZLeafPatternÚtyper ZNegatedPatternZcontentÚ_get_head_typesZWildcardPatternÚsetÚupdateÚ Exception)ZpatÚrÚpÚxr r r r / s
r c C s¼ t t¡}g }| D ]v}|jrbzt|jƒ}W n tyF | |¡ Y qˆ0 |D ]}|| |¡ qLq|jdur~||j |¡ q| |¡ qtt j
j ¡ t j
j
ƒD ]}|| |¡ q t|ƒS )z^ Accepts a list of fixers and returns a dictionary
of head node type --> fixer list. N)ÚcollectionsÚdefaultdictÚlistÚpatternr r r Z_accept_typer r Úpython_grammarZ
symbol2numberÚvaluesÚtokensÚextendÚdict)Z
fixer_listZ
head_nodesZeveryÚfixerZheadsZ node_typer r r Ú_get_headnode_dictK s$
ÿr0 c s ‡ fdd„t ˆ dƒD ƒS )zN
Return the fully qualified names for fixers in the package pkg_name.
c s g | ]}ˆ d | ‘qS ©Ú.r )Ú.0Úfix_name©Zpkg_namer r Ú
h s ÿz+get_fixers_from_package..F)r r5 r r5 r Úget_fixers_from_packaged s
ÿr7 c C s | S ©Nr )Úobjr r r Ú _identityk s r: c sV d}t t | ¡j¡‰ ‡ fdd„}ttjt jtj hƒ}t
ƒ }zü|ƒ \}}||v rTq>q>|tjkrl|rfq6d}q>|tjkr6|dkr6|ƒ \}}|tjksž|dkr¢q6|ƒ \}}|tjks¾|dkrÂq6|ƒ \}}|tj
krè|dkrè|ƒ \}}|tjkr4| |¡ |ƒ \}}|tj
ks.|d kr"q4|ƒ \}}qèq>q6q>W n tyL Y n0 t|ƒS )
NFc s t ˆ ƒ} | d | d fS )Nr r )Únext)Útok©Úgenr r Úadvancer s z(_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Úvaluer r= r Ú_detect_future_featureso sB
rV c @ s e Zd ZdZdS )Ú
FixerErrorzA fixer could not be loaded.N)r r r Ú__doc__r r r r rW — s rW c @ sæ e Zd ZddddœZdZdZd4dd„Zdd „ Zd
d„ Zdd
„ Z dd„ Z
dd„ Zd5dd„Zd6dd„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Ú
exec_functionÚwrite_unchanged_filesZFixr Nc C sJ || _ |pg | _| j ¡ | _|dur0| j |¡ tj ¡ | _| jd rR| jj d= n| jd rf| jj d= | j
d¡| _g | _t
d¡| _g | _d| _tj| jtj| jd | _| ¡ \| _| _g | _t ¡ | _g | _g | _t| j| jƒD ]H}|j rü| j !|¡ qä|| jv r| j "|¡ qä|| jv rä| j "|¡ qät#| jƒ| _$t#| jƒ| _%dS )
zÑInitializer.
Args:
fixer_names: a list of fixers to import
options: a dict with configuration.
explicit: a list of fixers to run even if they are explicit.
NrZ Úprintr[ Úexecr\ rY F)ÚconvertÚlogger)&ÚfixersÚexplicitÚ_default_optionsÚcopyÚoptionsr! r r* ÚgrammarÚkeywordsÚgetr\ ÚerrorsÚloggingZ getLoggerr` Ú fixer_logÚwroter ZDriverr r_ Ú
get_fixersÚ pre_orderÚ
post_orderÚfilesÚbmZ
BottomMatcherÚBMZ
bmi_pre_orderZbmi_post_orderr Z
BM_compatibleZ add_fixerr r0 Úbmi_pre_order_headsÚbmi_post_order_heads)ÚselfZfixer_namesre rb r/ r r r Ú__init__¤ sB
þ
zRefactoringTool.__init__c C sV g }g }| j D ]}t|i i dgƒ}| dd¡d }| | j¡rR|t| jƒd… }| d¡}| jd dd „ |D ƒ¡ }zt ||ƒ}W n$ t
y¨ td
||f ƒd‚Y n0 || j| j
ƒ} | jrà| jdurà|| jvrà| d|¡ q| d
|¡ | jdkr| | ¡ q| jdkr| | ¡ qtd| j ƒ‚qt d¡}
|j|
d |j|
d ||fS )a Inspects the options to load the requested patterns and handlers.
Returns:
(pre_order, post_order), where pre_order is the list of fixers that
want a pre-order AST traversal, and post_order is the list that want
post-order traversal.
r r2 r éÿÿÿÿNÚ_Ú c S s g | ]}| ¡ ‘qS r )Útitle)r3 r$ r r r r6 ë ó z.RefactoringTool.get_fixers..zCan't find %s.%sTzSkipping optional fixer: %szAdding transformation: %sZpreZpostzIllegal fixer order: %rZ run_order©Úkey)ra r Úrsplitr ÚFILE_PREFIXÚlenÚsplitÚCLASS_PREFIXÚjoinÚgetattrÚAttributeErrorrW re rk rb Úlog_messageÚ log_debugÚorderr ÚoperatorÚ
attrgetterÚsort)ru Zpre_order_fixersZpost_order_fixersZfix_mod_pathÚmodr4 ÚpartsÚ
class_nameZ fix_classr/ Zkey_funcr r r rm Û s:
ÿ
zRefactoringTool.get_fixersc O s ‚ dS )zCalled when an error occurs.Nr )ru ÚmsgÚargsÚkwdsr r r Ú log_error s zRefactoringTool.log_errorc G s |r|| }| j |¡ dS )zHook to log a message.N)r` Úinfo©ru r r r r r r† s zRefactoringTool.log_messagec G s |r|| }| j |¡ d S r8 )r` Údebugr” r r r r‡
s zRefactoringTool.log_debugc C s dS )zTCalled with the old version, new version, and filename of a
refactored file.Nr )ru Úold_textÚnew_textÚfilenameÚequalr r r Úprint_output s zRefactoringTool.print_outputc C s8 |D ].}t j |¡r$| |||¡ q| |||¡ qdS )z)Refactor a list of files and directories.N)ÚosÚpathÚisdirÚrefactor_dirÚ
refactor_file)ru ÚitemsÚwriteÚ
doctests_onlyZdir_or_filer r r Úrefactor s zRefactoringTool.refactorc
C sš t jd }t |¡D ]€\}}}| d|¡ | ¡ | ¡ |D ]>}| d¡s>t j |¡d |kr>t j ||¡} | | ||¡ q>dd„ |D ƒ|dd…<