a
    lc*                     @   s   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 h dZd	Zd4ddZdd Zdd Zdd Zdd Zdd Zdd Zd5ddZdd Zdd Zd d! Zd"d# Zd6d$d%ZeeZd&d' Zd(d) Zd*d+ Z d,d- Z!d.d/ Z"e"d0Z#e"d1Z$e"d2d3Z%dS )7    N)literal_eval)cleandocWeakKeyDictionary)tree)parser_cache)split_lines>   factorexprZand_expratomZor_testZand_testfuncdeftermpowerZimport_fromZnot_testZ
shift_exprZ
comparisonclassdefimport_nametestZxor_exprZ
arith_expr	atom_expr)	tryexceptfinallyelseifelifwithforwhileFc                 C   s   g }| j }|dkrB|  }|du 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 }nNz
| j}W n ty   Y n20 | j tv 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*    r2   M/var/www/html/django/DPS/env/lib/python3.9/site-packages/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&   )r5   lastr2   r2   r3   get_sync_comp_fors:   s    



r:   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
    r6   r   r8   )for_stmtr2   r2   r3   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v 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ir1   Z
first_leafr2   r2   r3   get_flow_branch_keywordQ   s    
rE   c                 C   s"   |   }|du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.   r2   r2   r3   clean_scope_docstring`   s    rI   c                 C   sP   | j dkrL| j} |  }|d urL|j dkrL|jd }|j dkrLtt|jS dS )Nr   Zsimple_stmtr   stringrF   )r&   r(   Zget_next_siblingr*   r   rG   rH   )Z	tree_nodeZmaybe_stringr2   r2   r3   find_statement_documentationl   s    



rK   c                 C   s0   | d d   }|d dks$|dv r(dS t| S )N   r   f)frrfrF   )lowerr   )rH   Z	first_twor2   r2   r3   rG   x   s    rG   H   c           	      C   s   |du 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>r6   r%   rF   c                 s   s   | ]}|  V  qd S N)get_code).0r   r2   r2   r3   	<genexpr>       z get_signature.<locals>.<genexpr>r#   z\s+ z ->
)r&   r   rH   
get_paramsjoinstripresub
annotationrT   textwrapwrap)	r   widthZcall_stringZomit_first_paramZomit_return_annotationparamspZrtypecoder2   r2   r3   get_signature   s    
 
rf   c                 C   sD   z
| j }W n  ty*   |  j|7  _Y n0 |D ]}t|| q0dS )z$
    Move the `Node` start_pos.
    N)r*   r,   linemove)r.   line_offsetr*   cr2   r2   r3   rh      s    
rh   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y~   Y dS  ty   Y dS 0 d|vrdS ||dd }d	|v r|d|d	 }d
|v r|d|d
 }|S )zl
    returns (as string) any comment that appears on the same line,
    after the node, including the #
    r;      Z	with_stmt   r      N#rY   )	r&   r*   rA   prefixr'   Zget_last_leafr,   r?   index)r.   
whitespacecommentr2   r2   r3   get_following_comment_same_line   s(    


rt   c                 C   s&   | j }|dkr| jd j dkS |dv S )Nr5   r6   r7   )Z
file_inputr   r   rR   r7   )r&   r*   )r.   tr2   r2   r3   is_scope   s    rv   c                    s   t   d fdd	}|S )NFc                    sv   | d u r||S z |  }W n t y<   i  } | < Y n0 z
|| W S  t yp   || }||< | Y S 0 d S rS   )KeyError)Zparso_cache_noder.   include_flowsZ
for_moduler/   cachefuncr2   r3   wrapper   s    

z(_get_parent_scope_cache.<locals>.wrapper)Fr   )r{   r|   r2   ry   r3   _get_parent_scope_cache   s    r}   c                    s    j }|du rdS t|r|jdv 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   rR   :r   Ztfpdefr   Zif_stmtc                 3   s,   | ]$}|j  j   ko|jk n  V  qd S rS   )r=   r>   )rU   nr.   r2   r3   rV     s   z#get_parent_scope.<locals>.<genexpr>)r(   rv   r&   r*   rq   r=   r   
isinstancer   ZFlowanyZget_test_nodes)r.   rx   scoperq   r2   r   r3   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pathr2   r2   r3   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   r2   r2   r3   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   r6   rF   r4   )r   rH   rg   columnr[   )leafpositionr   r   r2   r2   r3   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   rl   r   r%   r6   Fr   awaitc                 s   s   | ]}|j d  dkV  qdS )r   .N)r*   )rU   rj   r2   r2   r3   rV   ?  rW   z!expr_is_dotted.<locals>.<genexpr>Nr   )r&   lenr*   expr_is_dottedall)r.   r*   r2   r2   r3   r   0  s    

r   c                     s    fdd}|S )Nc                    s.   |   D ] }|jd }|  v 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.
        r6   TF)Zget_decoratorsr*   rT   )Zfunction_noder!   Zdotted_namemethod_namesr2   r3   r|   D  s
    
z&_function_is_x_method.<locals>.wrapperr2   )r   r|   r2   r   r3   _function_is_x_methodC  s    r   staticmethodclassmethodpropertycached_property)F)rQ   NFF)F)&r]   r`   astr   inspectr   weakrefr   Zparso.pythonr   Zparso.cacher   Zparsor   r-   rB   r+   r:   r<   rE   rI   rK   rG   rf   rh   rt   rv   r}   r   Zget_cached_parent_scoper   r   r   r   r   Zfunction_is_staticmethodZfunction_is_classmethodZfunction_is_propertyr2   r2   r2   r3   <module>   sB   
%

  
!	
 