B
    /d*                 @   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_exprterm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rv||  x| jD ]}|t|dd7 }q\W n|dkr| jd	 d
kr| jd } | dkr|t| 7 }nTy
| j}W n tk
r   Y n6X | j tkr|s||  x|D ]}|t||7 }qW |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)    r1   ^/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/jedi/parser_utils.pyr*      s0    




r*   c             c   sZ   | V  | j d }xD|jdkr*|j d V  n|jdkr<|V  n|jdksHP |j d }qW d S )Ncomp_for   sync_comp_forZcomp_if)r)   r%   )r4   lastr1   r1   r2   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
    r5   r   )r)   r%   )for_stmtr1   r1   r2   for_stmt_defines_one_nameG   s    r:   c             C   sj   |j }| j |  k r| jks(n tdd }x8t| jD ]*\}}||j k rN|S | }|tkr8|}q8W d 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ir0   Z
first_leafr1   r1   r2   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-   r1   r1   r2   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_stringr1   r1   r2   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_twor1   r1   r2   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>r5   r$   rD   c             s   s   | ]}|  V  qd S )N)get_code).0r   r1   r1   r2   	<genexpr>   s    z get_signature.<locals>.<genexpr>r"   z\s+ z ->
)r%   r   rF   
get_paramsjoinstripresub
annotationrQ   textwrapwrap)	r   widthZcall_stringZomit_first_paramZomit_return_annotationparamspZrtypecoder1   r1   r2   get_signature   s    
 
rb   c             C   sJ   y
| j }W n" tk
r,   |  j|7  _Y nX x|D ]}t|| q4W dS )z$
    Move the `Node` start_pos.
    N)r)   r+   linemove)r-   line_offsetr)   cr1   r1   r2   rd      s    

rd   c             C   s   yj| 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~   dS  tk
r   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#rU   )	r%   r)   r?   prefixr&   Zget_last_leafr+   r=   index)r-   
whitespacecommentr1   r1   r2   get_following_comment_same_line   s(    


rp   c             C   s&   | j }|dkr| jd j dkS |dkS )Nr4   r5   r6   )Z
file_inputr	   r   rP   r6   )r%   r)   )r-   tr1   r1   r2   is_scope   s    rr   c                s   t   d fdd	}|S )NFc                st   | d kr||S y |  }W n  t k
r>   i  } | < Y nX y|| S  t k
rn   || }||< |S X d S )N)KeyError)Zparso_cache_noder-   include_flowsZ
for_moduler.   )cachefuncr1   r2   wrapper   s    
z(_get_parent_scope_cache.<locals>.wrapper)F)r   )rv   rw   r1   )ru   rv   r2   _get_parent_scope_cache   s    rx   c                s    j }|dkrdS xt|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r| j jd  kr|n|j }q|S |rt|tj	r|jdkrt
 fdd	| D s|S |j }qW 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 )N)r;   r<   )rR   n)r-   r1   r2   rS     s   z#get_parent_scope.<locals>.<genexpr>)r'   rr   r%   r)   rm   r;   r   
isinstancer   ZFlowanyZget_test_nodes)r-   rt   scoperm   r1   )r-   r2   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)grammarpathr1   r1   r2   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_hashed)r   r   r1   r1   r2   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   r5   rD   r3   )r   rF   rc   columnrW   )leafpositionr   r   r1   r1   r2   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   rh   r   r$   r5   Fr   awaitc             s   s   | ]}|j d  dkV  qdS )r   .N)r)   )rR   rf   r1   r1   r2   rS   ?  s    z!expr_is_dotted.<locals>.<genexpr>Nr   )r%   lenr)   expr_is_dottedall)r-   r)   r1   r1   r2   r   0  s    

r   c                 s    fdd}|S )Nc                s0   x*|   D ]}|jd }|  kr
dS q
W 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.
        r5   TF)Zget_decoratorsr)   rQ   )Zfunction_noder    Zdotted_name)method_namesr1   r2   rw   D  s
    
z&_function_is_x_method.<locals>.wrapperr1   )r   rw   r1   )r   r2   _function_is_x_methodC  s    r   staticmethodclassmethodpropertycached_property)F)rO   NFF)F)&rY   r\   astr   inspectr   weakrefr   Zparso.pythonr   Zparso.cacher   Zparsor   r,   r@   r*   r8   r:   rC   rG   rI   rE   rb   rd   rp   rr   rx   r~   Zget_cached_parent_scoper   r   r   r   r   Zfunction_is_staticmethodZfunction_is_classmethodZfunction_is_propertyr1   r1   r1   r2   <module>   sF   


%

 
 	
 