B
    ¢èåSˆ  ã               @   sˆ   d dl mZmZmZmZmZmZmZ d dl mZ d dl	m
Z
mZmZ G dd„ deƒZdd„ Zdd	„ Zd
d„ Zdd„ ZG dd„ deƒZdS )é    )ÚchangeÚ
taskhandleÚevaluateÚ
exceptionsÚ	pyobjectsÚpynamesÚast)Úlibutils)ÚrestructureÚsourceutilsÚsimilarfinderc               @   s†   e Zd ZdZdd„ Zdd„ Zde ¡ fdd„Zd	d
„ Z	ddd„Z
dd„ Zdd„ Zdd„ Zdd„ Zd dd„Zdd„ Zdd„ ZdZdZdS )!ÚUseFunctionz'Try to use a function wherever possiblec             C   s‚   || _ || _| |¡}t ||¡}|d kr4t d¡‚| ¡ | _t	| jt
jƒr\t	| jjt
jƒsft d¡‚| j ¡  ¡ | _|  ¡  d S )NzUnresolvable name selectedz.Use function works for global functions, only.)ÚprojectÚoffsetZget_pymoduler   Zeval_locationr   ÚRefactoringErrorZ
get_objectÚ
pyfunctionÚ
isinstancer   Z
PyFunctionÚparentZPyModuleZ
get_moduleZget_resourceÚresourceÚ_check_returns)Úselfr   r   r   Zthis_pymoduleÚpyname© r   ú8lib/python3.7/site-packages/rope/refactor/usefunction.pyÚ__init__
   s    


zUseFunction.__init__c             C   sT   | j  ¡ }t|ƒrt d¡‚t|ƒ}|dkr6t d¡‚|dkrPt|ƒsPt d¡‚d S )Nz.Use function should not be used on generators.é   z9usefunction: Function has more than one return statement.z1usefunction: return should be the last statement.)r   Úget_astÚ_yield_countr   r   Ú_return_countÚ_returns_last)r   ÚnodeÚreturnsr   r   r   r      s    


zUseFunction._check_returnsNc             C   sž   |d kr| j  ¡ }t d| j ¡  ¡}| j|krDt|ƒ}| | j¡ x |  	||¡j
D ]}| |¡ qTW | j|kršx(| j	| jg|ddj
D ]}| |¡ qˆW |S )NzUsing function <%s>F)Úothers)r   Zget_python_filesr   Z	ChangeSetr   Úget_namer   ÚlistÚremoveÚ_restructureÚchangesZ
add_change)r   Ú	resourcesÚtask_handler'   ZnewresourcesÚcr   r   r   Úget_changes&   s    


zUseFunction.get_changesc             C   s
   | j  ¡ S )N)r   r#   )r   r   r   r   Úget_function_name7   s    zUseFunction.get_function_nameTc             C   sp   |   ¡ }| j|d}d }|r*d|  ¡  g}t | j¡}d| j|fi}d|i}	tj| j	|||	|d}
|
j
||dS )N)Úimport_z	import %sÚskipÚ )ÚargsÚimports)r(   r)   )Ú_make_patternÚ
_make_goalÚ_module_namer   Zget_body_regionr   r   r
   ZRestructurer   r+   )r   r(   r)   r"   ÚpatternÚgoalr1   Zbody_regionZ
args_valuer0   Zrestructuringr   r   r   r&   :   s    zUseFunction._restructurec             C   s   t | j|  ¡ ƒS )N)Ú
find_tempsr   Ú	_get_body)r   r   r   r   Ú_find_tempsJ   s    zUseFunction._find_tempsc             C   s   t  | j¡S )N)r	   Úmodnamer   )r   r   r   r   r4   M   s    zUseFunction._module_namec             C   sŽ   | j  ¡ }|  ¡ }t |dd¡}t|ƒ}| |  ¡ ¡ |  ¡ r‚|  	¡ rRd| j
 }nd| j| j
f }t |d| j
 |¡}| | j¡ t ||¡S )NÚreturnÚpassz${%s}z
%s = ${%s}zreturn ${%s})r   Úget_param_namesr8   r
   Úreplacer$   Úextendr9   Ú_does_returnÚ_is_expressionÚ_rope_returnedÚ_rope_resultÚappendr   Zmake_pattern)r   ÚparamsÚbodyZ	wildcardsZreplacementr   r   r   r2   P   s    


zUseFunction._make_patternc             C   s   t  | j¡S )N)r   Zget_bodyr   )r   r   r   r   r8   b   s    zUseFunction._get_bodyFc             C   sf   | j  ¡ }| j  ¡ }|r(|  ¡ d | }d|d dd„ |D ƒ¡f }|  ¡ rb|  ¡ sbd| j|f }|S )NÚ.z%s(%s)z, c             s   s   | ]}d | V  qdS )z${%s}Nr   )Ú.0Úpr   r   r   ú	<genexpr>k   s    z)UseFunction._make_goal.<locals>.<genexpr>z
${%s} = %s)r   r=   r#   r4   Újoinr@   rA   rC   )r   r-   rE   Zfunction_namer6   r   r   r   r3   e   s    

zUseFunction._make_goalc             C   s   |   ¡ }t |dd¡}||kS )Nzreturn ${result}r/   )r8   r
   r>   )r   rF   Zremoved_returnr   r   r   r@   p   s    zUseFunction._does_returnc             C   s   t | j ¡ jƒdkS )Nr   )Úlenr   r   rF   )r   r   r   r   rA   u   s    zUseFunction._is_expressionZ_rope__resultZ_rope__returned)T)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   ZNullTaskHandler+   r,   r&   r9   r4   r2   r8   r3   r@   rA   rC   rB   r   r   r   r   r      s    

r   c             C   sd   dt  |d¡ }t | |¡}g }| ¡  ¡ d }x.| ¡  ¡ D ]\}}t|t	j
ƒr>| |¡ q>W |S )Nz	def f():
é   r   )r   Zindent_linesr	   Zget_string_moduleZ	get_scopeZ
get_scopesZ	get_namesÚitemsr   r   ZAssignedNamerD   )r   ÚcodeZpymoduleÚresultZfunction_scopeÚnamer   r   r   r   r7   |   s    r7   c             C   s   | j ot| j d tjƒS )Néÿÿÿÿ)rF   r   r   ZReturn)r    r   r   r   r   ‡   s    r   c             C   s   t ƒ }| | ¡ |jS )N)Ú_ReturnOrYieldFinderÚstart_walkingÚyields)r    Úvisitorr   r   r   r   ‹   s    
r   c             C   s   t ƒ }| | ¡ |jS )N)rW   rX   r!   )r    rZ   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 )rW   c             C   s   d| _ d| _d S )Nr   )r!   rY   )r   r   r   r   r   ™   s    z_ReturnOrYieldFinder.__init__c             C   s   |  j d7  _ d S )Nr   )r!   )r   r    r   r   r   Ú_Return   s    z_ReturnOrYieldFinder._Returnc             C   s   |  j d7  _ d S )Nr   )rY   )r   r    r   r   r   Ú_Yield    s    z_ReturnOrYieldFinder._Yieldc             C   s   d S )Nr   )r   r    r   r   r   Ú_FunctionDef£   s    z!_ReturnOrYieldFinder._FunctionDefc             C   s   d S )Nr   )r   r    r   r   r   Ú	_ClassDef¦   s    z_ReturnOrYieldFinder._ClassDefc             C   s:   |g}t |tjƒrt |¡}x|D ]}t || ¡ q"W d S )N)r   r   ZFunctionDefZget_child_nodesÚwalk)r   r    ZnodesZchildr   r   r   rX   ©   s
    

z"_ReturnOrYieldFinder.start_walkingN)	rM   rN   rO   r   r[   r\   r]   r^   rX   r   r   r   r   rW   —   s   rW   N)Z	rope.baser   r   r   r   r   r   r   r	   Zrope.refactorr
   r   r   Úobjectr   r7   r   r   r   rW   r   r   r   r   Ú<module>   s   $u