B
    7Ør\ô  ã               @   s˜   d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dlm
Z
 d dlmZ d dlmZ dd	„ ZG d
d„ deƒZdd„ Zdd„ Zdd„ Zdd„ ZdS )é    )Údefaultdict)ÚPushBackIterator)Úanalysis)ÚLazyKnownContextÚLazyTreeContextÚLazyUnknownContext)Ú
docstrings)Úpep0484)Úiterablec             C   s6   t |tƒr2|j}|jjdkr"|j}t | |||¡ d S )NÚargument)Ú
isinstancer   ÚdataÚparentÚtyper   Úadd)Úparent_contextZ
error_nameÚlazy_contextÚmessageÚnode© r   ú2lib/python3.7/site-packages/jedi/evaluate/param.pyÚ_add_argument_issue   s
    
r   c               @   s4   e Zd ZdZdd„ Zdd„ Zedd„ ƒZdd	„ Zd
S )ÚExecutedParamz Fake a param and give it values.c             C   s    || _ || _|| _|jj| _d S )N)Ú_execution_contextÚ_param_nodeÚ_lazy_contextÚnameÚvalueÚstring_name)ÚselfÚexecution_contextZ
param_noder   r   r   r   Ú__init__   s    zExecutedParam.__init__c             C   s:   t  | j| j¡}t | j| j¡}|s(|r0||B S | j ¡ S )N)r	   Zinfer_paramr   r   r   r   Úinfer)r   Zpep0484_hintsZ
doc_paramsr   r   r   r"      s
    zExecutedParam.inferc             C   s   | j jS )N)r   Úvar_args)r   r   r   r   r#   $   s    zExecutedParam.var_argsc             C   s   d| j j| jf S )Nz<%s: %s>)Ú	__class__Ú__name__r   )r   r   r   r   Ú__repr__(   s    zExecutedParam.__repr__N)	r%   Ú
__module__Ú__qualname__Ú__doc__r!   r"   Úpropertyr#   r&   r   r   r   r   r      s
   r   c          	   C   s~  g }i }| j }| j}x| ¡ D ]}|||jj< qW t| |¡ƒ}tt|ƒƒ}t	dd„ ƒ}	i }
d}d}x | ¡ D ]}t
|dƒ\}}xš|d k	rd}y|| }W n tk
r¼   ||	|< Y nRX ||
krþd}d|j|f }x4| ¡ D ]}tj|d||d qâW nt| ||ƒ|
|< t
|dƒ\}}q†W y| |
|jj ¡ wpW n tk
rN   Y nX |jd	krÂg }|d k	r¨| |¡ x2|D ]*\}}|r˜| ||f¡ P | |¡ qzW t | jd
|¡}t|ƒ}n–|jdkrît | jt|	ƒ¡}t|ƒ}i }	nj|d krT|jd krFtƒ }|sRx@| ¡ D ]&}t|t|ƒƒ}tj|d||d qW nt||jƒ}n|}| t| ||ƒ¡ t|tƒsp|d |
|jj< qpW |rxrt|ƒt|
ƒ D ]^}|| }|	s |s |js |js x2| ¡ D ]&}t|t|ƒƒ}tj|d||d qÒW q W x4|	  ¡ D ](\}}d|j|f }t!|d||d qW t|ƒ}|rzt|t|ƒƒ}|d \}}| ¡ rzt!|d||d |S )Nc               S   s   g S )Nr   r   r   r   r   Ú<lambda>7   s    z%get_executed_params.<locals>.<lambda>F)NNTz>TypeError: %s() got multiple values for keyword argument '%s'.ztype-error-multiple-values)r   é   Útupleé   ztype-error-too-few-argumentséÿÿÿÿz8TypeError: %s() got an unexpected keyword argument '%s'.ztype-error-keyword-argumentr   ztype-error-too-many-arguments)"Z	tree_noder   Ú
get_paramsr   r   ÚlistZunpackr   Úiterr   ÚnextÚKeyErrorZget_calling_nodesr   r   r   ÚappendÚ
star_countZ	push_backr
   ÚFakeSequenceÚ	evaluatorr   ÚFakeDictÚdictÚdefaultr   Ú_error_argument_countÚlenr   r   ÚsetÚitemsr   )r    r#   Zresult_paramsZ
param_dictÚfuncdefr   ÚparamZunpacked_vaZvar_arg_iteratorZnon_matching_keysZ	keys_usedZ	keys_onlyZhad_multiple_value_errorÚkeyr   Z	key_paramÚmr   Zlazy_context_listÚseqÚ
result_argZdctÚkr   Zremaining_argumentsZ	first_keyr   r   r   Úget_executed_params,   s¬    





rG   c             C   sN   |   ¡ }tdd„ |D ƒƒ}|dkr(d}ndt|ƒ|  }d| j|t|ƒ|f S )Nc             s   s   | ]}|j s|jrd V  qdS )r,   N)r;   r6   )Ú.0Úpr   r   r   ú	<genexpr>¦   s    z(_error_argument_count.<locals>.<genexpr>r   zexactly zfrom %s to z0TypeError: %s() takes %s%s arguments (%s given).)r0   Úsumr=   r   )r@   Zactual_countZparamsZdefault_argumentsZbeforer   r   r   r<   ¤   s    r<   c             C   sj   |j dkr tt | jdg ¡ƒ}n>|j dkr>tt | ji ¡ƒ}n |jd krPtƒ }nt| j	|jƒ}t
| ||ƒS )Nr,   r-   r.   )r6   r   r
   r7   r8   r9   r;   r   r   r   r   )r    rA   rE   r   r   r   Ú_create_default_param°   s    


rL   c                s   ‡ fdd„|  ¡ D ƒS )Nc                s   g | ]}t ˆ |ƒ‘qS r   )rL   )rH   rI   )r    r   r   ú
<listcomp>Á   s   z)create_default_params.<locals>.<listcomp>)r0   )r    r@   r   )r    r   Úcreate_default_paramsÀ   s    
rN   N)Úcollectionsr   Zjedi.evaluate.utilsr   Zjedi.evaluater   Zjedi.evaluate.lazy_contextr   r   r   r   r	   Zjedi.evaluate.contextr
   r   Úobjectr   rG   r<   rL   rN   r   r   r   r   Ú<module>   s   x