
    Æe                         d dl mZmZmZmZmZmZmZmZ d dl	m
Z
mZmZ  G d d      Zd Zd Zd Zd Zd	 Zd
 Z G d dej(                        Zy)    )astchangeevaluate
exceptionslibutilspynames	pyobjects
taskhandle)restructuresimilarfindersourceutilsc                   ~    e Zd ZdZd Zd Zdej                  fdZd Z	ddZ
d Zd	 Zd
 Zd ZddZd Zd ZdZdZy)UseFunctionz'Try to use a function wherever possiblec                    || _         || _        |j                  |      }t        j                  ||      }|t        j                  d      |j                         | _        t        | j                  t        j                        r.t        | j                  j                  t        j                        st        j                  d      | j                  j                         j                         | _        | j#                          y )NzUnresolvable name selectedz.Use function works for global functions, only.)projectoffsetget_pymoduler   eval_locationr   RefactoringError
get_object
pyfunction
isinstancer	   
PyFunctionparentPyModule
get_moduleget_resourceresource_check_returns)selfr   r   r   this_pymodulepynames         ;/usr/lib/python3/dist-packages/rope/refactor/usefunction.py__init__zUseFunction.__init__   s    ,,X6''v>>--.JKK ++-$//9+?+?@
OO""I$6$6I
 --@  224AAC    c                    | j                   j                         }t        |      rt        j                  d      t        |      }|dkD  rt        j                  d      |dk(  r!t        |      st        j                  d      y y )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returnss      r#   r   zUseFunction._check_returns"   s    &&(--@   %Q;--K  a<d 3--C  !4<r%   Nc                    || j                   j                         }t        j                  d| j                  j                         z        }| j                  |v r&t        |      }|j                  | j                         | j                  |      j                  D ]  }|j                  |        | j                  |v r?| j                  | j                  g|d      j                  D ]  }|j                  |        |S )NzUsing function <%s>F)others)r   get_python_filesr   	ChangeSetr   get_namer   listremove_restructurechanges
add_change)r    	resourcestask_handler6   newresourcescs         r#   get_changeszUseFunction.get_changes2   s    557I""#84??;S;S;U#UV==I%	?L.""<=EE 	"Aq!	"==I%&&U ' g& ""1%& r%   c                 6    | j                   j                         S N)r   r2   r    s    r#   get_function_namezUseFunction.get_function_nameB   s    ''))r%   c                 J   | j                         }| j                  |      }d }|rd| j                         z  g}t        j                  | j
                        }d| j                  |fi}d|i}	t        j                  | j                  |||	|      }
|
j                  ||      S )N)import_z	import %sskip )argsimports)r8   r9   )_make_pattern
_make_goal_module_namer   get_body_regionr   r   r   Restructurer   r<   )r    r8   r9   r/   patterngoalrF   body_region
args_valuerE   restructurings              r#   r5   zUseFunction._restructureE   s    $$&v."T%6%6%889G!11$//Bt}}k:;
J#//LL'4dG
 ((9+(VVr%   c                 J    t        | j                  | j                               S r>   )
find_tempsr   	_get_bodyr?   s    r#   _find_tempszUseFunction._find_tempsU   s    $,,(899r%   c                 @    t        j                  | j                        S r>   )r   modnamer   r?   s    r#   rI   zUseFunction._module_nameX   s    ..r%   c                 .   | j                   j                         }| j                         }t        j                  |dd      }t        |      }|j                  | j                                | j                         r| j                         rd| j                  z  }n&dj                  | j                  | j                        }t        j                  |d| j                  z  |      }|j                  | j                         t        j                  ||      S )Nreturnpass${%s}z{} = ${{{}}}zreturn ${%s})r   get_param_namesrS   r   replacer3   extendrT   _does_return_is_expression_rope_returnedformat_rope_resultappendr   make_pattern)r    paramsbody	wildcardsreplacements        r#   rG   zUseFunction._make_pattern[   s    002~~""46:L	))+,""$%(;(;;,33%%t':': &&nt':'::KD T../))$	::r%   c                 @    t        j                  | j                        S r>   )r   get_bodyr   r?   s    r#   rS   zUseFunction._get_bodyn   s    ##DOO44r%   c                 f   | j                   j                         }| j                   j                         }|r| j                         dz   |z   }dj	                  |dj                  d |D                    }| j                         r,| j                         sdj	                  | j                  |      }|S )N.z{}({})z, c              3   &   K   | ]	  }d |z    yw)rZ   N ).0ps     r#   	<genexpr>z)UseFunction._make_goal.<locals>.<genexpr>x   s     4w{4s   z${{{}}} = {})	r   r[   r2   rI   ra   joinr^   r_   rb   )r    rB   re   function_namerM   s        r#   rH   zUseFunction._make_goalq   s    002002 --/#5EMII4V44
 t':':'<!((!!D r%   c                 Z    | j                         }t        j                  |dd      }||k7  S )Nzreturn ${result}rD   )rS   r   r\   )r    rf   removed_returns      r#   r^   zUseFunction._does_return   s.    ~~$,,T3ErJ%%r%   c                 b    t        | j                  j                         j                        dk(  S Nr'   )lenr   r(   rf   r?   s    r#   r_   zUseFunction._is_expression   s%    4??**,112a77r%   _rope__result_rope__returned)T)F)__name__
__module____qualname____doc__r$   r   r
   DEFAULT_TASK_HANDLEr<   r@   r5   rT   rI   rG   rS   rH   r^   r_   rb   r`   rn   r%   r#   r   r      s[    1"  %)j6T6T  *W :/;&5 &
8 #L&Nr%   r   c                 D   dt        j                  |d      z   }t        j                  | |      }|j	                         j                         d   }|j                         j                         D cg c]!  \  }}t        |t        j                        r|# c}}S c c}}w )Nz	def f():
   r   )r   indent_linesr   get_string_module	get_scope
get_scopes	get_namesitemsr   r   AssignedName)r   codepymodulefunction_scopenamer"   s         r#   rR   rR      s    +224;;D))'48H'')446q9N +446<<>D&fg223 	  s   2&Bc                 l    | j                   xr' t        | j                   d   t        j                        S )N)rf   r   r   Returnr,   s    r#   r+   r+      s$    99>DIIbM3::>>r%   c                     t        t        d      syt        | j                        xrK t	        | j                        dk(  xr1 t        | j                  d   j                  t        j                        S )N	NamedExprFr'   r   )hasattrr   boolrf   rx   r   valuer   r   s    r#   _namedexpr_lastr      sU    3$TYY 	;		Na	;tyy}**CMM:r%   c                 P    t               }|j                  |        |j                  S r>   )_ReturnOrYieldFinderstart_walkingyieldsr,   visitors     r#   r)   r)      s"    "$G$>>r%   c                 P    t               }|j                  |        |j                  S r>   )r   r   r-   r   s     r#   r*   r*      s"    "$G$??r%   c                 P    t               }|j                  |        |j                  S r>   )r   r   named_expressionr   s     r#   _named_expr_countr      s$    "$G$###r%   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	r   c                 .    d| _         d| _        d| _        y )Nr   )r-   r   r   r?   s    r#   r$   z_ReturnOrYieldFinder.__init__   s     !r%   c                 .    | xj                   dz  c_         y rw   )r-   r    r,   s     r#   _Returnz_ReturnOrYieldFinder._Return   s    r%   c                 .    | xj                   dz  c_         y rw   )r   r   s     r#   
_NamedExprz_ReturnOrYieldFinder._NamedExpr   s    "r%   c                 .    | xj                   dz  c_         y rw   )r   r   s     r#   _Yieldz_ReturnOrYieldFinder._Yield   s    qr%   c                      y r>   rn   r   s     r#   _FunctionDefz!_ReturnOrYieldFinder._FunctionDef       r%   c                      y r>   rn   r   s     r#   	_ClassDefz_ReturnOrYieldFinder._ClassDef   r   r%   c                     |g}t        |t        j                        rt        t        j                  |            }|D ]  }| j                  |        y r>   )r   r   FunctionDefr3   iter_child_nodesvisit)r    r,   nodeschilds       r#   r   z"_ReturnOrYieldFinder.start_walking   sG    dCOO,--d34E 	EJJu	r%   N)
r{   r|   r}   r$   r   r   r   r   r   r   rn   r%   r#   r   r      s%    
#r%   r   N)	rope.baser   r   r   r   r   r   r	   r
   rope.refactorr   r   r   r   rR   r+   r   r)   r*   r   RopeNodeVisitorr   rn   r%   r#   <module>r      sZ   	 	 	 B A|' |'~?$3.. r%   