B
    6Li[Ÿr  ã               @   s\  d dl Z d dlmZ d dlmZmZ d dlmZmZ d dl	m
Z
 d dlmZ d dlmZmZmZmZm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G dd„ deƒ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G dd„ deƒZG dd„ deƒZdd„ ZG d d!„ d!eƒZ G d"d#„ d#eƒZ!d$d%„ Z"d&d'„ Z#d(d)„ Z$dS )*é    N)Ú
OrderedSet)ÚastÚcodeanalyze)Ú	ChangeSetÚChangeContents)ÚRefactoringError)Úpycompat)ÚsourceutilsÚsimilarfinderÚ
patchedastÚsuitesÚusefunctionc               @   s0   e Zd Zddd„Zdd„ Zdd„ Zddd	„Zd
S )Ú_ExtractRefactoringFc             C   s4   || _ || _|  | ¡ |¡| _|  | ¡ |¡| _d S )N)ÚprojectÚresourceÚ
_fix_startÚreadÚstart_offsetÚ_fix_endÚ
end_offset)Úselfr   r   r   r   Úvariable© r   ú4lib/python3.7/site-packages/rope/refactor/extract.pyÚ__init__&   s    z_ExtractRefactoring.__init__c             C   s*   x$|t |ƒk r$||  ¡ r$|d7 }qW |S )Né   )ÚlenÚisspace)r   ÚsourceÚoffsetr   r   r   r   -   s    z_ExtractRefactoring._fix_startc             C   s*   x$|dkr$||d    ¡ r$|d8 }qW |S )Nr   r   )r   )r   r   r   r   r   r   r   2   s    z_ExtractRefactoring._fix_endc          
   C   sZ   t | j| j| j| j|| jdk||d}t|ƒ ¡ }td| j|f ƒ}| 	t
| j|ƒ¡ |S )a
  Get the changes this refactoring makes

        :parameters:
            - `similar`: if `True`, similar expressions/statements are also
              replaced.
            - `global_`: if `True`, the extracted method/variable will
              be global.

        r   )r   ÚsimilarÚmake_globalzExtract %s <%s>)Ú_ExtractInfor   r   r   r   ÚkindÚ_ExtractPerformerÚextractr   Ú
add_changer   )r   Zextracted_namer    Úglobal_ÚinfoZnew_contentsZchangesr   r   r   Úget_changes7   s    



z_ExtractRefactoring.get_changesN)F)FF)Ú__name__Ú
__module__Ú__qualname__r   r   r   r)   r   r   r   r   r   $   s   
r   c                   s    e Zd Z‡ fdd„ZdZ‡  ZS )ÚExtractMethodc                s   t t| ƒj||Ž d S )N)Úsuperr-   r   )r   ÚargsÚkwds)Ú	__class__r   r   r   N   s    zExtractMethod.__init__Úmethod)r*   r+   r,   r   r#   Ú__classcell__r   r   )r1   r   r-   L   s   r-   c                   s    e Zd Z‡ fdd„ZdZ‡  ZS )ÚExtractVariablec                s&   t |ƒ}d|d< tt| ƒj||Ž d S )NTr   )Údictr.   r4   r   )r   r/   r0   )r1   r   r   r   V   s    zExtractVariable.__init__r   )r*   r+   r,   r   r#   r3   r   r   )r1   r   r4   T   s   r4   c               @   sž   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdd	„ Zd
d„ Z	ddd„Z
edd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZdZedd„ ƒZdS )r"   z3Holds information about the extract to be performedc	       	      C   sh   || _ || _| |¡| _| j ¡ | _| jj| _| jj| _|| _	|| _
|| _|  ||¡ |  ¡  || _d S )N)r   r   Zget_pymoduleÚpymoduleZ	get_scopeÚglobal_scopeÚsource_coder   ÚlinesÚnew_namer   r    Ú_init_partsÚ_init_scoper!   )	r   r   r   ÚstartÚendr:   r   r    r!   r   r   r   r   a   s    

z_ExtractInfo.__init__c             C   sŠ   |   |¡| j |ddf| _| j | j | jd ¡¡d }| j | j | jd ¡¡d }||f| _| j | jd ¡| j | jd ¡f| _	d S )NT)r>   r   r   )
Ú_choose_closest_line_endÚregionÚlogical_linesÚlogical_line_inr9   Úget_line_numberÚregion_linesÚget_line_startÚget_line_endÚlines_region)r   r=   r>   r   r   r   r;   p   s    
z_ExtractInfo._init_partsc             C   s   | j jS )N)r6   rA   )r   r   r   r   rA   }   s    z_ExtractInfo.logical_linesc             C   sL   | j d }| j |¡}| ¡ dkr4| ¡ |kr4|j}|| _|  | j¡| _d S )Nr   ZModule)	rD   r7   Úget_inner_scope_for_lineÚget_kindÚ	get_startÚparentÚscopeÚ_get_scope_regionÚscope_region)r   Ú
start_linerL   r   r   r   r<      s    
z_ExtractInfo._init_scopec             C   s$   | j  | ¡ ¡| j  | ¡ ¡d fS )Nr   )r9   rE   rJ   rF   Úget_end)r   rL   r   r   r   rM   ‰   s    z_ExtractInfo._get_scope_regionFc             C   sv   | j  |¡}| j  |¡}| j  |¡}| j||…  ¡ dkrL|rF|d S |S n&| j||…  ¡ dkrrt|t| jƒƒS |S )NÚ r   )r9   rC   rE   rF   r   ÚstripÚminr   )r   r   r>   ÚlinenoZ
line_startZline_endr   r   r   r?      s    z%_ExtractInfo._choose_closest_line_endc             C   s0   | j | jko.| j | jd ¡| j | jd ¡kS )Nr   r   )r@   rG   rA   rB   rD   )r   r   r   r   Úone_lineš   s    z_ExtractInfo.one_linec             C   s   | j jd kS )N)rL   rK   )r   r   r   r   r'       s    z_ExtractInfo.global_c             C   s   | j jd k	o| j j ¡ dkS )NZClass)rL   rK   rI   )r   r   r   r   r2   ¤   s    z_ExtractInfo.methodc             C   s   t  | jj| jd ¡S )Nr   )r	   Úget_indentsr6   r9   rD   )r   r   r   r   Úindents©   s    
z_ExtractInfo.indentsc             C   s    | j r
dS t | jj| j ¡ ¡S )Nr   )r'   r	   rV   r6   r9   rL   rJ   )r   r   r   r   Úscope_indents®   s    
z_ExtractInfo.scope_indentsc             C   s   | j | jd | jd … S )Nr   r   )r   r@   )r   r   r   r   Ú	extractedµ   s    z_ExtractInfo.extractedNc             C   s&   | j dkr t| jƒ}t |¡| _ | j S )z1Does the extracted piece contain return statementN)Ú	_returnedÚ_parse_textrY   r   Ú_returns_last)r   Únoder   r   r   Úreturned»   s    

z_ExtractInfo.returned)F)r*   r+   r,   Ú__doc__r   r;   ÚpropertyrA   r<   rM   r?   rU   r'   r2   rW   rX   rY   rZ   r^   r   r   r   r   r"   ^   s   
r"   c               @   s   e Zd ZdZdd„ ZdS )Ú_ExtractCollectorz6Collects information needed for performing the extractc             C   s.   d | _ d | _i | _d | _d | _d | _d | _d S )N)Ú
definitionÚbody_patternÚchecksÚreplacement_patternÚmatchesZreplacementsÚdefinition_location)r   r(   r   r   r   r   Ç   s    z_ExtractCollector.__init__N)r*   r+   r,   r_   r   r   r   r   r   ra   Ä   s   ra   c               @   sL   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S )r$   c             C   s   || _ tƒ | j ƒ d S )N)r(   Ú_ExceptionalConditionChecker)r   r(   r   r   r   r   Ó   s    z_ExtractPerformer.__init__c             C   sb   |   ¡ }t | jj¡}|j}|j\}}| jj |¡}t	 
||¡}| |||¡ |  ||¡ | ¡ S )N)Ú_collect_infor   ZChangeCollectorr(   r   rb   rg   r9   rE   r	   Úfix_indentationr&   Ú_replace_occurrencesZget_changed)r   Úextract_infoÚcontentrb   rT   rW   r   Zindentedr   r   r   r%   ×   s    
z_ExtractPerformer.extractc             C   sš   x”|j D ]Š}t |j¡}i }xP| ¡ D ]D}| |¡}|rbt | |¡¡\}}	| jj	||	… ||< q&|||< q&W | 
¡ }
| |
d |
d | |¡¡ qW d S )Nr   r   )rf   r
   ZCodeTemplatere   Z	get_namesÚget_astr   Znode_regionr(   r   Ú
get_regionr&   Z
substitute)r   rm   rl   ÚmatchZreplacementÚmappingÚnamer]   r=   r>   r@   r   r   r   rk   â   s    
z&_ExtractPerformer._replace_occurrencesc             C   s,   t | jƒ}|  |¡ |  |¡ |  |¡ |S )N)ra   r(   Ú_find_definitionÚ_find_matchesÚ_find_definition_location)r   Zextract_collectorr   r   r   ri   ò   s
    



z_ExtractPerformer._collect_infoc       
      C   s~   |   ¡ }t | jj¡}g }xX|D ]P\}}| |j|j||¡}d}x.|D ]&}	|	 ¡ \}}||k rF| 	|	¡ |}qFW q W ||_
d S )Néÿÿÿÿ)Ú_where_to_searchr
   ZSimilarFinderr(   r6   Zget_matchesrc   rd   ro   Úappendrf   )
r   Ú	collectorÚregionsÚfinderrf   r=   r>   Zregion_matchesZlast_match_endZregion_matchr   r   r   rt   ù   s    

z_ExtractPerformer._find_matchesc             C   sê   | j jrÜ| j js| j jr,dt| j jjƒfgS | j jr´| j js´| j j	j
}g }t| j j	ƒ}xX| ¡ D ]L}|dkrzt|ƒdkrzq`| j j | ¡ ¡}| j j | ¡ ¡}| ||f¡ q`W |S | j jrÆ| j jgS | j  | j j	j
¡gS n
| j jgS d S )Nr   r2   )r(   r    r!   r'   r   r6   r8   r2   r   rL   rK   Ú_get_function_kindZ
get_scopesr9   rE   rJ   rF   rP   rx   rN   rM   r@   )r   Zclass_scoperz   Zmethod_kindrL   r=   r>   r   r   r   rw   	  s(    

z"_ExtractPerformer._where_to_searchc             C   sh   g }x@|j D ]6}| jj | ¡ d ¡}| jj |¡d }| |¡ qW t| j|ƒ}| 	¡ | 
¡ f|_d S )Nr   )rf   r(   r9   rC   ro   rA   rB   rx   Ú_DefinitionLocationFinderÚfind_linenoÚfind_indentsrg   )r   ry   Úmatched_linesrp   r=   rO   Zlocation_finderr   r   r   ru   "  s    z+_ExtractPerformer._find_definition_locationc             C   sJ   | j jrt| j ƒ}n
t| j ƒ}| ¡ |_| ¡ |_| ¡ |_	| 
¡ |_d S )N)r(   r   Ú_ExtractVariablePartsÚ_ExtractMethodPartsÚget_definitionrb   Úget_body_patternrc   Úget_replacement_patternre   Ú
get_checksrd   )r   ry   Úpartsr   r   r   rs   ,  s    



z"_ExtractPerformer._find_definitionN)r*   r+   r,   r   r%   rk   ri   rt   rw   ru   rs   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S )r}   c             C   s(   || _ || _|s$| j | j jd ¡ d S )Nr   )r(   r€   rx   rD   )r   r(   r€   r   r   r   r   9  s    z"_DefinitionLocationFinder.__init__c             C   sn   | j jr| j js|  ¡ S | j js(| j jrf|  | j j¡}| j j ¡ }t	| j
| ¡ d g ƒ}t ||¡S |  ¡ S )Nr   )r(   r   r!   Ú_get_before_liner'   Ú_find_toplevelrL   r6   rn   Úsortedr€   rP   r   Úfind_visibleÚ_get_after_scope)r   Útoplevelr   Únewlinesr   r   r   r~   @  s    z%_DefinitionLocationFinder.find_linenoc             C   s*   |}|j d k	r&x|j j d k	r$|j }qW |S )N)rK   )r   rL   r   r   r   r   r‰   J  s
    

z(_DefinitionLocationFinder._find_toplevelc             C   s@   | j jr$| j js$t | j j|  ¡ ¡S | j js4| j jr8dS | j jS )Nr   )	r(   r   r!   r	   rV   r9   rˆ   r'   rX   )r   r   r   r   r   Q  s    

z&_DefinitionLocationFinder.find_indentsc             C   s   | j jj ¡ }t || j¡S )N)r(   rL   Úpyobjectrn   r   r‹   r€   )r   r   r   r   r   rˆ   Z  s    z*_DefinitionLocationFinder._get_before_linec             C   s   | j j ¡ d S )Nr   )r(   rL   rP   )r   r   r   r   rŒ   ^  s    z*_DefinitionLocationFinder._get_after_scopeN)	r*   r+   r,   r   r~   r‰   r   rˆ   rŒ   r   r   r   r   r}   7  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S )rh   c             C   s*   |   |¡ |jr|  |¡ n
|  |¡ d S )N)Úbase_conditionsrU   Úone_line_conditionsÚmulti_line_conditions)r   r(   r   r   r   Ú__call__d  s    
z%_ExceptionalConditionChecker.__call__c             C   s°   |j d |jd krtdƒ‚|jd }|j |¡}||jkrP| ¡ |krPtdƒ‚y>|j|j d |j d … }|j	rzd| }t
 |¡rŒtdƒ‚W n tk
rª   tdƒ‚Y nX d S )Nr   z&Bad region selected for extract methodr   z(%s)z:A break/continue without having a matching for/while loop.z3Extracted piece should contain complete statements.)r@   rN   r   rD   r7   rH   rL   rP   r   rU   Ú_UnmatchedBreakOrContinueFinderÚ
has_errorsÚSyntaxError)r   r(   Úend_lineZ	end_scoperY   r   r   r   r   k  s    

z,_ExceptionalConditionChecker.base_conditionsc             C   s*   |   |¡rtdƒ‚|jr&|js&tdƒ‚d S )Nz#Should extract complete statements.z0Extract variable should not span multiple lines.)Ú_is_region_on_a_wordr   r   rU   )r   r(   r   r   r   r‘   }  s    
z0_ExceptionalConditionChecker.one_line_conditionsc             C   s|   t |j|jd |jd … ƒ}t |¡}|dkr8tdƒ‚t |¡rJtdƒ‚|dkrdt |¡sdtdƒ‚|j|jkrxtdƒ‚d S )Nr   r   z3Extracted piece can have only one return statement.z-Extracted piece cannot have yield statements.z$Return should be the last statement.z3Extracted piece should contain complete statements.)	r[   r   r@   r   Z_return_countr   Z_yield_countr\   rG   )r   r(   r]   Úcountr   r   r   r’   „  s    

z2_ExceptionalConditionChecker.multi_line_conditionsc             C   sB   |j d dkr$|  ||j d d ¡s:|  ||j d d ¡r>dS d S )Nr   r   T)r@   Ú_is_on_a_word)r   r(   r   r   r   r˜   “  s    z1_ExceptionalConditionChecker._is_region_on_a_wordc             C   sN   |j | }| ¡ s|dkr,|d t|j ƒkr0dS |j |d  }| ¡ pL|dkS )NÚ_r   F)r   Úisalnumr   )r   r(   r   ÚprevÚnextr   r   r   rš   ™  s    
z*_ExceptionalConditionChecker._is_on_a_wordN)	r*   r+   r,   r“   r   r‘   r’   r˜   rš   r   r   r   r   rh   b  s   rh   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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   s   || _ |  ¡ | _d S )N)r(   Ú_create_info_collectorÚinfo_collector)r   r(   r   r   r   r   ¤  s    z_ExtractMethodParts.__init__c             C   s$   | j jrd|  ¡  S d|  ¡  S d S )Nz
%s
z
%s)r(   r'   Ú_get_function_definition)r   r   r   r   rƒ   ¨  s    z"_ExtractMethodParts.get_definitionc             C   s0   g }|  |  ¡ ¡ |  |  ¡ ¡ t |  ¡ |¡S )N)ÚextendÚ_find_function_argumentsÚ_find_function_returnsr
   Úmake_patternÚ	_get_call)r   Ú	variablesr   r   r   r…   ®  s    z+_ExtractMethodParts.get_replacement_patternc             C   s>   g }|  |  ¡ ¡ |  |  ¡ ¡ |  |  ¡ ¡ t |  ¡ |¡S )N)r¢   r£   r¤   Ú_find_tempsr
   r¥   Ú	_get_body)r   r§   r   r   r   r„   ´  s
    z$_ExtractMethodParts.get_body_patternc             C   s$   t  | jjd¡}| jjr d| }|S )Nr   z(%s))r	   rj   r(   rY   rU   )r   Úresultr   r   r   r©   »  s    z_ExtractMethodParts._get_bodyc             C   s   t  | jj|  ¡ ¡S )N)r   Z
find_tempsr(   r   r©   )r   r   r   r   r¨   Á  s    
z_ExtractMethodParts._find_tempsc             C   sF   | j jrB| j jsBt| j jƒdkrBt | j jjj¡}|  	¡ d| iS i S )Nr2   ztype=)
r(   r2   r!   r|   rL   r
   Z_pydefined_to_strrK   r   Ú_get_self_name)r   Ú
class_namer   r   r   r†   Å  s    z_ExtractMethodParts.get_checksc             C   sx   | j j ¡ d }| j jd | }| j jd | }t||| j jƒ}| j j| j jd | j jd … }t|ƒ}t	 
||¡ |S )Nr   r   )r(   rL   rJ   rD   Ú_FunctionInformationCollectorr'   r   rN   r[   r   Úwalk)r   ZzerorO   r—   r    Úbodyr]   r   r   r   rŸ   Í  s    
z*_ExtractMethodParts._create_info_collectorc             C   s’   |   ¡ }|  ¡ }g }| jjr>| jjs>t| jjƒdkr>| d¡ | d|  |¡ ¡ |  	|¡}t
 | jj¡}t
 ||¡}| |¡ d |¡}|d S )Nr2   z@staticmethod
zdef %s:
rQ   Ú
)r£   r¤   r(   r2   r!   r|   rL   rx   Ú_get_function_signatureÚ_get_unindented_function_bodyr	   Z
get_indentr   Zindent_linesÚjoin)r   r/   Úreturnsrª   Úunindented_bodyrW   Zfunction_bodyrb   r   r   r   r¡   Ù  s    



z,_ExtractMethodParts._get_function_definitionc             C   sd   t |ƒ}d}|  ¡ rJ|  ¡ }|d kr,tdƒ‚||kr>| |¡ | d|¡ || jj d|  |¡  S )NrQ   z:Extracting a method from a function with no self argument.r   z(%s))	ÚlistÚ_extracting_methodr«   r   ÚremoveÚinsertr(   r:   Ú_get_comma_form)r   r/   ÚprefixÚ	self_namer   r   r   r±   é  s    

z+_ExtractMethodParts._get_function_signaturec             C   s"   | j jo | j j o t| j jƒdkS )Nr2   )r(   r2   r!   r|   rL   )r   r   r   r   r·   ÷  s    z&_ExtractMethodParts._extracting_methodc             C   s   | j jj ¡ }|r|d S d S )Nr   )r(   rL   r   Zget_param_names)r   Zparam_namesr   r   r   r«   û  s    z"_ExtractMethodParts._get_self_namec             C   sv   d}| j jr\| j js\t| j jƒdkrH|  ¡ }||kr>| |¡ |d }n| j jjj 	¡ d }|d| j j
|  |¡f  S )NrQ   r2   Ú.z%s(%s))r(   r2   r!   r|   rL   r«   r¸   rK   r   Zget_namer:   rº   )r   r/   r»   r¼   r   r   r   Ú_get_function_call   s    


z&_ExtractMethodParts._get_function_callc             C   s:   d}|r6||d 7 }x |dd … D ]}|d| 7 }q"W |S )NrQ   r   r   z, r   )r   Únamesrª   rr   r   r   r   rº     s    z#_ExtractMethodParts._get_comma_formc             C   sZ   | j jr|  ¡ }|  |¡S |  ¡ }|  ¡ }d}|r@|  |¡d }| j jrLd}||  |¡ S )NrQ   z = zreturn )r(   rU   r£   r¾   r¤   rº   r^   )r   r/   r´   Zcall_prefixr   r   r   r¦     s    
z_ExtractMethodParts._get_callc             C   sÀ   | j jr| j jsdS | j jsX| jj| jj@ }|| jj| jj@ | jj| jj	 @ O }t
|ƒS | j jd }|| j jd krŒ|t d| j j¡ ¡  }| j j|| j jd … }t |¡}t
| jj |¡ƒS )Nr   r   z\Sr   )r(   r'   r!   rU   r    Ú
prewrittenr   ÚpostreadÚmaybe_writtenÚwrittenr¶   r@   rG   ÚreÚsearchrY   r=   r   Ú_VariableReadsAndWritesFinderÚfind_reads_for_one_linersÚintersection)r   rª   r=   Zfunction_definitionr   r   r   r   r£   "  s"    
z,_ExtractMethodParts._find_function_argumentsc             C   s4   | j js| j jrg S | jj| jjB }t|| jj@ ƒS )N)r(   rU   r^   r    rÃ   rÂ   r¶   rÁ   )r   rÃ   r   r   r   r¤   7  s
    
z*_ExtractMethodParts._find_function_returnsc             C   sF   | j jrdt| j jƒ S | j j}t |d¡}|rB|d|  |¡ 7 }|S )Nzreturn r   z

return %s)r(   rU   Ú_join_linesrY   r	   rj   rº   )r   r´   Zextracted_bodyrµ   r   r   r   r²   >  s    z1_ExtractMethodParts._get_unindented_function_bodyN)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‚   ¢  s$   r‚   c               @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )r   c             C   s
   || _ d S )N)r(   )r   r(   r   r   r   r   J  s    z_ExtractVariableParts.__init__c             C   s    | j jd t| j jƒ d }|S )Nz = r°   )r(   r:   rÉ   rY   )r   rª   r   r   r   rƒ   M  s    z$_ExtractVariableParts.get_definitionc             C   s   d| j j ¡  S )Nz(%s))r(   rY   rR   )r   r   r   r   r„   R  s    z&_ExtractVariableParts.get_body_patternc             C   s   | j jS )N)r(   r:   )r   r   r   r   r…   U  s    z-_ExtractVariableParts.get_replacement_patternc             C   s   i S )Nr   )r   r   r   r   r†   X  s    z _ExtractVariableParts.get_checksN)r*   r+   r,   r   rƒ   r„   r…   r†   r   r   r   r   r   H  s
   r   c               @   sd   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d„ ZdS )r­   c             C   sR   || _ || _|| _tƒ | _tƒ | _tƒ | _tƒ | _tƒ | _tƒ | _	d| _
d| _d S )NTF)r=   r>   Ú	is_globalr   rÀ   rÂ   rÃ   r   rÁ   ÚpostwrittenÚhost_functionÚconditional)r   r=   r>   rÊ   r   r   r   r   ^  s    z&_FunctionInformationCollector.__init__c             C   sf   | j |  kr| jkrBn n&|| jkrB| jr6|| jkrB| j |¡ | j|k rb|| jkrb| j |¡ d S )N)	r=   r>   rÃ   rÍ   rÂ   r   ÚaddrË   rÁ   )r   rr   rT   r   r   r   Ú_read_variablek  s    


z,_FunctionInformationCollector._read_variablec             C   sl   | j |  kr| jkr<n n | jr0| j |¡ n| j |¡ | j |krR| j |¡ | j|k rh| j |¡ d S )N)r=   r>   rÍ   rÂ   rÎ   rÃ   rÀ   rË   )r   rr   rT   r   r   r   Ú_written_variablet  s    

z/_FunctionInformationCollector._written_variablec             C   s¬   | j sR| jrRd| _x t|jƒD ]}|  ||j¡ qW xr|jD ]}t || ¡ q<W nV|  |j	|j¡ t
ƒ }x|jD ]}t ||¡ qpW x"|j|j D ]}|  ||j¡ q’W d S )NF)rÊ   rÌ   Ú_get_argnamesr/   rÐ   rT   r¯   r   r®   rr   rÆ   r   rÃ   rÏ   )r   r]   rr   ÚchildÚvisitorr   r   r   Ú_FunctionDef  s    z*_FunctionInformationCollector._FunctionDefc             C   sF   t |jtjtjfƒr$|  |j|j¡ t |jtjƒsB|  |j|j¡ d S )N)	Ú
isinstanceÚctxr   ÚStoreÚAugStorerÐ   ÚidrT   rÏ   )r   r]   r   r   r   Ú_NameŽ  s    z#_FunctionInformationCollector._Namec             C   s.   t  |j| ¡ x|jD ]}t  || ¡ qW d S )N)r   r®   ÚvalueZtargets)r   r]   rÒ   r   r   r   Ú_Assign”  s    z%_FunctionInformationCollector._Assignc             C   s   |   |j|j¡ d S )N)rÐ   rr   rT   )r   r]   r   r   r   Ú	_ClassDef™  s    z'_FunctionInformationCollector._ClassDefc             C   s8   d| _ z$xt |¡D ]}t || ¡ qW W d d| _ X d S )NTF)rÍ   r   Úget_child_nodesr®   )r   r]   rÒ   r   r   r   Ú_handle_conditional_nodeœ  s
    z6_FunctionInformationCollector._handle_conditional_nodec             C   s   |   |¡ d S )N)rß   )r   r]   r   r   r   Ú_If¤  s    z!_FunctionInformationCollector._Ifc             C   s   |   |¡ d S )N)rß   )r   r]   r   r   r   Ú_While§  s    z$_FunctionInformationCollector._Whilec             C   sl   d| _ zXt |j| ¡ t |j| ¡ x|jD ]}t || ¡ q,W x|jD ]}t || ¡ qHW W d d| _ X d S )NTF)rÍ   r   r®   ÚiterÚtargetr¯   Úorelse)r   r]   rÒ   r   r   r   Ú_Forª  s    z"_FunctionInformationCollector._ForN)r*   r+   r,   r   rÏ   rÐ   rÔ   rÚ   rÜ   rÝ   rß   rà   rá   rå   r   r   r   r   r­   \  s   	r­   c             C   sD   dd„ | j D ƒ}| jr(| t | j¡¡ | jr@| t | j¡¡ |S )Nc             S   s"   g | ]}t |tjƒrt |¡‘qS r   )rÕ   r   Zast_arg_typeÚget_ast_arg_arg)Ú.0r]   r   r   r   ú
<listcomp>º  s    z!_get_argnames.<locals>.<listcomp>)r/   Zvarargrx   r   ræ   Zkwarg)Z	argumentsrª   r   r   r   rÑ   ¹  s    rÑ   c               @   sD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zed	d
„ ƒZedd„ ƒZ	dS )rÆ   c             C   s   t ƒ | _t ƒ | _d S )N)ÚsetrÃ   r   )r   r   r   r   r   Å  s    z&_VariableReadsAndWritesFinder.__init__c             C   s@   t |jtjtjfƒr"| j |j¡ t |tjƒs<| j |j¡ d S )N)	rÕ   rÖ   r   r×   rØ   rÃ   rÎ   rÙ   r   )r   r]   r   r   r   rÚ   É  s    z#_VariableReadsAndWritesFinder._Namec             C   sL   | j  |j¡ tƒ }xt |¡D ]}t ||¡ q W | j |j|j  ¡ d S )N)	rÃ   rÎ   rr   rÆ   r   rÞ   r®   r   Úupdate)r   r]   rÓ   rÒ   r   r   r   rÔ   Ï  s
    z*_VariableReadsAndWritesFinder._FunctionDefc             C   s   | j  |j¡ d S )N)rÃ   rÎ   rr   )r   r]   r   r   r   Ú_ClassÖ  s    z$_VariableReadsAndWritesFinder._Classc             C   sR   |   ¡ dkrtƒ tƒ fS t| tƒr,|  d¡} t| ƒ}tƒ }t ||¡ |j	|j
fS )NrQ   zutf-8)rR   ré   rÕ   ZunicodeÚencoder[   rÆ   r   r®   r   rÃ   )Úcoder]   rÓ   r   r   r   Úfind_reads_and_writesÙ  s    

z3_VariableReadsAndWritesFinder.find_reads_and_writesc             C   s8   |   ¡ dkrtƒ tƒ fS t| ƒ}tƒ }t ||¡ |jS )NrQ   )rR   ré   r[   rÆ   r   r®   r   )rí   r]   rÓ   r   r   r   rÇ   ä  s    z7_VariableReadsAndWritesFinder.find_reads_for_one_linersN)
r*   r+   r,   r   rÚ   rÔ   rë   Ústaticmethodrî   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edd„ ƒZdS )r”   c             C   s   d| _ d| _d S )NFr   )ÚerrorÚ
loop_count)r   r   r   r   r   ð  s    z(_UnmatchedBreakOrContinueFinder.__init__c             C   s   |   |¡ d S )N)Úloop_encountered)r   r]   r   r   r   rå   ô  s    z$_UnmatchedBreakOrContinueFinder._Forc             C   s   |   |¡ d S )N)rò   )r   r]   r   r   r   rá   ÷  s    z&_UnmatchedBreakOrContinueFinder._Whilec             C   s~   |  j d7  _ x|jD ]}t || ¡ qW |  j d8  _ |jrzt|jttfƒrlx*|jD ]}t || ¡ qVW nt |j| ¡ d S )Nr   )rñ   r¯   r   r®   rä   rÕ   r¶   Útuple)r   r]   rÒ   Znode_r   r   r   rò   ú  s    z0_UnmatchedBreakOrContinueFinder.loop_encounteredc             C   s   |   ¡  d S )N)Ú
check_loop)r   r]   r   r   r   Ú_Break  s    z&_UnmatchedBreakOrContinueFinder._Breakc             C   s   |   ¡  d S )N)rô   )r   r]   r   r   r   Ú	_Continue	  s    z)_UnmatchedBreakOrContinueFinder._Continuec             C   s   | j dk rd| _d S )Nr   T)rñ   rð   )r   r   r   r   rô     s    
z*_UnmatchedBreakOrContinueFinder.check_loopc             C   s   d S )Nr   )r   r]   r   r   r   rÔ     s    z,_UnmatchedBreakOrContinueFinder._FunctionDefc             C   s   d S )Nr   )r   r]   r   r   r   rÝ     s    z)_UnmatchedBreakOrContinueFinder._ClassDefc             C   s0   |   ¡ dkrdS t| ƒ}tƒ }t ||¡ |jS )NrQ   F)rR   r[   r”   r   r®   rð   )rí   r]   rÓ   r   r   r   r•     s    z*_UnmatchedBreakOrContinueFinder.has_errorsN)r*   r+   r,   r   rå   rá   rò   rõ   rö   rô   rÔ   rÝ   rï   r•   r   r   r   r   r”   î  s   r”   c             C   s
   | j  ¡ S )N)r   rI   )rL   r   r   r   r|      s    r|   c             C   s   t  | d¡} t | ¡}|S )Nr   )r	   rj   r   Úparse)r¯   r]   r   r   r   r[   $  s    
r[   c             C   sP   g }x@|   ¡ D ]4}| d¡r4| |d d…  ¡ ¡ q| | ¡ ¡ qW d |¡S )Nú\rv   ú )Ú
splitlinesÚendswithrx   rR   r³   )rí   r9   Úliner   r   r   rÉ   *  s    
rÉ   )%rÄ   Zrope.base.utils.datastructuresr   Z	rope.baser   r   Zrope.base.changer   r   Zrope.base.exceptionsr   Zrope.base.utilsr   Zrope.refactorr	   r
   r   r   r   Úobjectr   r-   r4   r"   ra   r$   r}   rh   r‚   r   r­   rÑ   rÆ   r”   r|   r[   rÉ   r   r   r   r   Ú<module>   s0   (
ff+@ ']
+2