
    !.d/                        U d Z ddlZddlmZmZ ddlmZmZ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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j0        dej1        dej2        dej3        dej4        dej5        dej6        dej7        dej8        dej9        dej:        dej;        diZ<ee(d<   dZ=ee(d <    G d! d"e>          Z?e G d# d$                      Z@d.d%ed&e	e         d'e&fd(ZAd.d%ed&e	e         d'e&fd)ZBd*e!d'e&fd+ZCd,e
e         d'ee$         fd-ZDdS )/z,Builds on top of nodes.py to track brackets.    N)	dataclassfield)DictIterableListOptionalSequenceSetTupleUnion)      )Final)
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	   r               r      MATH_PRIORITIES   DOT_PRIORITYc                       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__     .lib/python3.11/site-packages/black/brackets.pyr3   r3   <   s        VVVVr9   r3   c                      e Zd ZU dZdZeed<    ee          Z	e
eeef         ef         ed<    ee          Ze
eef         ed<   dZee         ed<    ee          Zee         ed	<    ee          Zee         ed
<    ee          Zee         ed<   deddfdZdefdZddee         defdZddedefdZdedefdZdedefdZ dedefdZ!dedefdZ"dee         f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                 0   |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| xj        dz  c_        	 | j                            | j        |j         f          }n%# t          $ r}t          d|           |d}~ww xY w||_        |j        s| j                            |           | j        |_        | j        dk    rit!          || j                  }|r$| j        || j        t'          | j                  <   n.t)          || j                  }|r|| j        t'          |          <   |j         t*          v rR|| j        | j        t,          |j                  f<   | xj        dz  c_        |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   r0   zDUnable to match a closing bracket to the following opening bracket: )typer   COMMENTr=   r   r?   'maybe_decrement_after_for_loop_variable&maybe_decrement_after_lambda_argumentspopKeyErrorr3   opening_bracketvaluerD   appendbracket_depthis_split_before_delimiterrA   r@   idis_split_after_delimiterr   r    maybe_increment_lambda_arguments!maybe_increment_for_loop_variable)selfrE   rN   edelims        r:   markzBracketTracker.markL   s2   $ 9%%F J!OO	---TY't/AAAF44T:::33D9999(((JJ!OJJ"&"4"8"8$*di9P"Q"Q   '(!%( (  
 $3D : ,%%d+++!Z:??-dDMBBE 625:4= 1 1220t}EE 605DOBtHH-9(((AEDtz749+==>JJ!OJJ: ,%%d+++--d333..t44444s   &B8 8
CCCc                 *    t          | j                  S )zBReturn True if there is an yet unmatched open bracket on the line.)boolr?   rW   s    r:   any_open_bracketsz BracketTracker.any_open_brackets   s    D&'''r9   r8   excludec                 h    t          f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   *   K   | ]\  }}|v	|V  d S Nr8   ).0kvr_   s      r:   	<genexpr>z8BracketTracker.max_delimiter_priority.<locals>.<genexpr>   s1      MMAAW<L<L1<L<L<L<LMMr9   )maxr@   items)rW   r_   s    `r:   max_delimiter_priorityz%BracketTracker.max_delimiter_priority   s6     MMMM!6!6!8!8MMMMMMr9   priorityc                     | j         sdS p|                                 t          f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   (   K   | ]}|k    d V  dS )r0   Nr8   )rc   prj   s     r:   rf   z?BracketTracker.delimiter_count_with_priority.<locals>.<genexpr>   s'      HH!x--1----HHr9   )r@   ri   sumvalues)rW   rj   s    `r:   delimiter_count_with_priorityz,BracketTracker.delimiter_count_with_priority   s[    
  	1<t::<<HHHHdo4466HHHHHHr9   c                     |j         t          j        k    r<|j        dk    r1| xj        dz  c_        | 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`.
        forr0   TF)rH   r   NAMErO   r=   rB   rP   rW   rE   s     r:   rV   z0BracketTracker.maybe_increment_for_loop_variable   sQ     9
""tzU':':JJ!OJJ!((4444ur9   c                     | j         ra| j         d         | j        k    rK|j        t          j        k    r6|j        dk    r+| xj        dz  c_        | j                                          dS dS )z>See `maybe_increment_for_loop_variable` above for explanation.inr0   TF)rB   r=   rH   r   rs   rO   rL   rt   s     r:   rJ   z6BracketTracker.maybe_decrement_after_for_loop_variable   sn     !	%b)TZ77	UZ''
d""JJ!OJJ!%%'''4ur9   c                     |j         t          j        k    r<|j        dk    r1| xj        dz  c_        | j                            | j                   dS dS )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 `:`.
        lambdar0   TF)rH   r   rs   rO   r=   rC   rP   rt   s     r:   rU   z/BracketTracker.maybe_increment_lambda_arguments   sQ     9
""tzX'='=JJ!OJJ(//
;;;4ur9   c                     | j         rV| j         d         | j        k    r@|j        t          j        k    r+| xj        dz  c_        | j                                          dS dS )z=See `maybe_increment_lambda_arguments` above for explanation.rv   r0   TF)rC   r=   rH   r   COLONrL   rt   s     r:   rK   z5BracketTracker.maybe_decrement_after_lambda_arguments   sa     (	,R0DJ>>	U[((JJ!OJJ(,,...4ur9   c                 ^    | j                             | j        dz
  t          j        f          S )z7Return the most recent opening square bracket (if any).r0   )r?   getr=   r   RSQBr]   s    r:   get_open_lsqbzBracketTracker.get_open_lsqb   s&    !%%tzA~uz&BCCCr9   )r8   )r   )$r4   r5   r6   r7   r=   int__annotations__r   dictr?   r   r   DepthNodeTyper   r@   LeafIDPriorityrA   r   listrB   r   rC   rD   rZ   r\   r^   r   ri   rp   rV   rJ   rU   rK   r   r8   r9   r:   r<   r<   @   sF        ,,E3NNN8=d8S8S8SM4eXo.45SSS).t)D)D)DJVX%&DDD#Hhtn###"'%"="="=d3i===).t)D)D)DT#YDDD!E$777ItDz777:5 :5$ :5 :5 :5 :5x(4 ( ( ( (N Nhv.> N N N N N	I 	Ih 	Is 	I 	I 	I 	Id t    D T    T d    4 D    Dx~ D D D D D Dr9   r<   rE   rA   rF   c                 >    | 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   )rH   r   COMMAr    rE   rA   s     r:   rT   rT      s     yEK1r9   c                    t          | t          t          z            rdS | j        t          j        k    rB| j        r;| j        j        t          j        t          j	        hvr||j        t          v rt          S | j        t          v r=| j        r6| j        j        t          j        t          j        hvrt          | j                 S | j        t           v rt"          S | j        t          j        k    r||j        t          j        k    rt&          S | j        t          j        t          j        hvrdS | j        dk    r+| j        r$| j        j        t          j        t          j        hv s| j        t          j        k    r1t3          | j        t6                    r| j        j        dk    rt8          S | j        dk    r2| j        r+| j        j        t          j        t          j        hv rt8          S | j        dv r(| j        r!| j        j        t          j        k    rt@          S | j        dk    rt"          S | j        d	k    rT| j        rM| j        j        t          j!        t          j"        hv r)| |j        t          j        k    r|j        d
k    st"          S | j        d
k    rJ| j        rC| j        j        t          j!        k    r)| |j        t          j        k    r|j        dk    st"          S | j        tF          v r| j        rtH          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   Nrr   asyncif>   r   elseisrw   not)%r   r   r   rH   r   DOTparentr   import_fromdotted_namer   r1   r   factor	star_exprr/   r   r(   STRINGr&   rs   ASYNCrO   comp_forold_comp_for
isinstanceprev_siblingr   r   comp_ifold_comp_iftestr"   comp_op
comparisonr   r$   r   s     r:   rR   rR      s    o0AABBB  q 		UYK 	KT%5t7G$HHH2B!B!B 		^##K 	$KT[$.$AAAty))yK"" 		U\!! MU\))yU[111q 	
eK 	K0A BBB9## 4,d33	* &'11)) 	
dK 	Kt/? @@@%%z^###8HDI8U8UzT"" 	
dK 	Kt ??? ++%'' #" 	
eK 	K,, ++$&& #"z_$$$1r9   nodec                    | 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 ]Y}t          |t                    r|
                    |           -|                                D ]}|
                    |           Z	 |                                S # t          $ r Y dS w xY 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   rv   r0   )rH   r   atomchildrenr   LPARRPARr<   r   r   rZ   leavesri   
ValueError)r   firstlastbtcrE   s         r:   max_delimiter_priority_in_atomr   G  s     yDIqM!E=DJ%*$$ej)@)@q			B]1R4   a 	GGAJJJJ

  ((***   qqs   C* *
C87C8r   c                 j   	 t          d t          |           D                       }n# t          $ r t                      cY S w xY wg }t                      }t	          |t          |                     D ]}| |         }|j        t          v r'|                    t          |j                 |f           |j        t          v rq|rm|j        |d         d         k    rV|                                \  }}t	          ||dz             D ]*}|                    t          | |                              + n|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              3   <   K   | ]\  }}|j         t          v |V  d S rb   )rH   r   )rc   ils      r:   rf   z6get_leaves_inside_matching_brackets.<locals>.<genexpr>k  s<       
 
!Qqv9I/I/IA/I/I/I/I
 
r9   rv   r   r0   )next	enumerateStopIterationsetrangelenrH   r   rP   r   r   rL   addrS   )	r   start_indexbracket_stackidsr   rE   _startjs	            r:   #get_leaves_inside_matching_bracketsr   c  s_    
 
#F++
 
 
 
 
    uuM
%%C;F,, 
 
ay9(((  '$)"4a!89999((( mB.?.B!B!B(,,..5ua!e,, + +AGGBvayMM****+  ) Js   &) AArb   )Er7   sysdataclassesr   r   typingr   r   r   r   r	   r
   r   r   version_infotyping_extensionsr   black.nodesr   r   r   r   r   r   r   r   r   r   blib2to3.pgen2r   blib2to3.pytreer   r   LNr   r   r   r   r   r   r   r    r"   r$   r&   r(   VBAR
CIRCUMFLEXAMPER	LEFTSHIFT
RIGHTSHIFTPLUSMINUSSTARSLASHDOUBLESLASHPERCENTATTILDE
DOUBLESTARr/   r1   	Exceptionr3   r<   rT   rR   r   r   r8   r9   r:   <module>r      s   2 2 2 



 ( ( ( ( ( ( ( ( N N N N N N N N N N N N N N N N N N N Nf'''''''                        !           & & & & & & & & 4:	 !#  " " "    %          U   	J	a	K	OQ	a	J	K	J	K	q	M1	Ha	K	a     e   W W W W W	 W W W UD UD UD UD UD UD UD UDp 4 8D> X    ] ]D ]HTN ]h ] ] ] ]@     8 3v;      r9   