
    Æe                         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y)	    N)	argumentsevaluatenameanalyze	pyobjectsc                 "    t        | ||||       y)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        2/usr/lib/python3/dist-packages/rope/base/oi/soa.pyanalyze_moduler      s     &(N4DnU    c                    	
  ||      r<|j                         j                         D ]  }t         |j                  |||         ||      r|t	        d|dz
        	d d 
	 
fd}t         ||r|nd       }t        j                  j                  j                  |j                               D ]  }|j                  |        y y )Nr      c                      y)NT 	pydefineds    r   <lambda>z_analyze_node.<locals>.<lambda>       r   c                      yNFr   r   s    r   r   z_analyze_node.<locals>.<lambda>   r   r   c                 $    t        |        y 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	      s    	"((*557 	E8H.	 i  NQ$67,.	
 VY>tTYY]]33I4E4E4GH 	!EMM% 	! !r   c                   L    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y)r'   Nc                 t    || _         |j                         | _        |j                         | _        || _        y r   )r
   
get_moduler   r#   r.   follow)selfr
   r   follow_callbacks       r   __init__zSOAVisitor.__init__'   s0    !,,.((*
%r   c                      y r   r   r5   nodes     r   _FunctionDefzSOAVisitor._FunctionDef-       r   c                      y r   r   r9   s     r   	_ClassDefzSOAVisitor._ClassDef0   r<   r   c                    t         j                  j                  j                  |      D ]  }| j	                  |        t        j                  | j                  |j                        \  }}|y |j                         }t        |t        j                        r#t        j                  |||| j                        }nt        |t        j                        rj|}d|v r|d   j                         }t         j                  j                   j#                  t        j$                  |            }| j'                  ||||      }n-d|v r(|d   j                         }| j'                  ||||      }ny | j)                  ||       y )Nr7   __call__)r(   r)   r*   r+   r-   r   
eval_node2r.   func
get_object
isinstancer   AbstractFunctionr   create_argumentsPyClasspynamesUnboundNamePyObject_args_with_self_call)r5   r:   r0   primarypynamer   argspyclasss           r   _CallzSOAVisitor._Call3   s;   YY]]33D9 	EJJu	"--djj$))D>&&(
j)"<"<=--gz4TD
I$5$56 GZ''
3>>@
YY&&2293E3Eg3NOF''TJD:%#J/::<J''TJD

:t$r   c                     t        j                  |||| j                        }t        j                  ||| j                        S r   )r   rF   r.   MixedArguments)r5   rM   self_pynamer   r:   	base_argss         r   rK   zSOAVisitor._args_with_selfI   s5    ..w
D$**U	''Y

KKr   c                     t        |t        j                        r| j                  | j	                  |      }| j
                  j                  j                  ||j                  |j                                      |j                  d        | j                  '| j	                  |      }|k7  r| j                  |       t        |t        j                  j                  j                        r|j                  |       y y r   )rD   r   
PyFunctionr4   _parameter_objectsr
   object_infofunction_calledget_argumentsget_param_names_set_parameter_pyobjectsr(   r)   builtinsBuiltinFunctionget_returned_object)r5   r   rO   beforeafters        r   rL   zSOAVisitor._callM   s    j)"6"67{{&00<KK##33D..z/I/I/KL //5{{&//
;F?KK
+j$))"4"4"D"DE**40 Fr   c                     t        t        |j                  d                  D cg c]  }|j                  |       c}S c c}w r   )rangelenr\   get_parameter)r5   r   is      r   rX   zSOAVisitor._parameter_objects]   sD     3z99%@AB
 $$Q'
 	
 
s   Ac                 B   t         j                  j                  j                  |      D ]  }| j	                  |        t               }g }|j	                  |j                         |j                  |j                         | j                  |||j                         y )N	type_hint)r(   r)   r*   r+   r-   _SOAAssignVisitortargetextendnodes_evaluate_assign_value
annotationr5   r:   r0   r/   rn   s        r   
_AnnAssignzSOAVisitor._AnnAssignc   sv    YY]]33D9 	EJJu	#%dkk"W]]###D%4??#Kr   c                 8   t         j                  j                  j                  |      D ]  }| j	                  |        t               }g }|j                  D ].  }|j	                  |       |j                  |j                         0 | j                  ||       y r   )
r(   r)   r*   r+   r-   rk   targetsrm   rn   ro   rq   s        r   _AssignzSOAVisitor._Assignn   s~    YY]]33D9 	EJJu	#%\\ 	(EMM% LL'	( 	##D%0r   c                    |D ]a  \  }}t        j                  | j                  |j                        }t        j                  | j                  |j                        g}t
        j                  j                  j                  j                  t
        j                  j                  j                  |j                  ||      | j                        }|j                  t
        j                  j                  j                  |             |
||j                         }	d|	v s$|	d   j                         }
t!        j"                  |g|z         }| j%                  |
|       d y )Nri   __setitem__)r   	eval_noder.   valueslicer(   r)   oisoi_infer_assignmentrH   AssignmentValuer   appendrI   rC   r   ObjectArgumentsrL   )r5   r:   rn   rj   	subscriptlevelsinstanceargs_pynamesry   r%   r   rO   s               r   ro   z!SOAVisitor._evaluate_assign_valuex   s   !& 	1Iv))$**iooFH$..tzz9??KLLIILL$$66		!!11JJ) 2  	E 		 1 1 = =e DE#(9#..0 H,!)-!8!C!C!EJ$44hZ,5NODJJz40	1r   r   )F)__name__
__module____qualname__r7   r;   r>   rQ   rK   rL   rX   rr   ru   ro   r   r   r   r'   r'   &   s6    &%,L1 
	L11r   r'   c                   $     e Zd Z fdZd Z xZS )rk   c                 0    t         |           g | _        y r   )superr7   rn   )r5   	__class__s    r   r7   z_SOAAssignVisitor.__init__   s    
r   c                 V   t        |t        j                  j                  j                        r{t        |j
                  t        j                  j                  j                  t        j                  j                  j                  f      r| j                  j                  ||f       y y y r   )
rD   r(   r)   r*   	Subscriptrz   Indexexprrn   r   )r5   r:   r   s      r   _addedz_SOAAssignVisitor._added   sk    dDIIMM334JJ,,diimm.@.@A:
 JJtVn-:
4r   )r   r   r   r7   r   __classcell__)r   s   @r   rk   rk      s    .r   rk   )rope.base.astr(   rope.base.oi.soirope.base.pynames	rope.baser   r   r   r   r   r	   r)   r*   RopeNodeVisitorr'   _NodeNameCollectorrk   r   r   r   <module>r      sN       A AV!*b1.. b1L	.66 	.r   