B
    /d/                 @   s:  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZmZmZmZ d dlmZmZmZ d d	lmZmZmZ d d
lmZ d dlmZ d&ddZG dd deZdd Zdd Z dd Z!G dd dZ"G dd de"Z#dd Z$G dd de#Z%G dd de#Z&G d d! d!e"Z'd'd"d#Z(d$d% Z)dS )(    N)zip_longest)tree)debug)PushBackIterator)analysis)LazyKnownValueLazyKnownValuesLazyTreeValueget_merged_lazy_value)	ParamNameTreeNameDefinitionAnonymousParamName)	NO_VALUESValueSetContextualizedNode)iterable)%inference_state_as_method_param_cachec          	   C   s`   |dkrdS xN| D ]F}y
|j }W n tk
r4   Y qX x | D ]}t| |d  q>W qW dS )z"Helper method for static analysis.
   N   )
py__iter__AttributeErrortry_iter_contentinfer)typesdepthtypfZ
lazy_value r   e/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/jedi/inference/arguments.pyr      s    

r   c               @   s   e Zd ZdS )
ParamIssueN)__name__
__module____qualname__r   r   r   r   r   "   s   r   c                s    fdd}|S )aN  
    Transforms a function or method with arguments to the signature that is
    given as an argument clinic notation.

    Argument clinic is part of CPython and used for all the functions that are
    implemented in C (Python 3.7):

        str.split.__text_signature__
        # Results in: '($self, /, sep=None, maxsplit=-1)'
    c                s    fdd}|S )Nc                s>   yt t| j| }W n tk
r*   tS X | f| S d S )N)tupleiterate_argument_clinicinference_stater   r   )value	argumentsargs)clinic_stringfuncr   r   wrapper2   s    z?repack_with_argument_clinic.<locals>.decorator.<locals>.wrapperr   )r*   r+   )r)   )r*   r   	decorator1   s    z.repack_with_argument_clinic.<locals>.decoratorr   )r)   r,   r   )r)   r   repack_with_argument_clinic&   s    r-   c             c   s$  t t|}t| }xt|D ]\}\}}}}	|	dkrg }
x2|D ]*\}}|dk	rf|||f P |
| qFW tt	| |
gV  |
 q$n|	dkrt
 t|d\}}|dk	rtd t|dkr|std|t|| t|dkrtn| }|s|std| t|V  q$W dS )z;Uses a list with argument clinic information (see PEP 436).r   N   )NNzAKeyword arguments in argument clinic are currently not supported.z4TypeError: %s expected at least %s arguments, got %sz$argument_clinic "%s" not resolvable.)list_parse_argument_clinicr   unpack	enumerateZ	push_backappendr   r   Z	FakeTupleNotImplementedErrornextr   warningr   lenr   r   )r%   r'   r)   Zclinic_argsiteratorinameoptionalallow_kwargsstarsZlazy_valueskeyargumentZ	value_setr   r   r   r$   B   s8    
r$   c             c   s   d}d}x| rt d| }| t|dd  } |ds@d}q
|pPt|d}|d}|d}||d  }||||fV  |r
d}q
W d S )NFz%(?:(?:(\[),? ?|, ?|)(\**\w+)|, ?/)\]*r   r.   Tr   *)rematchr7   groupboolcount)stringr<   r;   rB   wordr=   r   r   r   r0   i   s    


r0   c               @   s   e Zd ZdddZdd ZdS )_AbstractArgumentsMixinNc             C   s   t d S )N)r4   )selffuncdefr   r   r   r1      s    z_AbstractArgumentsMixin.unpackc             C   s   g S )Nr   )rI   r   r   r   get_calling_nodes   s    z)_AbstractArgumentsMixin.get_calling_nodes)N)r    r!   r"   r1   rK   r   r   r   r   rH      s   
rH   c               @   s   e Zd ZdZdZdZdS )AbstractArgumentsN)r    r!   r"   contextargument_nodetrailerr   r   r   r   rL      s   rL   c             c   s   | d krd S | j dkr<| j dkr.| jd dks<d| fV  d S t| j}x|D ]}|dkr\qLqL|dkrt|d }|d k	sztt|j|fV  qL|j dkr|jd dkrt|jdkstt|jd j|jd fV  qLd|fV  qLW d S )Narglistr?   r   )r@   z**,r.   r   )typechildreniterr5   AssertionErrorr7   r&   )rP   r8   childcr   r   r   unpack_arglist   s&    





rX   c               @   sR   e Zd ZdddZee dd ZdddZdd	 Zd
d Z	dd Z
dd ZdS )TreeArgumentsNc             C   s   || _ || _|| _|| _dS )zS
        :param argument_node: May be an argument_node or a list of nodes.
        N)rN   rM   _inference_staterO   )rI   r%   rM   rN   rO   r   r   r   __init__   s    zTreeArguments.__init__c             O   s
   | ||S )Nr   )clsr(   kwargsr   r   r   create_cached   s    zTreeArguments.create_cachedc             #   s`  g }xJt jD ]:\} |dkrvj } fdd|D }x,tt| D ]}d tdd |D fV  qTW q|dkrj }x|D ]}tj| E d H  qW q jdkr< j	}t
|dkr||d jtj|d f nJ j	d }	|	jd	kr|	j	d }	tjjj|	 j	d d
}
d t|
fV  qd tj fV  qW |E d H  d S )Nr   c                s   g | ]}t j| qS r   )_iterate_star_argsrM   ).0a)elrJ   rI   r   r   
<listcomp>   s   z(TreeArguments.unpack.<locals>.<listcomp>c             S   s   g | ]}|d k	r|qS )Nr   )r`   vr   r   r   rc      s    r.   r?      r   Zcomp_for)Zdefining_contextZsync_comp_for_nodeZ
entry_node)rX   rN   rM   Z
infer_noder/   r   r
   _star_star_dictrR   rS   r7   r3   r&   r	   r   ZGeneratorComprehensionrZ   r   )rI   rJ   Z
named_args
star_countZarrays	iteratorsvaluesdctrW   Zsync_comp_forcompr   )rb   rJ   rI   r   r1      s8    
"

zTreeArguments.unpackc             c   sX   xRt | jD ]D\}}d }|jdkrDt|jdkrD|jd d d \}}|||fV  qW d S )Nr?   re   r.   )rX   rN   rR   r7   rS   )rI   rg   r?   defaultr   r   r   _as_tree_tuple_objects   s    
z$TreeArguments._as_tree_tuple_objectsc             c   s<   x6|   D ]*\}}}|r
t|tjs&q
t| j|V  q
W d S )N)rm   
isinstancer   Namer   rM   )rI   r:   rl   rg   r   r   r   iter_calling_names_with_star   s    z*TreeArguments.iter_calling_names_with_starc             C   s   d| j j| jf S )Nz<%s: %s>)	__class__r    rN   )rI   r   r   r   __repr__   s    zTreeArguments.__repr__c             C   s   g }| }x||krt |tsP || xdtt| D ]P}| }t|dkrTP t |d trfg S t |d t	svP |d 
 }|j}P q:W q
W |jd k	rt|j|jgS |jd k	rt|j|jgS g S )Nr   r   )rn   rY   r3   reversedr/   rp   Zgotor7   r   r   Zget_executed_param_namer'   rN   r   rM   rO   )rI   Zold_arguments_listr'   Zcalling_namenamesZexecuted_param_namer   r   r   rK      s,    





zTreeArguments.get_calling_nodes)N)N)r    r!   r"   r[   classmethodr   r^   r1   rm   rp   rr   rK   r   r   r   r   rY      s   
	
'rY   c               @   s&   e Zd Zdd ZdddZdd ZdS )	ValuesArgumentsc             C   s
   || _ d S )N)_values_list)rI   Zvalues_listr   r   r   r[     s    zValuesArguments.__init__Nc             c   s"   x| j D ]}d t|fV  qW d S )N)rw   r   )rI   rJ   ri   r   r   r   r1     s    zValuesArguments.unpackc             C   s   d| j j| jf S )Nz<%s: %s>)rq   r    rw   )rI   r   r   r   rr     s    zValuesArguments.__repr__)N)r    r!   r"   r[   r1   rr   r   r   r   r   rv     s   
rv   c               @   sR   e Zd Zdd Zedd Zedd Zedd Zdd
dZdd Z	dd Z
d	S )TreeArgumentsWrapperc             C   s
   || _ d S )N)_wrapped_arguments)rI   r'   r   r   r   r[     s    zTreeArgumentsWrapper.__init__c             C   s   | j jS )N)ry   rM   )rI   r   r   r   rM     s    zTreeArgumentsWrapper.contextc             C   s   | j jS )N)ry   rN   )rI   r   r   r   rN   !  s    z"TreeArgumentsWrapper.argument_nodec             C   s   | j jS )N)ry   rO   )rI   r   r   r   rO   %  s    zTreeArgumentsWrapper.trailerNc             C   s   t d S )N)r4   )rI   r*   r   r   r   r1   )  s    zTreeArgumentsWrapper.unpackc             C   s
   | j  S )N)ry   rK   )rI   r   r   r   rK   ,  s    z&TreeArgumentsWrapper.get_calling_nodesc             C   s   d| j j| jf S )Nz<%s: %s>)rq   r    ry   )rI   r   r   r   rr   /  s    zTreeArgumentsWrapper.__repr__)N)r    r!   r"   r[   propertyrM   rN   rO   r1   rK   rr   r   r   r   r   rx     s   
rx   c             c   sd   | ds4|d k	r4d|jj|f }tj| d||d y
|j}W n tk
rR   Y nX | E d H  d S )N__iter__z;TypeError: %s() argument after * must be a sequence, not %sztype-error-star)message)Zpy__getattribute__r:   r&   r   addr   r   )rM   array
input_noderJ   mZiter_r   r   r   r_   3  s    

r_   c             C   sv   ddl m} t||r&|jjdkr&i S t|tjrD|jdkrD| S |d k	rnd|jj	|f }t
j| d||d i S d S )Nr   )CompiledInstancedictz9TypeError: %s argument after ** must be a mapping, not %sztype-error-star-star)r|   )Zjedi.inference.value.instancer   rn   r:   Zstring_namer   SequenceZ
array_typeZexact_key_itemsr&   r   r}   )rM   r~   r   rJ   r   r   r   r   r   rf   B  s    rf   )r   )N)*rA   	itertoolsr   Zparso.pythonr   Zjedir   Zjedi.inference.utilsr   Zjedi.inferencer   Zjedi.inference.lazy_valuer   r   r	   r
   Zjedi.inference.namesr   r   r   Zjedi.inference.base_valuer   r   r   Zjedi.inference.valuer   Zjedi.inference.cacher   r   	Exceptionr   r-   r$   r0   rH   rL   rX   rY   rv   rx   r_   rf   r   r   r   r   <module>   s.   
'g
