B
    –ìZá  ã               @   s†   d dl Zd dlZd dlmZ d dlmZ d dlmZ d dlmZ d dl mZm	Z	 G dd„ de
ƒZG d	d
„ d
e
ƒZddd„Zdd„ ZdS )é    N)Ú
exceptions)Úlibutils)Úutils)Úworder)ÚArrayLinesAdapterÚLogicalLineFinderc               @   s>   e Zd Zddd„Zejdd„ ƒZeejdd„ ƒƒZdd	„ Z	d
S )Ú	FixSyntaxé   c             C   s   || _ || _|| _|| _d S )N)ÚprojectÚcodeÚresourceÚmaxfixes)Úselfr
   r   r   r   © r   ú5lib/python3.7/site-packages/rope/contrib/fixsyntax.pyÚ__init__   s    zFixSyntax.__init__c          
   C   sê   d}| j }d}xÖyH|dkrD| jdk	rD| j ¡ |krD| jj| jddS tj| j|| jddS  tjk
rà } zh|dkrˆd|j	|j
|jf }|| jk r¸|d7 }| j |j
¡ d | jj¡}nt |j	|j
d	 |¡¡‚W dd}~X Y qX qW dS )
zGet a `PyModule`Nr   T)Úforce_errors)r   r   z%s:%s %sr	   Ú
zFailed to fix error: {0})r   r   Úreadr
   Úget_pymoduler   Zget_string_moduler   ZModuleSyntaxErrorÚfilenameÚlinenoZmessage_r   Ú	commenterÚcommentÚjoinÚlinesÚformat)r   Úmsgr   ZtriesÚer   r   r   r      s,    


zFixSyntax.get_pymodulec             C   s
   t | jƒS )N)Ú
_Commenterr   )r   r   r   r   r   -   s    zFixSyntax.commenterc                sd   ˆ  ¡ ‰‡ ‡‡fdd„}ˆj}‡ ‡‡fdd„}| ˆjd ˆ d … ¡rL|ƒ S |ƒ }|d kr`|ƒ S |S )Nc                 sZ   t  ˆjd¡} |  ˆ ¡}| dd¡ dd¡}ˆj ddˆ ¡}ˆ ¡  |¡}tj	j
 ||¡S )NTz\
ú r   r   )r   ZWorderr   Zget_primary_atÚreplaceÚcountZ	get_scopeZget_inner_scope_for_lineÚropeÚbaseÚevaluateZeval_str)Zword_finderZ
expressionr   Zscope)ÚoffsetÚpymoduler   r   r   Ú
old_pyname5   s    
z'FixSyntax.pyname_at.<locals>.old_pynamec                 s   ˆj  ˆ ¡} tjj ˆ| ¡S )N)r   Útransfered_offsetr#   r$   r%   Zeval_location)Z	newoffset)r&   r'   r   r   r   Ú
new_pyname>   s    z'FixSyntax.pyname_at.<locals>.new_pynamer	   )r   Zsource_codeÚ
startswithr   )r   r&   r(   Znew_coder*   Úresultr   )r&   r'   r   r   Ú	pyname_at2   s    zFixSyntax.pyname_atN)r	   )
Ú__name__Ú
__module__Ú__qualname__r   r   Zsaveitr   Úpropertyr   r-   r   r   r   r   r   
   s
   
r   c               @   s\   e Zd Z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d„ Zdd„ ZdS )r   c             C   sR   || _ | j  d¡| _| j d¡ ttt| jƒd ƒƒ| _dgt| jƒd  | _d S )Nr   r	   r   )	r   Úsplitr   ÚappendÚlistÚrangeÚlenÚorigsÚdiffs)r   r   r   r   r   r   K   s
    z_Commenter.__init__c             C   s¸   t | j|ddd }|  |¡}t| j| ƒ}d|k rf|  |d ¡}| j| }| ¡  d¡rft|ƒd }|  |d| d ¡ x,t|d |d ƒD ]}|  || j| ¡ qŽW |  	||¡ d S )	NT)Ú
check_prevr	   r   ú:é   r    Úpass)
Ú_logical_startr   Ú_get_stmt_endÚ_get_line_indentsÚ_last_non_blankÚrstripÚendswithÚ_setr5   Ú_fix_incomplete_try_blocks)r   r   ÚstartÚendÚindentsZlast_linenoÚ	last_lineÚliner   r   r   r   R   s    

z_Commenter.commentc             C   s*   | j  dd|¡}t| jd |… ƒ}|| S )Nr   r   )r   r"   Úsumr8   )r   r&   r   Zdiffr   r   r   r)   b   s    z_Commenter.transfered_offsetc             C   s,   x&|dkr&| j |  ¡ dkr&|d8 }qW |S )Nr   Ú r	   )r   Ústrip)r   rE   r   r   r   r@   g   s    z_Commenter._last_non_blankc             C   sN   |}t | j| ƒ}x6t|d t| jƒƒD ]}t | j| ƒ|krD|}q(P q(W |S )Nr	   )r?   r   r5   r6   )r   r   Zend_lineÚbase_indentsÚir   r   r   Ú_get_block_endl   s    z_Commenter._get_block_endc             C   sJ   t | j| ƒ}x6t|d t| jƒƒD ]}t | j| ƒ|kr$|d S q$W |S )Nr	   )r?   r   r5   r6   )r   r   rM   rN   r   r   r   r>   v   s
    z_Commenter._get_stmt_endc             C   sÆ   |}|}x¸|dkrÀt jj t| jƒ|¡d }| j|  ¡  d¡r
t| j| ƒ}||krXq
|}|  	|¡}| j|  ¡ }| d¡s
| d¡s
| d¡s
|  
|d| d ¡ |  
|d d| d ¡ q
W d S )	Nr   r	   ztry:zfinally:zexcept zexcept:r    z    pass)r#   r$   ÚcodeanalyzeZget_block_startr   r   rL   r+   r?   Ú_find_matching_deindentÚ_insert)r   r   rG   Zblock_startZlast_indentsZ	block_endrI   r   r   r   rD   }   s"    




z%_Commenter._fix_incomplete_try_blocksc             C   sz   t | j| ƒ}|d }xT|t| jƒk rj| j| }| ¡  d¡s`| ¡ dks`t | j| ƒ|kr`|S |d7 }qW t| jƒd S )Nr	   ú#rK   )r?   r   r6   rL   r+   )r   Zline_numberrG   Zcurrent_linerI   r   r   r   rQ      s    
z"_Commenter._find_matching_deindentc             C   s8   | j | j|   t|ƒt| j| ƒ 7  < || j|< d S )N)r8   r7   r6   r   )r   r   rI   r   r   r   rC   œ   s    *z_Commenter._setc             C   sF   | j | j|   t|ƒd 7  < | j || j| ¡ | j ||¡ d S )Nr	   )r8   r7   r6   Úinsertr   )r   r   rI   r   r   r   rR       s     z_Commenter._insertN)r.   r/   r0   r   r   r)   r@   rO   r>   rD   rQ   rC   rR   r   r   r   r   r   I   s   
r   Fc             C   sx   t t| ƒƒ}|rj|d }xP|dkrh| |¡\}}|d ksP||  krL|k rTn n|S ||kr^P |d8 }qW | |¡d S )Nr	   r   )r   r   Zlogical_line_in)r   r   r9   Zlogical_finderÚprevrE   rF   r   r   r   r=   ¦   s    
 r=   c             C   s   t jj | ¡S )N)r#   r$   rP   Zcount_line_indents)rI   r   r   r   r?   ´   s    r?   )F)Zrope.base.codeanalyzer#   Zrope.base.evaluateZ	rope.baser   r   r   r   r   r   Úobjectr   r   r=   r?   r   r   r   r   Ú<module>   s   ?]
