B
    ¢èåSâ  ã               @   sX   d dl Zd dlmZ G dd„ deƒZdd„ ZG dd„ deƒZG d	d
„ d
eƒZdd„ Z	dS )é    N)Úastc               @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )Ú	Argumentsz—A class for evaluating parameters passed to a function

    You can use the `create_arguments` factory.  It handles implicit
    first arguments.

    c             C   s   || _ || _d | _d S )N)ÚargsÚscopeÚinstance)Úselfr   r   © r   ú2lib/python3.7/site-packages/rope/base/arguments.pyÚ__init__   s    zArguments.__init__c             C   s>   g }x4|   |¡D ]&}|d kr(| d ¡ q| | ¡ ¡ qW |S )N)Úget_pynamesÚappendÚ
get_object)r   Ú
parametersÚresultÚpynamer   r   r	   Úget_arguments   s    zArguments.get_argumentsc             C   st   d gt t|ƒt| jƒƒ }xTt| jƒD ]F\}}t|tjƒr^|j|kr^|  |j	¡|| 
|j¡< q&|  |¡||< q&W |S )N)ÚmaxÚlenr   Ú	enumerateÚ
isinstancer   ÚkeywordÚargÚ	_evaluateÚvalueÚindex)r   r   r   r   r   r   r   r	   r      s    zArguments.get_pynamesc             C   s   | j r|  | j d ¡S d S )Nr   )r   r   )r   r   r   r	   Úget_instance_pyname$   s    zArguments.get_instance_pynamec             C   s   t jj | j|¡S )N)ÚropeÚbaseZevaluateZ	eval_noder   )r   Zast_noder   r   r	   r   (   s    zArguments._evaluateN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r
   r   r   r   r   r   r   r   r	   r      s   		r   c             C   sJ   t |jƒ}| |j¡ |j}t| |ƒr@t|tjƒr@| 	d|j
¡ t||ƒS )z"A factory for creating `Arguments`r   )Úlistr   ÚextendÚkeywordsÚfuncÚ_is_method_callr   r   Z	AttributeÚinsertr   r   )ÚprimaryÚ
pyfunctionZ	call_noder   r   Zcalledr   r   r	   Úcreate_arguments,   s    

r*   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚObjectArgumentsc             C   s
   || _ d S )N)Úpynames)r   r,   r   r   r	   r
   :   s    zObjectArguments.__init__c             C   s:   g }x0| j D ]&}|d kr$| d ¡ q| | ¡ ¡ qW |S )N)r,   r   r   )r   r   r   r   r   r   r	   r   =   s    zObjectArguments.get_argumentsc             C   s   | j S )N)r,   )r   r   r   r   r	   r   F   s    zObjectArguments.get_pynamesc             C   s
   | j d S )Nr   )r,   )r   r   r   r	   r   I   s    z#ObjectArguments.get_instance_pynameN)r   r   r    r
   r   r   r   r   r   r   r	   r+   8   s   	r+   c               @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚMixedArgumentsc             C   s   || _ || _dS )z(`argumens` is an instance of `Arguments`N)r   r   )r   r   Z	argumentsr   r   r   r	   r
   O   s    zMixedArguments.__init__c             C   s   | j g| j |dd … ¡ S )Né   )r   r   r   )r   r   r   r   r	   r   T   s    zMixedArguments.get_pynamesc             C   s>   g }x4|   |¡D ]&}|d kr(| d ¡ q| | ¡ ¡ qW |S )N)r   r   r   )r   r   r   r   r   r   r	   r   W   s    zMixedArguments.get_argumentsc             C   s   | j S )N)r   )r   r   r   r	   r   `   s    z"MixedArguments.get_instance_pynameN)r   r   r    r
   r   r   r   r   r   r   r	   r-   M   s   	r-   c             C   sz   | d krdS |   ¡ }t| ¡ tjjjƒrNt|tjjjƒrNt|jtjjjƒrNdS t| ¡ tjjj	ƒrvt|tjj
jƒrvdS dS )NFT)r   r   Zget_typer   r   Z	pyobjectsZPyClassZ
PyFunctionÚparentZAbstractClassÚbuiltinsZBuiltinFunction)r(   r)   Zpyobjectr   r   r	   r&   d   s    r&   )
Zrope.base.evaluater   Z	rope.baser   Úobjectr   r*   r+   r-   r&   r   r   r   r	   Ú<module>   s   '