
    c                         d dl Zd dlZd dlZd dlmZmZmZmZ d Z	d Z
 G d dej        j        j                  Z G d dej                  ZdS )	    N)	argumentsevaluatenameanalyze	pyobjectsc                 ,    t          | ||||           dS )zAnalyze `pymodule` for static object inference

    Analyzes scopes for collecting object information.  The analysis
    starts from inner scopes.

    N_analyze_node)pycorepymoduleshould_analyzesearch_subscopesfollowed_callss        0lib/python3.11/site-packages/rope/base/oi/soa.pyanalyze_moduler      s!     &(N4DnUUUUU    c                    	
  ||          rA|                                                                 D ]}t           |j        |||            ||          rt	          d|dz
            	d d 
	 
fd}t           ||r|nd           }t          j        j        	                    |
                                          D ]}|                    |           d S d S )Nr      c                     dS )NT 	pydefineds    r   <lambda>z_analyze_node.<locals>.<lambda>   s     r   c                     dS )NFr   r   s    r   r   z_analyze_node.<locals>.<lambda>   s     r   c                 .    t          |            d S Nr   )
pyfunctionnew_followed_callsr
   return_falsereturn_trues    r   _followz_analyze_node.<locals>._follow   s+    
K?Q    r   )	get_scope
get_scopesr	   pyobjectmax
SOAVisitorropebaseastiter_child_nodesget_astvisit)r
   r   r   r   r   scoper    visitorchildr   r   r   s   `        @@@r   r	   r	      s8   	"" ((**5577 	 	E8H.    ~i   ! NQ$677,,..	 	 	 	 	 	 	 	
 VY>0StTTY]33I4E4E4G4GHH 	! 	!EMM%    ! !	! 	!r   c                   N    e Zd ZddZd Zd Zd Zd Zd Zd Z	d	 Z
d
 ZddZdS )r%   Nc                     || _         |                                | _        |                                | _        || _        d S r   )r
   
get_moduler   r!   r,   follow)selfr
   r   follow_callbacks       r   __init__zSOAVisitor.__init__'   s:    !,,..((**
%r   c                     d S r   r   r3   nodes     r   _FunctionDefzSOAVisitor._FunctionDef-       r   c                     d S r   r   r7   s     r   	_ClassDefzSOAVisitor._ClassDef0   r:   r   c                    t           j        j                            |          D ]}|                     |           t          j        | j        |j                  \  }}|d S |	                                }t          |t          j                  rt          j        |||| j                  }nt          |t          j                  ro|}d|v r|d         	                                }t           j        j                            t          j        |                    }|                     ||||          }n9d|v r3|d         	                                }|                     ||||          }nd S |                     ||           d S )Nr5   __call__)r&   r'   r(   r)   r+   r   
eval_node2r,   func
get_object
isinstancer   AbstractFunctionr   create_argumentsPyClasspynamesUnboundNamePyObject_args_with_self_call)r3   r8   r.   primarypynamer   argspyclasss           r   _CallzSOAVisitor._Call3   sx   Y]33D99 	 	EJJu"-dj$)DD 	F&&((
j)"<== 	-gz4TTDD
I$566 
	 GZ' A'
3>>@@
Y&2293Eg3N3NOOF''TJJDD:% 	#J/::<<J''TJJDDF

:t$$$$$r   c                 p    t          j        |||| j                  }t          j        ||| j                  S r   )r   rD   r,   MixedArguments)r3   rK   self_pynamer   r8   	base_argss         r   rI   zSOAVisitor._args_with_selfI   s1    .w
D$*UU	'Y
KKKr   c                 
   t          |t          j                  r| j        |                     |          }| j        j                            ||                    |	                                                     |
                    d            | j        0|                     |          }||k    r|                     |           t          |t          j        j        j                  r|                    |           d S d S r   )rB   r   
PyFunctionr2   _parameter_objectsr
   object_infofunction_calledget_argumentsget_param_names_set_parameter_pyobjectsr&   r'   builtinsBuiltinFunctionget_returned_object)r3   r   rM   beforeafters        r   rJ   zSOAVisitor._callM   s    j)"677 
	,{ =00<<K#33D..z/I/I/K/KLL   //555{ ,//
;;F? ,KK
+++j$)"4"DEE 	1**400000	1 	1r   c                 z    fdt          t                              d                              D             S )Nc                 :    g | ]}                     |          S r   )get_parameter).0ir   s     r   
<listcomp>z1SOAVisitor._parameter_objects.<locals>.<listcomp>^   s7     
 
 
 $$Q''
 
 
r   F)rangelenrZ   )r3   r   s    `r   rV   zSOAVisitor._parameter_objects]   sL    
 
 
 
3z99%@@AABB
 
 
 	
r   c                 @   t           j        j                            |          D ]}|                     |           t                      }g }|                    |j                   |                    |j                   | 	                    |||j
                   d S )N	type_hint)r&   r'   r(   r)   r+   _SOAAssignVisitortargetextendnodes_evaluate_assign_value
annotationr3   r8   r.   r-   ro   s        r   
_AnnAssignzSOAVisitor._AnnAssignc   s    Y]33D99 	 	EJJu#%%dk"""W]#####D%4?#KKKKKr   c                 <   t           j        j                            |          D ]}|                     |           t                      }g }|j        D ]1}|                    |           |                    |j                   2| 	                    ||           d S r   )
r&   r'   r(   r)   r+   rl   targetsrn   ro   rp   rr   s        r   _AssignzSOAVisitor._Assignn   s    Y]33D99 	 	EJJu#%%\ 	( 	(EMM%   LL''''##D%00000r   Fc                    |D ]9\  }}t          j        | j        |j                  }t          j        | j        |j                  g}t
          j        j        j        	                    t
          j        j
                            |j        ||          | j                  }|                    t
          j        j
                            |                     |b|`|                                }	d|	v rH|	d                                         }
t!          j        |g|z             }|                     |
|           ;d S )Nrj   __setitem__)r   	eval_noder,   valueslicer&   r'   oisoi_infer_assignmentrF   AssignmentValuer   appendrG   rA   r   ObjectArgumentsrJ   )r3   r8   ro   rk   	subscriptlevelsinstanceargs_pynamesrz   r#   r   rM   s               r   rp   z!SOAVisitor._evaluate_assign_valuex   s0   !& 	1 	1Iv)$*ioFFH$.tz9?KKLLIL$66	!11J) 2   	 E 	 1 = =e D DEEE 1 1#..00 H, 1!)-!8!C!C!E!EJ$4hZ,5NOODJJz4000	1 	1r   r   )F)__name__
__module____qualname__r5   r9   r<   rO   rI   rJ   rV   rs   rv   rp   r   r   r   r%   r%   &   s        & & & &    % % %,L L L1 1 1 
 
 
	L 	L 	L1 1 11 1 1 1 1 1r   r%   c                   $     e Zd Z fdZd Z xZS )rl   c                 V    t                                                       g | _        d S r   )superr5   ro   )r3   	__class__s    r   r5   z_SOAAssignVisitor.__init__   s$    


r   c                    t          |t          j        j        j                  r]t          |j        t          j        j        j        t          j        j        j        f          r | j        	                    ||f           d S d S d S r   )
rB   r&   r'   r(   	Subscriptr{   Indexexprro   r   )r3   r8   r   s      r   _addedz_SOAAssignVisitor._added   s|    dDIM344 	.J,dim.@A:
 :
 	. JtVn-----	. 	. 	. 	.r   )r   r   r   r5   r   __classcell__)r   s   @r   rl   rl      sG            . . . . . . .r   rl   )rope.base.astr&   rope.base.oi.soirope.base.pynames	rope.baser   r   r   r   r   r	   r'   r(   RopeNodeVisitorr%   _NodeNameCollectorrl   r   r   r   <module>r      s                A A A A A A A A A A A AV V V! ! !*b1 b1 b1 b1 b1. b1 b1 b1L	. 	. 	. 	. 	.6 	. 	. 	. 	. 	.r   