B
    7r\<$                 @   s  d Z 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 dd	lmZ dd
lmZ ddlmZ eddddgZdd Zdd Zdd ZG dd deZdd Zdd Zdd Zeddd d!gZd"d# Zd$d% Zd&d' Z ed(d)d* Z!dS )+z
Helpers for the API
    N)
namedtuple)dedent)Parser)tree)u)	eval_atom)evaluate_call_of_leaf)get_string_context_set)call_signature_time_cacheCompletionPartspathZhas_dotnamec             C   s   t | dd dS )Nc             S   s   | j pd| jpd| jpdfS )N r   )module_pathlinecolumn)x r   /lib/python3.7/site-packages/jedi/api/helpers.py<lambda>   s    z$sorted_definitions.<locals>.<lambda>)key)sorted)Zdefsr   r   r   sorted_definitions   s    r   c             C   st   |  |}|d ks|jdkrJ||d d  }td|d |d  dS |jdkrXdS |jd |d |jd   S )N)string
error_leafr      z(?!\d)\w+$|$)r   keywordr   )get_leaf_for_positiontyperesearchgroupvalue	start_pos)module_nodelinespositionleafr   r   r   r   get_on_completion_name   s    

r(   c             C   sR   | |d d |d  }|d d |d  |d< |d |d d  |d< d |S )Nr   r   r   )join)
code_linesr#   end_posr%   r   r   r   	_get_code(   s    r-   c               @   s   e Zd Zedd ZdS )OnErrorLeafc             C   s
   | j d S )Nr   )args)selfr   r   r   r   3   s    zOnErrorLeaf.error_leafN)__name__
__module____qualname__propertyr   r   r   r   r   r.   2   s   r.   c             C   s   |j |dd}|j|kr0| }|d kr0tdS |jdk}x&|jdkr`| }|d kr<tdS q<W |jdksv|jdkr|jd |d k rtdS t|nL|}x|jjdkrP |j}qW |r|jd	 |d	 krtdS t| | |S d S )
NT)include_prefixesr   newliner   r   r   )Z
file_inputZsuiteZsimple_stmtr   )	r   r#   get_previous_leafr   r   r.   parentr-   Zget_start_pos_of_prefix)r+   r$   r&   r'   Zis_after_newlineZ	user_stmtr   r   r   _get_code_for_stack8   s.    



r9   c                s   G dd dt   fdd}tt|||}d|d  }tjdd}y|j||d	 W n  k
rx   |jS X td
t|| dS )zU
    Returns the possible node names (e.g. import_from, xor_test or yield_stmt).
    c               @   s   e Zd ZdS )z/get_stack_at_position.<locals>.EndMarkerReachedN)r1   r2   r3   r   r   r   r   EndMarkerReachede   s   r:   c             3   sb    | }xR|D ]J}|jkr&  q|jr:  q|jrT|V    q|V  qW d S )N)	_tokenizer   prefixendswith)codetokenstoken)r:   grammarsafewordr   r   tokenize_without_endmarkerh   s    


z9get_stack_at_position.<locals>.tokenize_without_endmarkerZ)ZZZ_USER_WANTS_TO_COMPLETE_HERE_WITH_JEDI T)Zerror_recovery)r?   z7This really shouldn't happen. There's a bug in Jedi:
%sN)		Exceptionr   r9   r   Z_pgen_grammarparsestackSystemErrorlist)rA   r+   r$   posrC   r>   pr   )r:   rA   rB   r   get_stack_at_positiona   s    rL   c             C   sr   |j dkr| ||S |j}|j dkr2||jS |j dkrFt||S t|tjr\t||S |j dkrnt	| S g S )Nr   atomtrailer)Zfstring_stringZfstring_startZfstring_end)
r   Zgoto_definitionsr8   Z	eval_noder   
isinstancer   ZLiteralr   r	   )	evaluatorcontextr'   r8   r   r   r   evaluate_goto_definition   s    





rR   CallSignatureDetailsbracket_leafZ
call_indexZkeyword_name_strc                s    fdd| D }|d j dkr8 fdd|d jD }d}|r|d }|j dkr~|jd d	kr~|jd j kr~|jd
 j}n|d	kr|d j}|d|fS )zG
    Returns the amount of commas and the keyword argument string.
    c                s   g | ]}|j  k r|qS r   )r#   ).0c)r&   r   r   
<listcomp>   s    z&_get_index_and_key.<locals>.<listcomp>r)   Zarglistc                s   g | ]}|j  k r|qS r   )r#   )rU   rV   )r&   r   r   rW      s    NZargumentr   =r   ,)r   childrenr,   r"   count)Znodesr&   Znodes_beforeZkey_strZlastr   )r&   r   _get_index_and_key   s    
r]   c             C   s   xt tt| jD ]l\}}|dkr|j|kr|dkr| j|d  }| }|d krVq|jdksl|jjdkrt|ft	|| S qW d S )N(r   r   )rN   rM   )
reversedrI   	enumerater[   r,   r7   r   r8   rS   r]   )noder&   indexelementr[   r   r   r   r   +_get_call_signature_details_from_error_node   s    rd   c             C   s   | j |dd}|j|kr,| }|d kr,d S |dkrF|j|krF| }|j}x|d k	r|jdkrdd S xB|jd d d D ].}|j|k rv|jdkrvt||}|d k	rv|S qvW |jdkr|jd d	kr| }|d krd S t	|jd ft
|j| S |j}qNW d S )
NT)r5   ))ZfuncdefZclassdefr)   Z
error_noderN   r   r^   )r   r#   r7   r,   Zget_next_leafr8   r   r[   rd   rS   r]   )moduler&   r'   ra   nresultr   r   r   get_call_signature_details   s2    





ri   Zcall_signatures_validityc             c   s   |d d }|| d|d  }||j d | }d||g }td|tj}	|  }
|
dkrndV  n|
|	|j fV  t| || V  dS )z'This function calculates the cache key.r   r   Nr   z.*\()	r#   r*   r   matchDOTALLZget_root_contextZ
py__file__rR   r7   )rP   rQ   rT   r+   Zuser_posZ
line_indexZbefore_cursorZother_linesZwholeZbefore_bracketr   r   r   r   cache_call_signatures   s    rl   )"__doc__r   collectionsr   textwrapr   Zparso.python.parserr   Zparso.pythonr   Zjedi._compatibilityr   Zjedi.evaluate.syntax_treer   Zjedi.evaluate.helpersr   Zjedi.evaluate.compiledr	   Z
jedi.cacher
   r   r   r(   r-   rE   r.   r9   rL   rR   rS   r]   rd   ri   rl   r   r   r   r   <module>   s2   
)*'