o
    ^i0                     @   s  U d Z ddlmZmZ ddlmZmZ ddlmZm	Z	m
Z
 ddlmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZmZ e
eef ZeZeZeZeZ dZ!ee"d	< d
Z#ee"d< dZ$ee"d< dZ%ee"d< dZ&ee"d< dZ'ee"d< ej(dej)dej*dej+dej,dej-dej.dej/dej0dej1dej2dej3dej4dej5diZ6ee"d< dZ7ee"d< G dd  d e8Z9eG d!d" d"Z:d#ed$e fd%d&Z;d1d#ed(e	e d$e fd)d*Z<d+ed$e fd,d-Z=d.ee d$e>e fd/d0Z?d'S )2z,Builds on top of nodes.py to track brackets.    )IterableSequence)	dataclassfield)FinalOptionalUnion)
BRACKETCLOSING_BRACKETSCOMPARATORSLOGIC_OPERATORSMATH_OPERATORSOPENING_BRACKETSUNPACKING_PARENTSVARARGS_PARENTS	is_varargsyms)token)LeafNode   COMPREHENSION_PRIORITY   COMMA_PRIORITY   TERNARY_PRIORITY   LOGIC_PRIORITY   STRING_PRIORITY
   COMPARATOR_PRIORITY	                        MATH_PRIORITIES   DOT_PRIORITYc                   @   s   e Zd ZdZdS )BracketMatchErrorzLRaised when an opening bracket is unable to be matched to a closing bracket.N)__name__
__module____qualname____doc__ r2   r2   S/var/www/html/stock_analysis/be/venv/lib/python3.10/site-packages/black/brackets.pyr-   7   s    r-   c                   @   s`  e Zd ZU dZdZeed< eedZ	ee
eef ef ed< eedZeeef ed< dZee ed< eedZee ed	< eedZee ed
< eedZee ed< deddfddZdefddZdefddZd%dee defddZd&dedefddZdedefddZdedefddZdedefdd Z dedefd!d"Z!dee fd#d$Z"dS )'BracketTrackerz"Keeps track of brackets on a line.r   depth)default_factorybracket_match
delimitersNprevious_for_loop_depths_lambda_argument_depths	invisibleleafreturnc              
   C   sv  |j tjkrdS | jdkr|j tv r| j|j f| jvrdS | | | | |j tv r`|  jd8  _z| j| j|j f}W n t	yS } zt
d| |d}~ww ||_|js`| j| | j|_| jdkrt|| j}|r| jdur|| jt| j< nt|}|r|| jt|< |j tv r|| j| jt|j  f< |  jd7  _|js| j| || _| | | | dS )a  Mark `leaf` with bracket-related metadata. Keep track of delimiters.

        All leaves receive an int `bracket_depth` field that stores how deep
        within brackets a given leaf is. 0 means there are no enclosing brackets
        that started on this line.

        If a leaf is itself a closing bracket and there is a matching opening
        bracket earlier, it receives an `opening_bracket` field with which it forms a
        pair. This is a one-directional link to avoid reference cycles. Closing
        bracket without opening happens on lines continued from previous
        breaks, e.g. `) -> "ReturnType":` as part of a funcdef where we place
        the return type annotation on its own line of the previous closing RPAR.

        If a leaf is a delimiter (a token on which Black can split the line if
        needed) and it's on depth 0, its `id()` is stored in the tracker's
        `delimiters` field.
        Nr   r+   zDUnable to match a closing bracket to the following opening bracket: )typer   COMMENTr5   r
   r7   'maybe_decrement_after_for_loop_variable&maybe_decrement_after_lambda_argumentspopKeyErrorr-   opening_bracketvaluer<   appendbracket_depthis_split_before_delimiterr9   r8   idis_split_after_delimiterr   r	    maybe_increment_lambda_arguments!maybe_increment_for_loop_variable)selfr=   rE   edelimr2   r2   r3   markG   sX   





zBracketTracker.markc                 C   s   t | jp| jS )zReturn True if there is an open for or lambda expression on the line.

        See maybe_increment_for_loop_variable and maybe_increment_lambda_arguments
        for details.)boolr:   r;   rN   r2   r2   r3   any_open_for_or_lambda   s   z%BracketTracker.any_open_for_or_lambdac                 C   s
   t | jS )zBReturn True if there is an yet unmatched open bracket on the line.)rR   r7   rS   r2   r2   r3   any_open_brackets   s   
z BracketTracker.any_open_bracketsr2   excludec                    s   t  fdd| j D S )zReturn the highest priority of a delimiter found on the line.

        Values are consistent with what `is_split_*_delimiter()` return.
        Raises ValueError on no delimiters.
        c                 3   s     | ]\}}| vr|V  qd S Nr2   ).0kvrV   r2   r3   	<genexpr>   s    z8BracketTracker.max_delimiter_priority.<locals>.<genexpr>)maxr8   items)rN   rV   r2   r[   r3   max_delimiter_priority   s   z%BracketTracker.max_delimiter_prioritypriorityc                    s2   | j sdS  p
|   t fdd| j  D S )zReturn the number of delimiters with the given `priority`.

        If no `priority` is passed, defaults to max priority on the line.
        r   c                 3   s    | ]	}| krd V  qdS )r+   Nr2   )rX   pr`   r2   r3   r\      s    z?BracketTracker.delimiter_count_with_priority.<locals>.<genexpr>)r8   r_   sumvalues)rN   r`   r2   rb   r3   delimiter_count_with_priority   s   z,BracketTracker.delimiter_count_with_priorityc                 C   :   |j tjkr|jdkr|  jd7  _| j| j dS dS )zIn a for loop, or comprehension, the variables are often unpacks.

        To avoid splitting on the comma in this situation, increase the depth of
        tokens between `for` and `in`.
        forr+   TF)r?   r   NAMErF   r5   r:   rG   rN   r=   r2   r2   r3   rM      
   z0BracketTracker.maybe_increment_for_loop_variablec                 C   sL   | j r$| j d | jkr$|jtjkr$|jdkr$|  jd8  _| j   dS dS )z>See `maybe_increment_for_loop_variable` above for explanation.inr+   TF)r:   r5   r?   r   rh   rF   rC   ri   r2   r2   r3   rA      s   

z6BracketTracker.maybe_decrement_after_for_loop_variablec                 C   rf   )zIn a lambda expression, there might be more than one argument.

        To avoid splitting on the comma in this situation, increase the depth of
        tokens between `lambda` and `:`.
        lambdar+   TF)r?   r   rh   rF   r5   r;   rG   ri   r2   r2   r3   rL      rj   z/BracketTracker.maybe_increment_lambda_argumentsc                 C   sB   | j r| j d | jkr|jtjkr|  jd8  _| j   dS dS )z=See `maybe_increment_lambda_arguments` above for explanation.rk   r+   TF)r;   r5   r?   r   COLONrC   ri   r2   r2   r3   rB      s   

z5BracketTracker.maybe_decrement_after_lambda_argumentsc                 C   s   | j | jd tjfS )z7Return the most recent opening square bracket (if any).r+   )r7   getr5   r   RSQBrS   r2   r2   r3   get_open_lsqb   s   zBracketTracker.get_open_lsqb)r2   )r   )#r.   r/   r0   r1   r5   int__annotations__r   dictr7   tupleDepthNodeTyper   r8   LeafIDPriorityr9   r   listr:   r;   r<   rQ   rR   rT   rU   r   r_   re   rM   rA   rL   rB   rq   r2   r2   r2   r3   r4   ;   s&   
 "<r4   r=   r>   c                 C   s   | j tjkrtS dS )zReturn the priority of the `leaf` delimiter, given a line break after it.

    The delimiter priorities returned here are from those delimiters that would
    cause a line break after themselves.

    Higher numbers are higher priority.
    r   )r?   r   COMMAr   )r=   r2   r2   r3   rK      s   rK   Nr9   c                 C   s  t | ttB dr
dS | jtjkr(| jr(| jjtjtj	hvr(|du s&|jt
v r(tS | jtv r?| jr?| jjtjtjhvr?t| j S | jtv rFtS | jtjkrX|durX|jtjkrXtS | jtjtjhvrcdS | jdkru| jru| jjtjtjhv s{| jtjkrt| jtr| jjdkrtS | jdkr| jr| jjtjtjhv rtS | jdv r| jr| jjtjkrt S | jdkrtS | jd	kr| jr| jjtj!tj"hv r|dur|jtjkr|jd
kstS | jd
kr| jr| jjtj!kr|dur|jtjkr|jdkstS | jt#v r| jrt$S dS )zReturn the priority of the `leaf` delimiter, given a line break before it.

    The delimiter priorities returned here are from those delimiters that would
    cause a line break before themselves.

    Higher numbers are higher priority.
    )withinr   Nrg   asyncif>   r~   elseisrl   not)%r   r   r   r?   r   DOTparentr   import_fromdotted_namer
   r,   r   factor	star_exprr*   r   r!   STRINGr   rh   ASYNCrF   comp_forold_comp_for
isinstanceprev_siblingr   r   comp_ifold_comp_iftestr   comp_op
comparisonr   r   )r=   r9   r2   r2   r3   rI      s   












rI   nodec                 C   s   | j tjkrdS | jd }| jd }|j tjkr|j tjks dS t }| jdd D ]}t|t	r7|
| q*| D ]}|
| q;q*z| W S  tyS   Y dS w )zReturn maximum delimiter priority inside `node`.

    This is specific to atoms with contents contained in a pair of parentheses.
    If `node` isn't an atom or there are no enclosing parentheses, returns 0.
    r   rk   r+   )r?   r   atomchildrenr   LPARRPARr4   r   r   rQ   leavesr_   
ValueError)r   firstlastbtcr=   r2   r2   r3   max_delimiter_priority_in_atomI  s$   



r   r   c           	      C   s   zt dd t| D }W n ty   t  Y S w g }t }t|t| D ]B}| | }|jtv r;|t	|j |f |jt
v rh|re|j|d d kre| \}}t||d D ]}|t| |  qXq& |S q&|S )zReturn leaves that are inside matching brackets.

    The input `leaves` can have non-matching brackets at the head or tail parts.
    Matching brackets are included.
    c                 s   s"    | ]\}}|j tv r|V  qd S rW   )r?   r   )rX   ilr2   r2   r3   r\   m  s    
z6get_leaves_inside_matching_brackets.<locals>.<genexpr>rk   r   r+   )next	enumerateStopIterationsetrangelenr?   r   rG   r	   r
   rC   addrJ   )	r   start_indexbracket_stackidsr   r=   _startjr2   r2   r3   #get_leaves_inside_matching_bracketse  s.   


r   rW   )@r1   collections.abcr   r   dataclassesr   r   typingr   r   r   black.nodesr	   r
   r   r   r   r   r   r   r   r   blib2to3.pgen2r   blib2to3.pytreer   r   LNrr   rv   rx   rw   ry   r   rs   r   r   r   r   r!   VBAR
CIRCUMFLEXAMPER	LEFTSHIFT
RIGHTSHIFTPLUSMINUSSTARSLASHDOUBLESLASHPERCENTATTILDE
DOUBLESTARr*   r,   	Exceptionr-   r4   rK   rI   r   r   r   r2   r2   r2   r3   <module>   sT    0  `