B
;Ôð‰'B¢Sã @ 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 sX t | g g dgƒ}g }x>t |j¡D ].\}}}| d¡r"|rF|dd… }| |¡ q"W |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/python37/lib64/python3.7/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(| jdkr t‚| jhS t | tjƒrH| jrDt| jƒS t‚t | tj ƒrŠt
ƒ }x*| jD ] }x|D ]}| t|ƒ¡ qlW qbW |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 }x„| D ]|}|jrjyt|jƒ}W n tk
rJ | |¡ Y qX xB|D ]}|| |¡ qRW q|jdk r†||j |¡ q| |¡ qW x,tt j
j ¡ t j
j
ƒD ]}|| |¡ q¬W 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"
r/ 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)Úpkg_namer r ú
h s z+get_fixers_from_package..F)r )r3 r )r3 r Úget_fixers_from_packaged s
r5 c C s | S )Nr )Úobjr r r Ú _identityk s r7 c sV d}t t | ¡j¡‰ ‡ fdd„}ttjt jtj hƒ}t
ƒ }yúxô|ƒ \}}||krVq@q@|tjkrl|rfP d}q@|tjkr.|dkr.|ƒ \}}|tjksž|dkr P |ƒ \}}|tjks¼|dkr¾P |ƒ \}}|tj
krä|dkrä|ƒ \}}xJ|tjkr*| |¡ |ƒ \}}|tj
ks|d krP |ƒ \}}qæW q@P q@W W n tk
rL Y nX 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 sD
rR c @ s e Zd ZdZdS )Ú
FixerErrorzA fixer could not be loaded.N)r r r Ú__doc__r r r r rS — s rS c @ sä e Zd Zdddœ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Úwrite_unchanged_filesZFixr Nc C s2 || _ |pg | _| j ¡ | _|dk r0| j |¡ | jd rDtj| _ntj | _| j
d¡| _g | _t
d¡| _g | _d| _tj| jtj| jd| _| ¡ \| _| _g | _t ¡ | _g | _g | _xXt| j| jƒD ]F}|j rä| j !|¡ qÌ|| jkrü| j "|¡ qÌ|| jkrÌ| j "|¡ qÌW 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.
NrV rW rU F)ÚconvertÚlogger)&ÚfixersÚexplicitÚ_default_optionsÚcopyÚoptionsr r Ú!python_grammar_no_print_statementÚgrammarr) ÚgetrW ÚerrorsÚloggingZ getLoggerrY Ú fixer_logÚwroter ZDriverr rX Ú
get_fixersÚ pre_orderÚ
post_orderÚfilesÚbmZ
BottomMatcherÚBMZ
bmi_pre_orderZbmi_post_orderr Z
BM_compatibleZ add_fixerr r/ Úbmi_pre_order_headsÚbmi_post_order_heads)ÚselfZfixer_namesr^ r[ r. r r r Ú__init__£ s<