B
    –ìZq  ã               @   s¸   d dl Z d dlZd dlZd dlmZmZmZ d dlmZ ye	 W n e
k
r\   eefZ	Y nX ddd„Zddd„Zd	d
„ Zdd„ ZG dd„ dejƒZG dd„ deƒZG dd„ deƒZdS )é    N)ÚastÚcodeanalyzeÚ
exceptions)ÚpycompatFc             C   s   t t | ¡| |ƒS )z„Adds ``region`` and ``sorted_children`` fields to nodes

    Adds ``sorted_children`` field only if `sorted_children` is True.

    )Ú	patch_astr   Úparse)ÚsourceÚsorted_children© r
   ú7lib/python3.7/site-packages/rope/refactor/patchedast.pyÚget_patched_ast   s    r   c             C   s*   t | dƒr| S t||d}t | |¡ | S )a”  Patches the given node

    After calling, each node in `node` will have a new field named
    `region` that is a tuple containing the start and end offsets
    of the code that generated it.

    If `sorted_children` is true, a `sorted_children` field will
    be created for each node, too.  It is a list containing child
    nodes as well as whitespaces and comments that occur between
    them.

    Úregion)Úchildren)ÚhasattrÚ_PatchingASTWalkerr   Úcall_for_nodes)Únoder   r	   Zwalkerr
   r
   r   r      s
    
r   c             C   s   | j S )z$Get the region of a patched ast node)r   )Úpatched_ast_noder
   r
   r   Únode_region+   s    r   c             C   sD   g }x4| j D ]*}t|tjƒr,| t|ƒ¡ q| |¡ qW d |¡S )zØExtract source form a patched AST node with `sorted_children` field

    If the node is patched with sorted_children turned off you can use
    `node_region` function for obtaining code using module source code.
    Ú )r	   Ú
isinstancer   ÚASTÚappendÚ	write_astÚjoin)r   ÚresultÚchildr
   r
   r   r   0   s    r   c               @   s   e Zd ZdS )ÚMismatchedTokenErrorN)Ú__name__Ú
__module__Ú__qualname__r
   r
   r
   r   r   ?   s   r   c               @   s¨  e Zd Zd°dd„Zeƒ Zeƒ Zeƒ Zdd„ Zd±dd„Z	dd	„ Z
d
d„ Zdd„ Zdd„ Zddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*œZd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ ZdAdB„ ZdCdD„ ZdEdF„ ZdGdH„ ZdIdJ„ ZdKdL„ ZdMdN„ Z dOdP„ Z!dQdR„ Z"dSdT„ Z#dUdV„ Z$dWdX„ Z%dYdZ„ Z&d[d\„ Z'd]d^„ Z(d_d`„ Z)dadb„ Z*dcdd„ Z+dedf„ Z,dgdh„ Z-didj„ Z.dkdl„ Z/dmdn„ Z0dodp„ Z1dqdr„ Z2dsdt„ Z3dudv„ Z4dwdx„ Z5dydz„ Z6d{d|„ Z7d}d~„ Z8dd€„ Z9dd‚„ Z:dƒd„„ Z;d…d†„ Z<d‡dˆ„ Z=d‰dŠ„ Z>d‹dŒ„ Z?ddŽ„ Z@dd„ ZAd‘d’„ ZBd“d”„ ZCd•d–„ ZDd—d˜„ ZEd™dš„ ZFd›dœ„ ZGddž„ ZHdŸd „ ZId¡d¢„ ZJd£d¤„ ZKd¥d¦„ ZLd§d¨„ ZMd©dª„ ZNd«d¬„ ZOd­d®„ ZPd¯S )²r   Fc             C   s&   t |ƒ| _|| _t |¡| _g | _d S )N)Ú_Sourcer   r   r   ZSourceLinesAdapterÚlinesÚchildren_stack)Úselfr   r   r
   r
   r   Ú__init__E   s    
z_PatchingASTWalker.__init__c             C   s`   t | d|jj d ƒ}|d k	r$||ƒS t d|jj t¡ | jj| jjf|_| j	r\t
 |¡|_d S )NÚ_z&Unknown node type <%s>; please report!)ÚgetattrÚ	__class__r   ÚwarningsÚwarnÚRuntimeWarningr   Úoffsetr   r   r   Zget_childrenr	   )r$   r   Úmethodr
   r
   r   Ú__call__O   s    z_PatchingASTWalker.__call__c             C   s  t |dƒr"t d|jj t¡ d S t |¡}| j 	|¡ t ¡ }g }| j
j}|}d}	x |rv| ¡ }
|
d krpqX| j
j}t|
tjƒrœt |
| ¡ |
jd }nˆ|
| jkrº| j
j|  ¡ d}nL|
| jkrÐ| j
 ¡ }n6|
dkrä| j
 ¡ }n"|
| jkrú| j
 ¡ }n| j
 |
¡}| j
|d |d … }
|d }|	s\| 	| j
||… ¡ | jrd| 	| j
||… ¡ nd}	|}| jrX| 	|
¡ qXW |  |||¡}|rš|  |||¡}|rð| jr¼| | j
d|… ¡ | j
| j
jd … }| j
 |¡ | jrì| 	|¡ d}| jrþ||_|| j
jf|_| j  ¡  d S )	Nr   z2Node <%s> has been already patched; please report!Tr   )Úendz!=é   F)!r   r)   r*   r(   r   r+   ÚcollectionsÚdequer#   r   r   r,   Úpopleftr   r   r   r   r   ÚStringÚconsume_stringÚ_find_next_statement_startÚNumberÚconsume_numberÚconsume_not_equalÚsemicolon_or_as_in_exceptÚconsume_except_as_or_semicolonÚconsumer   Ú_handle_parensÚ_eat_surrounding_parensÚ
appendleftr	   Úpop)r$   r   Zbase_childrenÚ
eat_parensÚ
eat_spacesr   ÚformatsÚsuspected_startÚstartZfirst_tokenr   r,   Útoken_startr   Z
end_spacesr
   r
   r   Ú_handleZ   sp    







z_PatchingASTWalker._handlec       
      C   s®   |   |¡\}}| jj}d}x t|ƒD ]}| j d¡d }q$W |dk	r^| jr^| | j||… ¡ |}	x t|ƒD ]}| j dd|	¡}	qlW |	|krª| jr¦| | j|	|… ¡ |	}|S )z(Changes `children` and returns new startNú)r0   ú(r   )	Ú_count_needed_parensr   r,   Úranger<   r   r   Úrfind_tokenr?   )
r$   r   rE   rC   ÚopensZclosesZold_endZnew_endÚiZ	new_startr
   r
   r   r=   ›   s     z!_PatchingASTWalker._handle_parensc       	      C   sˆ   | j  d||¡}|d k	r„|}| j j}|}| jrP| | j |d |… ¡ | d¡ | j  d¡\}}| jr„| | j ||… ¡ | d¡ |S )NrI   r0   rH   )r   rL   r,   r   r?   r<   r   )	r$   r   rD   rE   ÚindexZ	old_startZ
old_offsetrF   Z	token_endr
   r
   r   r>   ®   s    

z*_PatchingASTWalker._eat_surrounding_parensc          	   C   sÌ   d}d}xº|D ]²}t |tƒsq|dks|d dkr4qd}x†|t|ƒk r¾|| dkrl|dkrd|d8 }n|d7 }|| dkr€|d7 }|| dkr´y| d|¡}W n tk
r²   P Y nX |d7 }q:W qW ||fS )	Nr   r   z'"rH   r0   rI   ú#Ú
)r   Ú
basestringÚlenrO   Ú
ValueError)r$   r   rE   rM   r   rO   r
   r
   r   rJ   ½   s,    


z'_PatchingASTWalker._count_needed_parensc             C   sN   x@t | jƒD ]2}x,|D ]$}t|tjƒr|j| j |j¡ S qW qW t	| j
j
ƒS )N)Úreversedr#   r   r   ZstmtÚ
col_offsetr"   Úget_line_startÚlinenorS   r   )r$   r   r   r
   r
   r   r6   Ö   s    
z-_PatchingASTWalker._find_next_statement_startÚandÚorú+ú-Ú*ú/ú%z**z<<z>>ú|ú&ú^z//ú~Únotz==z!=ú<z<=ú>z>=Úiszis notÚinznot in)ZAndZOrZAddZSubZMultZDivZModZPowZLShiftZRShiftZBitOrZBitAndZBitXorZFloorDivZInvertZNotZUAddZUSubZEqZNotEqZLtZLtEZGtZGtEZIsZIsNotZInZNotInc             C   s   | j |jj  d¡S )Nú )Ú
_operatorsr(   r   Úsplit)r$   r   r
   r
   r   Ú_get_opç   s    z_PatchingASTWalker._get_opc             C   s   |   ||jd|jg¡ d S )NÚ.)rG   ÚvalueÚattr)r$   r   r
   r
   r   Ú
_Attributeê   s    z_PatchingASTWalker._Attributec             C   s6   d|j g}|jr&| d¡ | |j¡ |  ||¡ d S )NÚassertú,)ÚtestÚmsgr   rG   )r$   r   r   r
   r
   r   Ú_Assertí   s
    

z_PatchingASTWalker._Assertc             C   s4   |   |jd¡}| d¡ | |j¡ |  ||¡ d S )Nú=)Ú_child_nodesÚtargetsr   rn   rG   )r$   r   r   r
   r
   r   Ú_Assignô   s    
z_PatchingASTWalker._Assignc             C   s:   |j g}| |  |j¡¡ | d|jg¡ |  ||¡ d S )Nrv   )ÚtargetÚextendrl   Úoprn   rG   )r$   r   r   r
   r
   r   Ú
_AugAssignú   s    z_PatchingASTWalker._AugAssignc             C   s   |   |d|jdg¡ d S )Nú`)rG   rn   )r$   r   r
   r
   r   Ú_Repr   s    z_PatchingASTWalker._Reprc             C   s,   |j g|  |j¡ |jg }|  ||¡ d S )N)Úleftrl   r|   ÚrightrG   )r$   r   r   r
   r
   r   Ú_BinOp  s    z_PatchingASTWalker._BinOpc          	   C   s&   |   ||  |j|  |j¡d ¡¡ d S )Nr   )rG   rw   Úvaluesrl   r|   )r$   r   r
   r
   r   Ú_BoolOp  s    z_PatchingASTWalker._BoolOpc             C   s   |   |dg¡ d S )NÚbreak)rG   )r$   r   r
   r
   r   Ú_Break  s    z_PatchingASTWalker._Breakc             C   sZ  dd„ }|j dg}g }t|jƒ}xBt|jƒD ]4\}}ttdƒrVt|tjƒrV| 	|¡ q,| 	|¡ q,W t
|dd ƒr|| 	|j¡ |j|d | |  |d¡¡ |r
t|ƒdkr¶| 	d¡ xRt|ƒD ]F\}}|t
|dd ƒkrâ| 	d	¡ | 	|¡ |d
 t|ƒk rÀ| 	d¡ qÀW t
|dd ƒr@t|ƒdkr0| 	d¡ | d|jg¡ | 	d¡ |  ||¡ d S )Nc             S   s(   t | tjƒr| jj| jjfS | j| jfS )N)r   r   Úkeywordrn   rX   rV   )r   r
   r
   r   Ú_arg_sort_key  s    z/_PatchingASTWalker._Call.<locals>._arg_sort_keyrI   ÚStarredÚstarargs)Úkeyrr   é   r]   r0   Úkwargsz**rH   )ÚfuncÚlistÚkeywordsÚ	enumerateÚargsr   r   r   r‰   r   r'   rŠ   Úsortr{   rw   rS   r   rG   )r$   r   rˆ   r   Zunstarred_argsZstarred_and_keywordsrN   Úargr
   r
   r   Ú_Call  s6    






z_PatchingASTWalker._Callc             C   s˜   g }t |dd ƒr4x"|jD ]}| d¡ | |¡ qW | d|jg¡ |jrr| d¡ | |  |jd¡¡ | d¡ | d¡ | |j¡ |  ||¡ d S )NÚdecorator_listú@ÚclassrI   rr   rH   ú:)	r'   r–   r   r{   ÚnameÚbasesrw   ÚbodyrG   )r$   r   r   Ú	decoratorr
   r
   r   Ú	_ClassDef4  s    



z_PatchingASTWalker._ClassDefc             C   sV   g }|  |j¡ x4t|j|jƒD ]"\}}| |  |¡¡ |  |¡ q W |  ||¡ d S )N)r   r€   ÚzipZopsZcomparatorsr{   rl   rG   )r$   r   r   r|   Úexprr
   r
   r   Ú_CompareC  s    z_PatchingASTWalker._Comparec             C   s    |   |dg|  |jd¡ ¡ d S )NÚdelrr   )rG   rw   rx   )r$   r   r
   r
   r   Ú_DeleteK  s    z_PatchingASTWalker._Deletec             C   s   |   || jg¡ d S )N)rG   r7   )r$   r   r
   r
   r   Ú_NumN  s    z_PatchingASTWalker._Numc             C   s   |   || jg¡ d S )N)rG   r4   )r$   r   r
   r
   r   Ú_StrQ  s    z_PatchingASTWalker._Strc             C   s   |   |dg¡ d S )NÚcontinue)rG   )r$   r   r
   r
   r   Ú	_ContinueT  s    z_PatchingASTWalker._Continuec             C   s~   g }|  d¡ |jrdxNtt|j|jƒƒD ]8\}\}}| |d|g¡ |t|jƒd k r(|  d¡ q(W |  d¡ |  ||¡ d S )NÚ{r™   r0   rr   Ú})r   Úkeysr‘   rŸ   rƒ   r{   rS   rG   )r$   r   r   rO   r‹   rn   r
   r
   r   Ú_DictW  s    
 
z_PatchingASTWalker._Dictc             C   s   |   |dg¡ d S )Nz...)rG   )r$   r   r
   r
   r   Ú	_Ellipsisb  s    z_PatchingASTWalker._Ellipsisc             C   s   |   ||jg¡ d S )N)rG   rn   )r$   r   r
   r
   r   Ú_Expre  s    z_PatchingASTWalker._Exprc             C   sP   g }|  d|jg¡ |jr*|  d|jg¡ |jr@|  d|jg¡ |  ||¡ d S )NÚexecrh   rr   )r{   rœ   ÚglobalsÚlocalsrG   )r$   r   r   r
   r
   r   Ú_Exech  s    z_PatchingASTWalker._Execc             C   sH   g }x2t |jƒD ]$\}}|dkr*| d¡ | |¡ qW |  ||¡ d S )Nr   rr   )r‘   Zdimsr   rG   )r$   r   r   rO   Zdimr
   r
   r   Ú	_ExtSliceq  s    
z_PatchingASTWalker._ExtSlicec             C   sN   d|j d|jdg}| |j¡ |jr>| ddg¡ | |j¡ |  ||¡ d S )NÚforrh   r™   Úelse)rz   Úiterr{   rœ   ÚorelserG   )r$   r   r   r
   r
   r   Ú_Fory  s    z_PatchingASTWalker._Forc             C   sT   dg}|j r| d|j  ¡ | |jp(ddg¡ | |  |jd¡¡ |  ||¡ d S )NÚfromrm   r   Úimportrr   )Úlevelr   r{   Úmodulerw   ÚnamesrG   )r$   r   r   r
   r
   r   Ú_ImportFrom  s    z_PatchingASTWalker._ImportFromc             C   s.   |j g}|jr| d|jg¡ |  ||¡ d S )NÚas)rš   Zasnamer{   rG   )r$   r   r   r
   r
   r   Ú_alias‹  s    z_PatchingASTWalker._aliasc             C   sš   g }yt |dƒ}W n  tk
r2   t |dd ƒ}Y nX |rZx |D ]}| d¡ | |¡ q>W | d|jd|jg¡ | ddg¡ | |j¡ |  ||¡ d S )Nr–   Ú
decoratorsr—   ÚdefrI   rH   r™   )r'   ÚAttributeErrorr   r{   rš   r’   rœ   rG   )r$   r   r   rÀ   r   r
   r
   r   Ú_FunctionDef‘  s    

z_PatchingASTWalker._FunctionDefc             C   sæ   g }t |jƒ}d gt|ƒt|jƒ  t |jƒ }x>tt||ƒƒD ],\}\}}|dkr^| d¡ |  |||¡ q@W |jd k	rž|rˆ| d¡ | 	dt
 |j¡g¡ |jd k	rÖ|s¶|jd k	rÀ| d¡ | 	dt
 |j¡g¡ |  ||¡ d S )Nr   rr   r]   z**)r   r’   rS   Údefaultsr‘   rŸ   r   Ú_add_args_to_childrenZvarargr{   r   Zget_ast_arg_argZkwargrG   )r$   r   r   r’   rÄ   rO   r”   Údefaultr
   r
   r   Ú
_arguments   s"    





z_PatchingASTWalker._argumentsc             C   sF   t |ttfƒr|  ||¡ n
| |¡ |d k	rB| d¡ | |¡ d S )Nrv   )r   r   ÚtupleÚ_add_tuple_parameterr   )r$   r   r”   rÆ   r
   r
   r   rÅ   ³  s    

z(_PatchingASTWalker._add_args_to_childrenc             C   sf   |  d¡ xLt|ƒD ]@\}}|dkr.|  d¡ t|ttfƒrJ|  ||¡ q|  |¡ qW |  d¡ d S )NrI   r   rr   rH   )r   r‘   r   r   rÈ   rÉ   )r$   r   r”   rO   Útokenr
   r
   r   rÉ   ¼  s    

z'_PatchingASTWalker._add_tuple_parameterc             C   s(   |j g}| |j¡ | j||dd d S )NT)rA   )Úeltr{   Ú
generatorsrG   )r$   r   r   r
   r
   r   Ú_GeneratorExpÇ  s    z _PatchingASTWalker._GeneratorExpc             C   sJ   d|j d|jg}|jr:x"|jD ]}| d¡ | |¡ qW |  ||¡ d S )Nr³   rh   Úif)rz   rµ   Zifsr   rG   )r$   r   r   Zif_r
   r
   r   Ú_comprehensionÌ  s    
z!_PatchingASTWalker._comprehensionc             C   s*   |   |jd¡}| dd¡ |  ||¡ d S )Nrr   r   Úglobal)rw   r¼   ÚinsertrG   )r$   r   r   r
   r
   r   Ú_GlobalÔ  s    z_PatchingASTWalker._Globalc             C   s„   |   |¡rdg}ndg}| |jdg¡ | |j¡ |jrtt|jƒdkrZ|   |jd ¡rZn| ddg¡ | |j¡ |  ||¡ d S )NÚelifrÎ   r™   r0   r   r´   )Ú_is_elifr{   rs   rœ   r¶   rS   rG   )r$   r   r   r
   r
   r   Ú_IfÙ  s    
z_PatchingASTWalker._Ifc             C   sX   t |tjƒsdS | j |j¡|j }| j||d … }| j|d |d … }d||fkS )NFé   é   r0   rÓ   )r   r   ZIfr"   rW   rX   rV   r   )r$   r   r,   ZwordZalt_wordr
   r
   r   rÔ   è  s    z_PatchingASTWalker._is_elifc             C   s   |   ||jd|jd|jg¡S )NrÎ   r´   )rG   rœ   rs   r¶   )r$   r   r
   r
   r   Ú_IfExpñ  s    z_PatchingASTWalker._IfExpc             C   s*   dg}|  |  |jd¡¡ |  ||¡ d S )Nr¹   rr   )r{   rw   r¼   rG   )r$   r   r   r
   r
   r   Ú_Importõ  s    z_PatchingASTWalker._Importc             C   s@   g }|j d kr| |j¡ n| |j d|jg¡ |  ||¡ d S )Nrv   )r”   r   rn   r{   rG   )r$   r   r   r
   r
   r   Ú_keywordú  s
    
z_PatchingASTWalker._keywordc             C   s   |   |d|jd|jg¡ d S )NÚlambdar™   )rG   r’   rœ   )r$   r   r
   r
   r   Ú_Lambda  s    z_PatchingASTWalker._Lambdac             C   s&   |   |dg|  |jd¡ dg ¡ d S )Nú[rr   ú])rG   rw   Úelts)r$   r   r
   r
   r   Ú_List  s    z_PatchingASTWalker._Listc             C   s0   d|j g}| |j¡ | d¡ |  ||¡ d S )NrÝ   rÞ   )rË   r{   rÌ   r   rG   )r$   r   r   r
   r
   r   Ú	_ListComp  s    

z_PatchingASTWalker._ListCompc             C   sL   |j r,|  |dg|  |j d¡ dg ¡ d S t dt¡ |  |ddg¡ d S )Nr¨   rr   r©   z3Tried to handle empty <Set> literal; please report!zset(rH   )rß   rG   rw   r)   r*   r+   )r$   r   r
   r
   r   Ú_Set  s    z_PatchingASTWalker._Setc             C   s0   d|j g}| |j¡ | d¡ |  ||¡ d S )Nr¨   r©   )rË   r{   rÌ   r   rG   )r$   r   r   r
   r
   r   Ú_SetComp  s    

z_PatchingASTWalker._SetCompc             C   s@   dg}|  |jd|jg¡ |  |j¡ | d¡ |  ||¡ d S )Nr¨   r™   r©   )r{   r‹   rn   rÌ   r   rG   )r$   r   r   r
   r
   r   Ú	_DictComp  s
    
z_PatchingASTWalker._DictCompc             C   s   | j |t|jƒdd d S )NT)rB   )rG   r   rœ   )r$   r   r
   r
   r   Ú_Module%  s    z_PatchingASTWalker._Modulec             C   s   |   ||jg¡ d S )N)rG   Úid)r$   r   r
   r
   r   Ú_Name(  s    z_PatchingASTWalker._Namec             C   s   |   |t|jƒg¡ d S )N)rG   Ústrrn   )r$   r   r
   r
   r   Ú_NameConstant+  s    z _PatchingASTWalker._NameConstantc             C   s   |   ||jg¡ d S )N)rG   r”   )r$   r   r
   r
   r   Ú_arg.  s    z_PatchingASTWalker._argc             C   s   |   |dg¡ d S )NÚpass)rG   )r$   r   r
   r
   r   Ú_Pass1  s    z_PatchingASTWalker._Passc             C   s`   dg}|j r,| d|j g¡ |jr,| d¡ | |  |jd¡¡ |jsP| d¡ |  ||¡ d S )NÚprintz>>rr   )Údestr{   rƒ   r   rw   ÚnlrG   )r$   r   r   r
   r
   r   Ú_Print4  s    

z_PatchingASTWalker._Printc             C   s8   dd„ }dd„ }t jr ||ƒ}n||ƒ}|  ||¡ d S )Nc             S   s.   dg}| j r| | j ¡ | jr*| | j¡ |S )NÚraise)Úexcr   Úcause)r   r   r
   r
   r   Úget_python3_raise_childrenA  s    z=_PatchingASTWalker._Raise.<locals>.get_python3_raise_childrenc             S   sT   dg}| j r| | j ¡ | jr4| d¡ | | j¡ | jrP| d¡ | | j¡ |S )Nrñ   rr   )Útyper   ZinstZtback)r   r   r
   r
   r   Úget_python2_raise_childrenI  s    

z=_PatchingASTWalker._Raise.<locals>.get_python2_raise_children)r   ÚPY2rG   )r$   r   rô   rö   r   r
   r
   r   Ú_Raise?  s    
z_PatchingASTWalker._Raisec             C   s(   dg}|j r| |j ¡ |  ||¡ d S )NÚreturn)rn   r   rG   )r$   r   r   r
   r
   r   Ú_ReturnZ  s    z_PatchingASTWalker._Returnc             C   sL   g }x6t |jƒD ](\}}|dkr*| d¡ |r| |¡ qW |  ||¡ d S )Nr   r™   )r‘   Únodesr   rG   )r$   r   r   rO   Úslicer
   r
   r   Ú	_Sliceobj`  s    
z_PatchingASTWalker._Sliceobjc             C   s   |   ||jg¡ d S )N)rG   rn   )r$   r   r
   r
   r   Ú_Indexi  s    z_PatchingASTWalker._Indexc             C   s   |   ||jd|jdg¡ d S )NrÝ   rÞ   )rG   rn   rü   )r$   r   r
   r
   r   Ú
_Subscriptl  s    z_PatchingASTWalker._Subscriptc             C   s^   g }|j r| |j ¡ | d¡ |jr2| |j¡ |jrN| d¡ | |j¡ |  ||¡ d S )Nr™   )Úlowerr   ÚupperÚsteprG   )r$   r   r   r
   r
   r   Ú_Sliceo  s    

z_PatchingASTWalker._Slicec             C   sØ   d}d}t |jƒdkrvtjr@t|jd tjƒ}tt |jƒƒ }n6tj	rvyt|j
d tjƒ}d}W n tk
rt   Y nX g }|s‚|s| ddg¡ | |j¡ tj	r®| |j
¡ | ddg¡ | |j¡ |  ||¡ d S )NFTr0   r   Útryr™   Úfinally)rS   Ú	finalbodyr   r÷   r   rœ   r   Z	TryExceptÚboolZPY3ÚhandlersZExceptHandlerÚ
IndexErrorr{   rG   )r$   r   Zis_there_except_handlerZnot_empty_bodyr   r
   r
   r   Ú_TryFinally{  s*    z_PatchingASTWalker._TryFinallyc             C   sP   ddg}|  |j¡ |  |j¡ |jr@|  ddg¡ |  |j¡ |  ||¡ d S )Nr  r™   r´   )r{   rœ   r  r¶   rG   )r$   r   r   r
   r
   r   Ú
_TryExcept“  s    z_PatchingASTWalker._TryExceptc             C   s$   t |jƒr|  |¡ n
|  |¡ d S )N)rS   r  r
  r  )r$   r   r
   r
   r   Ú_Tryœ  s    
z_PatchingASTWalker._Tryc             C   s   |   |¡ d S )N)Ú_excepthandler)r$   r   r
   r
   r   Ú_ExceptHandler¢  s    z!_PatchingASTWalker._ExceptHandlerc             C   s\   dg}|j r| |j ¡ |jr6| | j¡ | |j¡ | d¡ | |j¡ |  ||¡ d S )NÚexceptr™   )rõ   r   rš   r:   r{   rœ   rG   )r$   r   r   r
   r
   r   r  ¥  s    
z!_PatchingASTWalker._excepthandlerc             C   s6   |j r"| j||  |j d¡dd n|  |ddg¡ d S )Nrr   T)rA   rI   rH   )rß   rG   rw   )r$   r   r
   r
   r   Ú_Tuple²  s    
z_PatchingASTWalker._Tuplec             C   s(   |   |j¡}| |j¡ |  ||¡ d S )N)rl   r|   r   ZoperandrG   )r$   r   r   r
   r
   r   Ú_UnaryOp¹  s    z_PatchingASTWalker._UnaryOpc             C   s(   dg}|j r| |j ¡ |  ||¡ d S )NÚyield)rn   r   rG   )r$   r   r   r
   r
   r   Ú_Yield¾  s    z_PatchingASTWalker._Yieldc             C   sH   d|j dg}| |j¡ |jr8| ddg¡ | |j¡ |  ||¡ d S )NÚwhiler™   r´   )rs   r{   rœ   r¶   rG   )r$   r   r   r
   r
   r   Ú_WhileÄ  s    z_PatchingASTWalker._Whilec             C   sd   g }x8t  |¡D ]*}| d|jg¡ |jr| d|jg¡ qW | d¡ | |j¡ |  ||¡ d S )NÚwithr¾   r™   )r   Zget_ast_with_itemsr{   Zcontext_exprZoptional_varsr   rœ   rG   )r$   r   r   Úitemr
   r
   r   Ú_WithÌ  s    
z_PatchingASTWalker._Withc             C   sB   g }x8t |ƒD ],\}}| |¡ |t|ƒd k r| |¡ qW |S )Nr0   )r‘   r   rS   )r$   rû   Z	separatorr   rO   r   r
   r
   r   rw   Ö  s    
z_PatchingASTWalker._child_nodesc             C   s   |   ||jg¡ d S )N)rG   rn   )r$   r   r
   r
   r   Ú_StarredÞ  s    z_PatchingASTWalker._StarredN)F)FF)Qr   r   r    r%   Úobjectr7   r4   r:   r.   rG   r=   r>   rJ   r6   rj   rl   rp   ru   ry   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Ò   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  r  r  r  r  r  r  rw   r  r
   r
   r
   r   r   C   s¨   

A&	
		
		
r   c               @   s¦   e Zd Zdd„ Zdd„ Zd$dd„Zdd	„ Zd
d„ Zdd„ Zd%dd„Z	dd„ Z
dd„ Zd&dd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ ZdZdZdZdS )'r!   c             C   s   || _ d| _d S )Nr   )r   r,   )r$   r   r
   r
   r   r%   ã  s    z_Source.__init__c          	   C   sx   y2x,| j  || j¡}|  ||¡r$P q|  ¡  qW W n, ttfk
r^   td||  ¡ f ƒ‚Y nX |t	|ƒ | _|| jfS )Nz"Token <%s> at %s cannot be matched)
r   rO   r,   Ú_good_tokenÚ_skip_commentrT   Ú	TypeErrorr   Ú_get_locationrS   )r$   rÊ   Ú
new_offsetr
   r
   r   r<   ç  s    z_Source.consumeNc             C   s<   t jd kr*t ¡ }d||f }t |¡t _t j}|  ||¡S )Nz(%s)((\s|\\\n|#[^\n]*\n)*(%s))*)r!   Ú_string_patternr   Zget_string_patternÚreÚcompileÚ_consume_pattern)r$   r/   ZoriginalÚpatternÚ	repatternr
   r
   r   r5   ö  s    

z_Source.consume_stringc             C   s*   t jd krt |  ¡ ¡t _t j}|  |¡S )N)r!   Ú_number_patternr!  r"  Ú_get_number_patternr#  )r$   r%  r
   r
   r   r8   ÿ  s
    
z_Source.consume_numberc             C   s&   t jd krt d¡t _t j}|  |¡S )Nz<>|!=)r!   Ú_not_equals_patternr!  r"  r#  )r$   r%  r
   r
   r   r9     s    
z_Source.consume_not_equalc             C   s   t  d¡}|  |¡S )Nzas|,)r!  r"  r#  )r$   r%  r
   r
   r   r;     s    
z&_Source.consume_except_as_or_semicolonc             C   sj   |dkr| j }y| j d||¡}W n tk
r6   dS X y| j d||¡}W n tk
r`   dS X ||k S )z,Checks whether consumed token is in commentsNrP   TrQ   F)r,   r   ÚrindexrT   )r$   rÊ   r,   rE   Zcomment_indexZnew_line_indexr
   r
   r   r    s    z_Source._good_tokenc             C   s   | j  d| jd ¡| _d S )NrQ   r0   )r   rO   r,   )r$   r
   r
   r   r    s    z_Source._skip_commentc             C   s*   | j d | j…  d¡}t|ƒt|d ƒfS )NrQ   éÿÿÿÿ)r   r,   rk   rS   )r$   r"   r
   r
   r   r  !  s    z_Source._get_locationc             C   sd   xH|d krt | jƒ}| | j| j|¡}|  | ¡ | ¡ ¡r>P q|  ¡  qW | ¡ | _| ¡ | ¡ fS )N)	rS   r   Úsearchr,   r  ÚgrouprE   r  r/   )r$   r%  r/   Úmatchr
   r
   r   r#  %  s    

z_Source._consume_patternc             C   s   | j  || j¡}| | j|… S )N)r   rO   r,   )r$   rÊ   r  r
   r
   r   Ú
till_token1  s    z_Source.till_tokenc             C   sP   |}xFy,| j  |||¡}| j|||dr,|S |}W q tk
rF   d S X qW d S )N)rE   )r   r)  r  rT   )r$   rÊ   rE   r/   rO   r
   r
   r   rL   5  s    z_Source.rfind_tokenc             C   s   | || j … S )N)r,   )r$   r,   r
   r
   r   Úfrom_offsetA  s    z_Source.from_offsetc             C   s   | j  |d|¡S )Nr   )r   r)  )r$   r$  r,   r
   r
   r   Úfind_backwardsD  s    z_Source.find_backwardsc             C   s
   | j | S )N)r   )r$   rO   r
   r
   r   Ú__getitem__G  s    z_Source.__getitem__c             C   s   | j ||… S )N)r   )r$   rN   Újr
   r
   r   Ú__getslice__J  s    z_Source.__getslice__c             C   s   d}d| S )Nz\-?(0x[\da-fA-F]+|\d+)[lL]?z((%s(\.\d*)?|(\.\d+))([eE][-+]?\d+)?[jJ]?r
   )r$   Zintegerr
   r
   r   r'  M  s    z_Source._get_number_pattern)N)N)N)r   r   r    r%   r<   r5   r8   r9   r;   r  r  r  r#  r.  rL   r/  r0  r1  r3  r'  r   r&  r(  r
   r
   r
   r   r!   á  s(   
	

r!   )F)F)r1   r!  r)   Z	rope.baser   r   r   Zrope.base.utilsr   rR   Ú	NameErrorrè   Úbytesr   r   r   r   Z	RopeErrorr   r  r   r!   r
   r
   r
   r   Ú<module>   s(   
	
     #