B
    7r\.                 @   s   d dl mZ d dlmZ d dlmZ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 d dlmZ d dlmZ dd Zdd Zdd Zdd ZG dd dZdS )    )PythonTokenTypes)tree)search_ancestorLeaf)	Parameter)debug)settings)classes)helpers)imports)keywords)evaluate_call_of_leaf)get_global_filters)get_statement_of_positionc             c   s@   x:| D ]2}x,|j D ]"}|j tjtjfkr|jV  qW qW d S )N)Zparams_nameZget_kindr   ZPOSITIONAL_OR_KEYWORDZKEYWORD_ONLY)call_signaturesZcall_sigp r   2lib/python3.7/site-packages/jedi/api/completion.pyget_call_signature_param_names   s
    

r   c       	      c   s   i }t jr| }xx|D ]p}|j}t jr0| }||rt| ||t|}|j|j	f}||krzt j
rz|| j| q|||< |V  qW d S )N)r   Zcase_insensitive_completionlowerZstring_name
startswithr	   
CompletionlennameZcompleteZno_completion_duplicatesZ_same_name_completionsappend)		evaluatorcompletion_namesstackZ	like_nameZcomp_dctr   stringnewkr   r   r   filter_names   s$    


r"   c                sP   t | j }|dkrB fdd| j}|r>| j|ddS | S | |S dS )zK
    Returns the scope in which the user resides. This includes flows.
    Nc                sj   xd| j D ]Z}|j   kr$|jkrn qt|tjtjfsD|jdkrP|pN|S |jdkr|S qW d S )N)Z
async_stmtZasync_funcdef)ZsuiteZ	decorated)children	start_posend_pos
isinstancer   ScopeFlowtype)Zscopes)positionscanr   r   r,   9   s    

zget_user_scope.<locals>.scanT)node_is_context)r   	tree_nodecreate_context)Zmodule_contextr+   Z	user_stmtZscanned_noder   )r+   r,   r   get_user_scope3   s    

r0   c             C   s0   | j |dd}xt|tjtjfs*|j}qW |S )NT)include_prefixes)get_leaf_for_positionr&   r   r'   r(   parent)Zmodule_noder+   noder   r   r   get_flow_scope_nodeK   s    
r5   c               @   sX   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dddZ
dddZdS )r   c             C   sR   || _ || _|j| _|| _t| j||| _|d |d t| j f| _	|| _
d S )Nr      )
_evaluator_module_contextr.   _module_node_code_linesr
   Zget_on_completion_name
_like_namer   	_position_call_signatures_method)selfr   moduleZ
code_linesr+   Zcall_signatures_methodr   r   r   __init__T   s    zCompletion.__init__c             C   s,   |   }t| j|| j| j}t|dd dS )Nc             S   s    | j d| j d| j  fS )N___)r   r   r   )xr   r   r   <lambda>g   s   

z(Completion.completions.<locals>.<lambda>)key)_get_context_completionsr"   r7   r   r;   sorted)r>   r   completionsr   r   r   rH   a   s    zCompletion.completionsc          
      s  | j j}y t|| j| j| j | _}W nB tjk
rj } z"d | _}|j	j
dkrVg S |  S d}~X Y nX t|  d kr~| jj| jdd}| }| jd }|j| j  kr|jksn |jd }|dk	r~|}xt|ddd	d
d}|dkrP |j}|dkr(|jd }	t|	tr(|	j
d }|jd |kr|dkrN ddg7  q|d
krh dddg7  q|dkr܈ d qW t|  }
t fddtjtjfD rdd |D }dd |D }|r|d dkrt| jddS d|kr4| |d|k\}}d|kod|k }|
| j|||d7 }
nZ|d dkrr|d dkrr| j| j}|
|  | 7 }
n|
|  7 }
|
| jdd7 }
d |kr| ! }|
t"|7 }
|
S )!a  
        Analyzes the context that a completion is made in and decides what to
        return.

        Technically this works by generating a parser stack and analysing the
        current stack for possible grammar nodes.

        Possible enhancements:
        - global/nonlocal search global
        - yield from / raise from <- could be only exceptions/generators
        - In args: */**: no completion
        - In params (also lambda): no completion before =
        N.ifT)r1   r6   Zif_stmtZfor_stmtZ
while_stmtZtry_stmtZ
error_noder   Z_stmtelifelseexceptfinallyc             3   s   | ]}| kV  qd S )Nr   ).0t)allowed_transitionsr   r   	<genexpr>   s    z6Completion._get_context_completions.<locals>.<genexpr>c             S   s   g | ]
}|j qS r   )Znonterminal)rO   
stack_noder   r   r   
<listcomp>   s    z7Completion._get_context_completions.<locals>.<listcomp>c             S   s   g | ]}|j D ]}|qqS r   )nodes)rO   rS   r4   r   r   r   rT      s    )asdefclass)is_functionZimport_stmtZimport_fromimport)only_modules)trailerdotted_nameFr]   )#r7   grammarr
   Zget_stack_at_positionr:   r9   r<   r   ZOnErrorLeafZ
error_leafvalue_global_completionslistZ)_allowed_transition_names_and_token_typesr2   Zget_previous_leafr$   r%   r   r)   r#   r&   r   r   _get_keyword_completion_namesanyr   NAMEINDENT_get_class_context_completions_parse_dotted_names_get_importer_names_trailer_completionsr=   r   )r>   r_   r   eleafprevious_leafindentZstmtZtype_firstr   ZnonterminalsrU   levelnamesr\   dotr   r   )rQ   r   rF   k   sv    












z#Completion._get_context_completionsc             c   s4   x.|D ]&}t |tr| rt| j|V  qW d S )N)r&   strisalphar   ZKeywordNamer7   )r>   rQ   r!   r   r   r   rc      s    
z(Completion._get_keyword_completion_namesc             C   s^   t | j| j}td| t| j| j}t| j|| j|d}g }x|D ]}||	 7 }qFW |S )Nzglobal completion scope: %s)origin_scope)
r0   r8   r<   r   dbgr5   r9   r   r7   values)r>   contextZflow_scope_nodefiltersr   filterr   r   r   ra      s    
zCompletion._global_completionsc             C   sp   t | j| j}| j| j|}t||}g }td| x2|D ]*}x$|jd|j	dD ]}||
 7 }qTW q>W |S )Nztrailer completion contexts: %sF)search_globalru   )r0   r8   r<   r7   r/   r   r   rv   get_filtersr.   rw   )r>   rm   Zuser_contextZevaluation_contextZcontextsr   rx   rz   r   r   r   rj      s    


zCompletion._trailer_completionsc             C   s   d}g }xz|dd  D ]j}|dkr6|s|t |j7 }q|jdkrV||jd d d 7 }q|jdkrl|| q|dkr~|sg }qP qW ||fS )Nr   r6   )rI   z...r^      r   ,)r   r`   r)   r#   r   )r>   rU   Zis_import_fromrp   rq   r4   r   r   r   rh      s    

zCompletion._parse_dotted_namesr   Tc             C   s2   dd |D }t | j|| j|}|j| j|dS )Nc             S   s   g | ]
}|j qS r   )r`   )rO   nr   r   r   rT     s    z2Completion._get_importer_names.<locals>.<listcomp>)r\   )r   ZImporterr7   r8   r   )r>   rq   rp   r\   ir   r   r   ri     s    zCompletion._get_importer_namesc             c   s   | j j| jdd}t|d}t|tjtjfrB| jj	|dd}ndS |j
d |j
d kr^dS |jddd}t| x2|D ]*}x$| D ]}|jd	k|kr|V  qW qzW dS )
zP
        Autocomplete inherited methods when overriding in child class.
        T)r1   Zclassdef)r-   Nr6   F)r{   Zis_instanceZfunction)r9   r2   r<   r   r   r&   ZClassZFunctionr8   r/   r$   r|   nextrw   Zapi_type)r>   rZ   rl   clsZrandom_contextry   rz   r   r   r   r   rg     s    

z)Completion._get_class_context_completionsN)r   T)T)__name__
__module____qualname__r@   rH   rF   rc   ra   rj   rh   ri   rg   r   r   r   r   r   S   s   
f
r   N)Zparso.python.tokenr   Zparso.pythonr   Z
parso.treer   r   Zjedi._compatibilityr   Zjedir   r   Zjedi.apir	   r
   Zjedi.evaluater   r   Zjedi.evaluate.helpersr   Zjedi.evaluate.filtersr   Zjedi.parser_utilsr   r   r"   r0   r5   r   r   r   r   r   <module>   s"   
