B
    7r\,                 @   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
mZmZmZ d dlmZ d dlmZ d d	lmZ d d
lmZmZ d ddZd!ddZdd Zdd ZG dd de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)tree)zip_longest)debug)analysis)LazyKnownContextLazyKnownContextsLazyTreeContextget_merged_lazy_context)	ParamName)NO_CONTEXTS)iterable)get_executed_paramsExecutedParamc          	   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)typesZdepthtypflazy_context r   6lib/python3.7/site-packages/jedi/evaluate/arguments.pyr      s    

r   Fc                s   t t|   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                 sR   r|d }n
| d}y| tt| 7 } W n tk
rB   tS X | |S d S )N	arguments)poptuple_iterate_argument_clinic
ValueErrorr   )argskwargsr   )clinic_argsfunckeep_arguments_paramr   r   wrapper/   s    

z?repack_with_argument_clinic.<locals>.decorator.<locals>.wrapperr   )r#   r%   )r"   r$   )r#   r   	decorator.   s    z.repack_with_argument_clinic.<locals>.decorator)list_parse_argument_clinic)stringr$   r&   r   )r"   r$   r   repack_with_argument_clinic!   s    r*   c       
      c   s   |   }xt|D ]\}\}}}t|d\}}|dk	rDtd t|dkrh|shtd|t|| t|dkrttn| }	|	s|std| t|	V  qW dS )z;Uses a list with argument clinic information (see PEP 436).)NNNzAKeyword arguments in argument clinic are currently not supported.z4TypeError: %s expected at least %s arguments, got %sz$argument_clinic "%s" not resolvable.)	unpack	enumeratenextr   Zwarningr   lenr   r   )
r   Z
parametersiteratorinameoptionalallow_kwargskeyargumentZcontext_setr   r   r   r   ?   s    
r   c             c   sp   d}d}xb| rjt d| }| t|dd  } |ds@d}q
|pPt|d}|d}|||fV  q
W d S )NFz"(?:(?:(\[),? ?|, ?|)(\w+)|, ?/)\]*r      Tr   )rematchr.   groupbool)r)   r3   r2   r8   Zwordr   r   r   r(   W   s    

r(   c               @   s<   e Zd ZdZdZdZd
ddZdd ZdddZdd	 Z	dS )AbstractArgumentsNc             C   s*   x$|   D ]\}}| }t| q
W dS )zc
        Evaluates all arguments as a support for static analysis
        (normally Jedi).
        N)r+   r   r   )selffuncdefr4   r   r   r   r   r   eval_alln   s    zAbstractArguments.eval_allc             C   s   g S )Nr   )r<   r   r   r   get_calling_nodesw   s    z#AbstractArguments.get_calling_nodesc             C   s   t d S )N)NotImplementedError)r<   r=   r   r   r   r+   z   s    zAbstractArguments.unpackc             C   s
   t || S )N)r   )r<   execution_contextr   r   r   r   }   s    z%AbstractArguments.get_executed_params)N)N)
__name__
__module____qualname__contextargument_nodetrailerr>   r?   r+   r   r   r   r   r   r;   i   s   
	
r;   c               @   s   e Zd Zdd Zdd ZdS )AnonymousArgumentsc             C   s   ddl m} ||j||jS )Nr   )search_params)jedi.evaluate.dynamicrI   	evaluatorZ	tree_node)r<   rA   rI   r   r   r   r      s
    z&AnonymousArguments.get_executed_paramsc             C   s   d| j j S )Nz%s())	__class__rB   )r<   r   r   r   __repr__   s    zAnonymousArguments.__repr__N)rB   rC   rD   r   rM   r   r   r   r   rH      s   rH   c               @   s@   e Zd ZdddZdd ZdddZdd	 Zd
d Zdd ZdS )TreeArgumentsNc             C   s   || _ || _|| _|| _dS )a7  
        The argument_node is either a parser node or a list of evaluated
        objects. Those evaluated objects may be lists of evaluated objects
        themselves (one list for the first argument, one for the second, etc).

        :param argument_node: May be an argument_node or a list of nodes.
        N)rF   rE   
_evaluatorrG   )r<   rK   rE   rF   rG   r   r   r   __init__   s    zTreeArguments.__init__c             c   s   | j d krd S | j jdksF| j jdkr6| j jd dksFd| j fV  d S t| j j}x|D ]}|dkrhqXqX|dkrt|jt|fV  qX|jdkr|jd dkrt|jdkstt|jd j|jd fV  qXd|fV  qXW d S )N)ZarglistZtestlistr5   r   )*z**,r6   r   )rF   typechildreniterr.   valuer-   AssertionError)r<   r/   Zchildr   r   r   _split   s$    


zTreeArguments._splitc             #   sX  g }x6  D ](\} |dkrtj } fdd|D }xtt| D ]}d tdd |D fV  qRW q|dkrj }x|D ],}x&tj| D ]\}}||fV  qW qW q jdkr( j}	t	|	dkr|
|	d jtj|	d f n$tjjjj}
d t|
fV  qd tj fV  qW x|D ]}|V  qDW d S )	Nr   c                s   g | ]}t j| qS r   )_iterate_star_argsrE   ).0a)elr=   r<   r   r   
<listcomp>   s   z(TreeArguments.unpack.<locals>.<listcomp>c             S   s   g | ]}|d k	r|qS )Nr   )rZ   vr   r   r   r]      s    r6   r5      r   )rX   rE   Z	eval_noder'   r   r	   _star_star_dictrS   rT   r.   appendrV   r   r   ZGeneratorComprehensionrO   rF   parentr   )r<   r=   Z
named_args
star_countZarraysZ	iteratorsvaluesZdctr4   ccompZ	named_argr   )r\   r=   r<   r   r+      s0    
"
zTreeArguments.unpackc             c   sJ   xD|   D ]8\}}|jdkr2|jd d d \}}nd }|||fV  q
W d S )Nr5   r6   )rX   rS   rT   )r<   rc   r5   defaultr   r   r   as_tree_tuple_objects   s
    
z#TreeArguments.as_tree_tuple_objectsc             C   s   d| j j| jf S )Nz<%s: %s>)rL   rB   rF   )r<   r   r   r   rM      s    zTreeArguments.__repr__c       	      C   s   ddl m} g }| }x||krt|ts*P || xtt| D ]\}}}|rFt|tj	sbqF| j
|j|}t|dkrP t|d tsP |d  }t||rg S t|tsP |jd krP |j}P qFW qW |jd k	r|jgS |jd k	r|jgS g S )Nr   )DynamicExecutedParamsr   )rJ   ri   
isinstancerN   ra   reversedr'   rh   r   NamerO   ZgotorE   r.   r
   Z	get_paramr   Zvar_argsrF   rG   )	r<   ri   Zold_arguments_listr   r1   rg   rc   namesZparamr   r   r   r?      s:    








zTreeArguments.get_calling_nodes)N)N)	rB   rC   rD   rP   rX   r+   rh   rM   r?   r   r   r   r   rN      s   

$rN   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)r<   Zvalues_listr   r   r   rP     s    zValuesArguments.__init__Nc             c   s"   x| j D ]}d t|fV  qW d S )N)ro   r   )r<   r=   rd   r   r   r   r+     s    zValuesArguments.unpackc             C   s   d| j j| jf S )Nz<%s: %s>)rL   rB   ro   )r<   r   r   r   rM     s    zValuesArguments.__repr__)N)rB   rC   rD   rP   r+   rM   r   r   r   r   rn   
  s   
rn   c          	   c   sd   y
|j }W n> tk
rH   |d k	rDd|jj|f }tj| d||d Y nX x| D ]
}|V  qRW d S )Nz;TypeError: %s() argument after * must be a sequence, not %sztype-error-star)message)r   r   r1   rV   r   add)rE   array
input_noder=   Ziter_mr   r   r   r   rY     s    
rY   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)rp   )Zjedi.evaluate.context.instanceru   rj   r1   Zstring_namer   SequenceZ
array_typeZexact_key_itemsrV   r   rq   )rE   rr   rs   r=   ru   rt   r   r   r   r`   $  s    r`   )r   )F)N)"r7   Zparso.pythonr   Zjedi._compatibilityr   Zjedir   Zjedi.evaluater   Zjedi.evaluate.lazy_contextr   r   r   r	   Zjedi.evaluate.filtersr
   Zjedi.evaluate.base_contextr   Zjedi.evaluate.contextr   Zjedi.evaluate.paramr   r   r   r*   r   r(   objectr;   rH   rN   rn   rY   r`   r   r   r   r   <module>   s&   

|
