
    c                         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dS )    )astchangeevaluate
exceptionslibutilspynames	pyobjects
taskhandle)restructuresimilarfindersourceutilsc                   v    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dS )UseFunctionz'Try to use a function wherever possiblec                 
   || _         || _        |                    |          }t          j        ||          }|t          j        d          |                                | _        t          | j        t          j                  r$t          | j        j        t          j                  st          j        d          | j                                                                        | _        |                                  d S )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         9lib/python3.11/site-packages/rope/refactor/usefunction.py__init__zUseFunction.__init__   s    ,,X66'v>> 	L-.JKKK ++--$/9+?@@ 	
O"I$6I
 I
 	 -@   2244AACC    c                 &   | j                                         }t          |          rt          j        d          t          |          }|dk    rt          j        d          |dk    r#t          |          st          j        d          d S 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returnss      r#   r   zUseFunction._check_returns"   s    &&(( 	-@    %%Q; 	-K   a< 	d 3 3 	-C  	 	 	 	r%   Nc                    || j                                         }t          j        d| j                                        z            }| j        |v r)t          |          }|                    | j                   | 	                    ||          j
        D ]}|                    |           | j        |v r;| 	                    | j        g|d          j
        D ]}|                    |           |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	    	85577I"#84?;S;S;U;U#UVV=I% 	/	??L...""<==E 	" 	"Aq!!!!=I% 	&&&U '  & & ""1%%%%r%   c                 4    | j                                         S N)r   r2   r    s    r#   get_function_namezUseFunction.get_function_nameB   s    '')))r%   Tc                 H   |                                  }|                     |          }d }|rd|                                 z  g}t          j        | j                  }d| j        |fi}d|i}	t          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89G!1$/BBt}k:;
J#/L'4dG
 
 
 ((9+(VVVr%   c                 P    t          | j        |                                           S r>   )
find_tempsr   	_get_bodyr?   s    r#   _find_tempszUseFunction._find_tempsU   s    $,(8(8999r%   c                 4    t          j        | j                  S r>   )r   modnamer   r?   s    r#   rI   zUseFunction._module_nameX   s    ...r%   c                 4   | j                                         }|                                 }t          j        |dd          }t          |          }|                    |                                            |                                 rw| 	                                rd| j
        z  }n d                    | j        | j
                  }t          j        |d| j
        z  |          }|                    | 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2~~"46::LL	))++,,, 
	0""$$ %(;;,33%t':  &nt'::K D T.///)$	:::r%   c                 4    t          j        | j                  S r>   )r   get_bodyr   r?   s    r#   rS   zUseFunction._get_bodyn   s    #DO444r%   Fc                    | j                                         }| j                                         }|r|                                 dz   |z   }d                    |d                    d |D                                 }|                                 r/|                                 sd                    | j        |          }|S )N.z{}({})z, c              3       K   | ]	}d |z  V  
dS )rZ   N ).0ps     r#   	<genexpr>z)UseFunction._make_goal.<locals>.<genexpr>x   s&      44w{444444r%   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20022 	F --//#5EMII44V44444
 
  	t':':'<'< 	!((! D r%   c                 b    |                                  }t          j        |dd          }||k    S )Nzreturn ${result}rD   )rS   r   r\   )r    rf   removed_returns      r#   r^   zUseFunction._does_return   s1    ~~$,T3ErJJ%%r%   c                 `    t          | j                                        j                  dk    S Nr'   )lenr   r(   rf   r?   s    r#   r_   zUseFunction._is_expression   s&    4?**,,12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1  "    %)j6T     * * *W W W W : : :/ / /; ; ;&5 5 5    & & &
8 8 8 #L&NNNr%   r   c                    dt          j        |d          z   }t          j        | |          }|                                                                d         }d |                                                                D             S )Nz	def f():
   r   c                 L    g | ]!\  }}t          |t          j                  |"S rn   )r   r   AssignedName)ro   namer"   s      r#   
<listcomp>zfind_temps.<locals>.<listcomp>   s?       D&fg233  r%   )r   indent_linesr   get_string_module	get_scope
get_scopes	get_namesitems)r   codepymodulefunction_scopes       r#   rR   rR      s    +24;;;D)'488H''))4466q9N *4466<<>>   r%   c                 Z    | j         o$t          | j         d         t          j                  S )N)rf   r   r   Returnr,   s    r#   r+   r+      s!    9>DIbM3:>>>r%   c                     t          t          d          sdS t          | j                  oAt	          | j                  dk    o)t          | j        d         j        t          j                  S )N	NamedExprFr'   r   )hasattrr   boolrf   rx   r   valuer   r   s    r#   _namedexpr_lastr      s[    3$$ uTY 	;	NNa	;ty}*CM::r%   c                 V    t                      }|                    |            |j        S r>   )_ReturnOrYieldFinderstart_walkingyieldsr,   visitors     r#   r)   r)      s)    "$$G$>r%   c                 V    t                      }|                    |            |j        S r>   )r   r   r-   r   s     r#   r*   r*      s)    "$$G$?r%   c                 V    t                      }|                    |            |j        S r>   )r   r   named_expressionr   s     r#   _named_expr_countr      s*    "$$G$##r%   c                   8    e Zd Zd Zd Zd Zd Zd Zd Zd Z	dS )	r   c                 0    d| _         d| _        d| _        d S )Nr   )r-   r   r   r?   s    r#   r$   z_ReturnOrYieldFinder.__init__   s     !r%   c                 &    | xj         dz  c_         d S rw   )r-   r    r,   s     r#   _Returnz_ReturnOrYieldFinder._Return   s    r%   c                 &    | xj         dz  c_         d S rw   )r   r   s     r#   
_NamedExprz_ReturnOrYieldFinder._NamedExpr   s    "r%   c                 &    | xj         dz  c_         d S rw   )r   r   s     r#   _Yieldz_ReturnOrYieldFinder._Yield   s    qr%   c                     d S r>   rn   r   s     r#   _FunctionDefz!_ReturnOrYieldFinder._FunctionDef       r%   c                     d S r>   rn   r   s     r#   	_ClassDefz_ReturnOrYieldFinder._ClassDef   r   r%   c                     |g}t          |t          j                  r!t          t          j        |                    }|D ]}|                     |           d S r>   )r   r   FunctionDefr3   iter_child_nodesvisit)r    r,   nodeschilds       r#   r   z"_ReturnOrYieldFinder.start_walking   sc    dCO,, 	5-d334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      sL  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 B A A A A A A A A A|' |' |' |' |' |' |' |'~  ? ? ?      $ $ $    3.     r%   