B
    S                 @   sf   d dl Zd dlZd dlZd dlmZmZmZmZ dd Z	dd Z
G dd deZG d	d
 d
ejZdS )    N)	pyobjectsevaluateastutils	argumentsc             C   s   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_calls r   /lib/python3.7/site-packages/rope/base/oi/soa.pyanalyze_module   s    r   c       	         s   ||r0x&|   D ]}t|j||| qW ||rtd|d  dd dd  fdd}|spd }t||}x*tjj	|
 D ]}tjj|| qW d S )Nr      c             S   s   dS )NTr   )	pydefinedr   r   r   <lambda>   s    z_analyze_node.<locals>.<lambda>c             S   s   dS )NFr   )r   r   r   r   r      s    c                s   t |   d S )N)r   )
pyfunction)new_followed_callsr   return_falsereturn_truer   r   _follow   s    z_analyze_node.<locals>._follow)	get_scopeZ
get_scopesr   pyobjectmax
SOAVisitorropebaseastget_child_nodesZget_astwalk)	r   r   r	   r
   r   scoper   visitorchildr   )r   r   r   r   r   r      s    
r   c               @   sN   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dS )r   Nc             C   s$   || _ | | _| | _|| _d S )N)r   Z
get_moduler   r   r    follow)selfr   r   Zfollow_callbackr   r   r   __init__+   s    

zSOAVisitor.__init__c             C   s   d S )Nr   )r$   noder   r   r   _FunctionDef1   s    zSOAVisitor._FunctionDefc             C   s   d S )Nr   )r$   r&   r   r   r   	_ClassDef4   s    zSOAVisitor._ClassDefc             C   s   x&t jj|D ]}t jj||  qW t| j|j\}}|d krHd S |	 }t
|tjrpt|||| j}ntt
|tjr|}d|kr|d 	 }t jjt|}| ||||}n*d|kr|d 	 }| ||||}nd S | || d S )Nr%   __call__)r   r   r   r   r   r   Z
eval_node2r    func
get_object
isinstancer   ZAbstractFunctionr   create_argumentsZPyClasspynamesUnboundNameZPyObject_args_with_self_call)r$   r&   r"   primaryZpynamer   argsZpyclassr   r   r   _Call7   s(    zSOAVisitor._Callc             C   s"   t |||| j}t ||| jS )N)r   r-   r    ZMixedArguments)r$   r2   Zself_pynamer   r&   Z	base_argsr   r   r   r0   N   s    
zSOAVisitor._args_with_selfc             C   s   t |tjrj| jd k	r | |}| jj|||	  |
d  | jd k	rj| |}||krj| | t |tjjjr|| d S )N)r,   r   Z
PyFunctionr#   _parameter_objectsr   Zobject_infoZfunction_calledZget_argumentsget_param_namesZ_set_parameter_pyobjectsr   r   builtinsZBuiltinFunctionZget_returned_object)r$   r   r3   ZbeforeZafterr   r   r   r1   S   s    





zSOAVisitor._callc             C   s4   g }x*t t|dD ]}||| qW |S )NF)rangelenr6   appendZget_parameter)r$   r   resultir   r   r   r5   b   s    zSOAVisitor._parameter_objectsc             C   s  x&t jj|D ]}t jj||  qW t }g }x*|jD ] }t jj|| ||j q:W x|D ]\}}t	
| j|j}g }|t	
| j|jj t jjjt jj|j|| j}	|t jj|	 |d k	rd|	d k	rd| }
d|
krd|
d  }t|g| }| || qdW d S )N__setitem__)r   r   r   r   r   _SOAAssignVisitorZtargetsextendnodesr   Z	eval_noder    valuer:   sliceZoiZsoiZ_infer_assignmentr.   ZAssignmentValuer   r/   r+   r   ZObjectArgumentsr1   )r$   r&   r"   r!   r@   Z	subscriptlevelsinstanceZargs_pynamesrA   r   r   r3   r   r   r   _Assignh   s,    
zSOAVisitor._Assign)N)__name__
__module____qualname__r%   r'   r(   r4   r0   r1   r5   rE   r   r   r   r   r   )   s   
r   c                   s$   e Zd Z fddZdd Z  ZS )r>   c                s   t t|   g | _d S )N)superr>   r%   r@   )r$   )	__class__r   r   r%      s    z_SOAAssignVisitor.__init__c             C   s6   t |tjjjr2t |jtjjjr2| j||f d S )N)	r,   r   r   r   Z	SubscriptrB   ZIndexr@   r:   )r$   r&   rC   r   r   r   _added   s    z_SOAAssignVisitor._added)rF   rG   rH   r%   rK   __classcell__r   r   )rJ   r   r>      s   r>   )Zrope.base.astr   Zrope.base.oi.soiZrope.base.pynamesZ	rope.baser   r   r   r   r   r   objectr   Z_NodeNameCollectorr>   r   r   r   r   <module>   s   Y