U
    -e*                     @   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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*    r2   R/var/www/html/Darija-Ai-Train/env/lib/python3.8/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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ir1   Z
first_leafr2   r2   r3   get_flow_branch_keywordQ   s    
rE   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.   r2   r2   r3   clean_scope_docstring`   s    rI   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   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k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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>r6   r%   rF   c                 s   s   | ]}|  V  qd S N)get_code).0r   r2   r2   r3   	<genexpr>   s     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    
 
re   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*   cr2   r2   r3   rg      s    
rg   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 #
    r;      Z	with_stmt   r	      N#rX   )	r&   r*   rA   prefixr'   Zget_last_leafr,   r?   index)r.   
whitespacecommentr2   r2   r3   get_following_comment_same_line   s(    


rs   c                 C   s&   | j }|dkr| jd j dkS |dkS )Nr5   r6   r7   )Z
file_inputr
   r	   rR   r7   )r&   r*   )r.   tr2   r2   r3   is_scope   s    ru   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 rS   )KeyError)Zparso_cache_noder.   include_flowsZ
for_moduler/   cachefuncr2   r3   wrapper   s    

z(_get_parent_scope_cache.<locals>.wrapper)Fr   )rz   r{   r2   rx   r3   _get_parent_scope_cache   s    r|   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	   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(   ru   r&   r*   rp   r=   r   
isinstancer   ZFlowanyZget_test_nodes)r.   rw   scoperp   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   rf   columnrZ   )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   rk   r   r%   r6   Fr   awaitc                 s   s   | ]}|j d  dkV  qdS )r   .N)r*   )rU   ri   r2   r2   r3   rV   ?  s     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 }|  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.
        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   re   rg   rs   ru   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   
           
%

    
!	
 