o
    b*                     @   s  U d Z ddlmZmZ ddlZddlmZmZmZm	Z	m
Z
mZ ejdk r+ddlmZ nddlmZ ddlmZmZ ddlmZ dd	lmZmZmZmZ dd
lmZmZmZ ddlmZ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j0dej1dej2dej3dej4dej5dej6dej7dej8dej9diZ:ee&d < d!Z;ee&d"< G d#d$ d$e<Z=eG d%d& d&Z>d1d'ed(e	e d)e$fd*d+Z?d1d'ed(e	e d)e$fd,d-Z@d.ed)e$fd/d0ZAdS )2z,Builds on top of nodes.py to track brackets.    )	dataclassfieldN)DictIterableListOptionalTupleUnion)      )Final)LeafNode)token)syms	is_varargVARARGS_PARENTSUNPACKING_PARENTS)BRACKETOPENING_BRACKETSCLOSING_BRACKETS)MATH_OPERATORSCOMPARATORSLOGIC_OPERATORS   COMPREHENSION_PRIORITY   COMMA_PRIORITY   TERNARY_PRIORITY   LOGIC_PRIORITY   STRING_PRIORITY
   COMPARATOR_PRIORITY	   r               r
      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__ r4   r4   M/var/www/secure340b-portal/env/lib/python3.10/site-packages/black/brackets.pyr/   4   s    r/   c                   @   sR  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#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   sP  |j tjkrdS | | | | |j tv rK|  jd8  _z| j| j|j f}W n t	y> } zt
d| |d}~ww ||_|jsK| j| | j|_| jdkryt|| j}|rj| jdurj|| jt| j< nt|| j}|ry|| 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, it receives an `opening_bracket`
        field that it forms a pair with. This is a one-directional link to
        avoid reference cycles.

        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-   zDUnable to match a closing bracket to the following opening bracket: r   )typer   COMMENT'maybe_decrement_after_for_loop_variable&maybe_decrement_after_lambda_argumentsr   r7   r9   popKeyErrorr/   opening_bracketvaluer>   appendZbracket_depthis_split_before_delimiterr;   r:   idis_split_after_delimiterr   r    maybe_increment_lambda_arguments!maybe_increment_for_loop_variable)selfr?   rG   edelimr4   r4   r5   markD   sJ   





zBracketTracker.markc                 C   s
   t | jS )zBReturn True if there is an yet unmatched open bracket on the line.)boolr9   rO   r4   r4   r5   any_open_bracketsv   s   
z BracketTracker.any_open_bracketsr4   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 Nr4   ).0kvrV   r4   r5   	<genexpr>   s    z8BracketTracker.max_delimiter_priority.<locals>.<genexpr>)maxr:   items)rO   rV   r4   r[   r5   max_delimiter_priorityz   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-   Nr4   )rX   pr`   r4   r5   r\      s    z?BracketTracker.delimiter_count_with_priority.<locals>.<genexpr>)r:   r_   sumvalues)rO   r`   r4   rb   r5   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)rA   r   NAMErH   r7   r<   rI   rO   r?   r4   r4   r5   rN      
   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<   r7   rA   r   rh   rH   rE   ri   r4   r4   r5   rC      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)rA   r   rh   rH   r7   r=   rI   ri   r4   r4   r5   rM      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=   r7   rA   r   COLONrE   ri   r4   r4   r5   rD      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-   )r9   getr7   r   RSQBrT   r4   r4   r5   get_open_lsqb   s   zBracketTracker.get_open_lsqb)r4   )r   )$r0   r1   r2   r3   r7   int__annotations__r   dictr9   r   r   DepthNodeTyper   r:   LeafIDPriorityr;   r   listr<   r   r=   r>   rR   rS   rU   r   r_   re   rN   rC   rM   rD   rq   r4   r4   r4   r5   r6   8   s$   
 "2r6   r?   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   )rA   r   COMMAr   r?   r;   r4   r4   r5   rL      s   rL   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.
    )Zwithinr   Nrg   asyncif>   r}   elseisrl   not)%r   r   r   rA   r   DOTparentr   Zimport_fromZdotted_namer   r.   r   factorZ	star_exprr,   r   r%   STRINGr#   rh   ASYNCrH   Zcomp_forZold_comp_for
isinstanceZprev_siblingr   r   Zcomp_ifZold_comp_iftestr   Zcomp_opZ
comparisonr   r!   r{   r4   r4   r5   rJ      s   












rJ   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-   )rA   r   Zatomchildrenr   LPARRPARr6   r   r   rR   leavesr_   
ValueError)r   firstlastZbtcr?   r4   r4   r5   max_delimiter_priority_in_atom5  s$   



r   rW   )Br3   dataclassesr   r   systypingr   r   r   r   r   r	   version_infoZtyping_extensionsr   Zblib2to3.pytreer   r   Zblib2to3.pgen2r   Zblack.nodesr   r   r   r   r   r   r   r   r   r   LNrr   ru   rw   rv   rx   r   rs   r   r   r!   r#   r%   VBAR
CIRCUMFLEXAMPER	LEFTSHIFT
RIGHTSHIFTPLUSMINUSSTARSLASHDOUBLESLASHPERCENTATTILDE
DOUBLESTARr,   r.   rF   r/   r6   rL   rJ   r   r4   r4   r4   r5   <module>   s\     
 `