U
    nuf*                     @   sB  d dl 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	d
ddddddddddddddddhZdZdFddZdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* ZdGd,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 ZdHd6d7ZeeZd8d9 Zd:d; Zd<d= Z d>d? Z!d@dA Z"e"dBZ#e"dCZ$e"dDdEZ%dS )I    N)literal_eval)cleandocWeakKeyDictionary)tree)parser_cache)split_linesfuncdefclassdefZimport_fromimport_nametestZor_testZand_testZnot_testZ
comparisonexprZxor_exprZand_exprZ
shift_exprZ
arith_expr	atom_exprZtermZfactorpoweratom)	tryexceptfinallyelseifelifwithforwhileFc                 C   s   g }| j }|dkrB|  }|dkr| jj dkr|dkr||  n|dkrr||  | jD ]}|t|dd7 }qZn|dkr| jd	 d
kr| jd } | dkr|t| 7 }nPz
| j}W n tk
r   Y n2X | j tkr|s||  |D ]}|t||7 }q|S )z
    For static analysis.
    nameFparam=	expr_stmtT)
last_added	decorator)()typeget_next_leafparentappendchildrenget_executable_nodesAttributeError_EXECUTE_NODES)noder   resulttypZ	next_leafchildr(    r0   5/tmp/pip-unpacked-wheel-ol4ehs9f/jedi/parser_utils.pyr)      s0    




r)   c                 c   sV   | V  | j d }|jdkr(|j d V  n|jdkr:|V  n|jdksFqR|j d }qd S )Ncomp_for   sync_comp_forZcomp_ifr(   r$   )r3   lastr0   r0   r1   get_sync_comp_fors:   s    



r8   c                 C   s   | j d jdkS )z
    Returns True if only one name is returned: ``for x in y``.
    Returns False if the for loop is more complicated: ``for x, z in y``.

    :returns: bool
    r4   r   r6   )for_stmtr0   r0   r1   for_stmt_defines_one_nameG   s    r:   c                 C   sj   |j }| j |  k r| jks(n tdd }t| jD ].\}}||j k rP|  S | }|tkr6|}q6d S )Nz!The node is not part of the flow.)	start_posend_pos
ValueError	enumerater(   get_first_leaf_FLOW_KEYWORDS)Z	flow_noder,   r;   keywordir/   Z
first_leafr0   r0   r1   get_flow_branch_keywordQ   s    
rC   c                 C   s"   |   }|dk	rtt|jS dS )z3 Returns a cleaned version of the docstring token. N )Zget_doc_noder   safe_literal_evalvalue)Z
scope_noder,   r0   r0   r1   clean_scope_docstring`   s    rG   c                 C   sP   | j dkrL| j} |  }|d k	rL|j dkrL|jd }|j dkrLtt|jS dS )Nr   Zsimple_stmtr   stringrD   )r$   r&   Zget_next_siblingr(   r   rE   rF   )Z	tree_nodeZmaybe_stringr0   r0   r1   find_statement_documentationl   s    



rI   c                 C   s0   | d d   }|d dks$|dkr(dS t| S )N   r   f)frrfrD   )lowerr   )rF   Z	first_twor0   r0   r1   rE   x   s    rE   H   c           	      C   s   |dkr | j dkrd}n| jj}|  }|r8|dd }dddd |D   d	 }td
d|}| jr|sd| j	  }nd}|| | }dt
||S )z
    Generate a string signature of a function.

    :param width: Fold lines if a line is longer than this value.
    :type width: int
    :arg func_name: Override function name when given.
    :type func_name: str

    :rtype: str
    Nlambdefz<lambda>r4   r#   rD   c                 s   s   | ]}|  V  qd S N)get_code).0r   r0   r0   r1   	<genexpr>   s     z get_signature.<locals>.<genexpr>r!   z\s+ z ->
)r$   r   rF   
get_paramsjoinstripresub
annotationrR   textwrapwrap)	r	   widthZcall_stringZomit_first_paramZomit_return_annotationparamspZrtypecoder0   r0   r1   get_signature   s    
 
rc   c                 C   sF   z
| j }W n" tk
r,   |  j|7  _Y nX |D ]}t|| q2dS )z$
    Move the `Node` start_pos.
    N)r(   r*   linemove)r,   line_offsetr(   cr0   r0   r1   re      s    
re   c                 C   s   zj| j dkr| jd  j}nJ| j dkr:| jd  j}n.| j dkrZ| jd   j}n|   j}W n* tk
r   Y dS  tk
r   Y dS X d|krdS ||dd }d	|kr|d|d	 }d
|kr|d|d
 }|S )zl
    returns (as string) any comment that appears on the same line,
    after the node, including the #
    r9      Z	with_stmt   r	      N#rV   )	r$   r(   r?   prefixr%   Zget_last_leafr*   r=   index)r,   
whitespacecommentr0   r0   r1   get_following_comment_same_line   s(    


rq   c                 C   s&   | j }|dkr| jd j dkS |dkS )Nr3   r4   r5   )Z
file_inputr
   r	   rP   r5   )r$   r(   )r,   tr0   r0   r1   is_scope   s    rs   c                    s   t   d fdd	}|S )NFc                    sz   | d kr||S z |  }W n  t k
r>   i  } | < Y nX z
|| W S  t k
rt   || }||< | Y S X d S rQ   )KeyError)Zparso_cache_noder,   include_flowsZ
for_moduler-   cachefuncr0   r1   wrapper   s    

z(_get_parent_scope_cache.<locals>.wrapper)Fr   )rx   ry   r0   rv   r1   _get_parent_scope_cache   s    rz   c                    s    j }|dkrdS t|r|jdkr|jd}|j| j jkr j jdkr\ j j kr\n& j jdkrz j jd  krzn|j }q|S |rt|tj	r|jdkrt
 fdd	| D s|S |j }qdS )
z'
    Returns the underlying scope.
    N)r
   r	   rP   :r   Ztfpdefr   Zif_stmtc                 3   s,   | ]$}|j  j   ko|jk n  V  qd S rQ   )r;   r<   )rS   nr,   r0   r1   rT     s   z#get_parent_scope.<locals>.<genexpr>)r&   rs   r$   r(   rn   r;   r   
isinstancer   ZFlowanyZget_test_nodes)r,   ru   Zscopern   r0   r}   r1   get_parent_scope   s,    

r   c                 C   s   t | |jS )z
    Basically access the cached code lines in parso. This is not the nicest way
    to do this, but we avoid splitting all the lines again.
    )get_parso_cache_nodelinesZgrammarpathr0   r0   r1   get_cached_code_lines  s    r   c                 C   s   t | j | S )z
    This is of course not public. But as long as I control parso, this
    shouldn't be a problem. ~ Dave

    The reason for this is mostly caching. This is obviously also a sign of a
    broken caching architecture.
    )r   Z_hashedr   r0   r0   r1   r     s    r   c                 C   sj   t | jddd|d | j d  }|d }| j|d krD|| j8 }|sLdS |d d| |d< d|S )z3
    Cuts of the value of the leaf at position
    T)keependsNr   r4   rD   r2   )r   rF   rd   columnrX   )Zleafpositionr   r   r0   r0   r1   cut_value_at_position"  s    $
r   c                 C   s   | j dkr8t| jdkr4| jd dkr4t| jd S dS | j dkr| j}|d dkrXdS t|d shdS td	d
 |dd D S | j dkS )zP
    Checks if a path looks like `name` or `name.foo.bar` and not `name()`.
    r   ri   r   r#   r4   Fr   awaitc                 s   s   | ]}|j d  dkV  qdS )r   .N)r(   )rS   rg   r0   r0   r1   rT   ?  s     z!expr_is_dotted.<locals>.<genexpr>Nr   )r$   lenr(   expr_is_dottedall)r,   r(   r0   r0   r1   r   0  s    

r   c                     s    fdd}|S )Nc                    s.   |   D ] }|jd }|  kr dS qdS )z
        This is a heuristic. It will not hold ALL the times, but it will be
        correct pretty much for anyone that doesn't try to beat it.
        staticmethod/classmethod are builtins and unless overwritten, this will
        be correct.
        r4   TF)Zget_decoratorsr(   rR   )Zfunction_noder   Zdotted_namemethod_namesr0   r1   ry   D  s
    
z&_function_is_x_method.<locals>.wrapperr0   )r   ry   r0   r   r1   _function_is_x_methodC  s    r   staticmethodclassmethodpropertycached_property)F)rO   NFF)F)&rZ   r]   astr   inspectr   weakrefr   Zparso.pythonr   Zparso.cacher   Zparsor   r+   r@   r)   r8   r:   rC   rG   rI   rE   rc   re   rq   rs   rz   r   Zget_cached_parent_scoper   r   r   r   r   Zfunction_is_staticmethodZfunction_is_classmethodZfunction_is_propertyr0   r0   r0   r1   <module>   sb   
           
%

    
!	
 