
    ?gt                        U d Z ddlZddl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 ddlmZ ddlmZmZ dd	lmZmZ dd
lmZ ddlmZ ddlmZmZmZmZ  ej@                  e       ejB                  Z"ee#d<    ed      Z$e	eef   Z%e&Z'e&Z(ejR                  ejT                  ejV                  hZ,ee#d<   e"jZ                  e"j\                  e"j^                  e"j`                  e"jb                  e"jd                  e"jf                  e"jh                  e"jj                  e"jl                  h
Z7ee#d<   dZ8ee#d<   dejr                  e8<   ddhZ:ee#d<   ejv                  ejx                  ejz                  ej|                  ej~                  ej                  hZAee#d<   ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  ej                  hZPee#d<   ej                  ej                  hZQee#d<   eQej                  hz  ZRee#d<   e"j                  e"j                  e"j                  e"j                  e"j                  hZXee#d<   e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  hZ`ee#d<   e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  e"j                  hZpee#d<   e"j                  e"j                  hZsee#d<   h dZtee#d<   e"j                  e"j                  e"j                  hZwee#d <   ej                  ej                  ej                  ej                  ej                  ej                  iZ~ee#d!<    ee~j                               Zee#d"<    ee~j                               Zee#d#<   eez  Zee#d$<   eej
                  e8ej                  ej                  ej                  hz  Zee#d%<   d&Z ed'(       G d) d*ee$                Zd+ed,ed-ed.efd/Zdvd0e&d1ed2ed.efd3Zd4ee%   d.ee   fd5Zd4ee%   d6eee(      d.efd7Zd4ee%   d.ee(   fd8Zd9ed:e%d.ee%   fd;Zd<e%d=e%d.dfd>Zd+ed.e%fd?Zd4e%d.ee   fd@Zd4e%d.efdAZd4ed-ed.efdBZd4e%d.efdCZd4e%d.efdDZd4e%d.efdEZej                  ej                  ffdFedGedHee   dIee&e&f   d.ef
dJZd4e%d.efdKZdwd4e%dLed.efdMZd4e%d.efdNZd4e%d.efdOZd+edPee(   d.efdQZd4ed.efdRZd4ed.efdSZd4e%d.efdTZd4ed.efdUZd4ed.efdVZd4ed.efdWZd4e%d.efdXZd4e%d.efdYZd+ed.efdZZd+ed.efd[Zd+ed.efd\Zd+ed.efd]Zd+ed.efd^Zd+ed.efd_Zd+ed.efd`Zd+ed.efdaZdbed.efdcZd'dddeedfe%dged.dfdhZd4e%d.ee%   fdiZd+ed.dfdjZdked.ee   fdlZdked.ee   fdmZdked.ee   fdnZdked.ee   fdoZd+ed.edp   fdqZd+ed.efdrZd4e%d.ee   fdsZd4e%d.ee   fdtZd+ed.e%fduZy)xz>
blib2to3 Node/Leaf transformation-related utility functions.
    N)FinalGenericIteratorLiteralOptionalTypeVarUnion)   
   )	TypeGuard)
mypyc_attr)	CACHE_DIR)ModePreview)get_string_prefixhas_triple_quotes)pygram)token)NLLeafNode	type_reprsymsT
WHITESPACE	STATEMENT   STANDALONE_COMMENTandorLOGIC_OPERATORSCOMPARATORSMATH_OPERATORSSTARSVARARGS_SPECIALSVARARGS_PARENTSUNPACKING_PARENTSTEST_DESCENDANTSTYPED_NAMES>   %=&=*=+=-=/=@=^=|=**=//=<<=>>=:=ASSIGNMENTSIMPLICIT_TUPLEBRACKETOPENING_BRACKETSCLOSING_BRACKETSBRACKETSALWAYS_NO_SPACE7   T)allow_interpreted_subclassesc                   <    e Zd ZdZdedee   fdZdedee   fdZy)VisitorzBBasic lib2to3 visitor that yields things of type `T` on `visit()`.nodereturnc              #   "  K   |j                   dk  rt        j                  |j                      }nt        t	        |j                               }t        | d| d      }|r ||      E d{    y| j                  |      E d{    y7 7 w)az  Main method to visit `node` and its children.

        It tries to find a `visit_*()` method for the given `node.type`, like
        `visit_simple_stmt` for Node objects or `visit_INDENT` for Leaf objects.
        If no dedicated `visit_*()` method is found, chooses `visit_default()`
        instead.

        Then yields objects of type `T` from the selected visitor.
           visit_N)typer   tok_namestrr   getattrvisit_default)selfrD   namevisitfs       +lib/python3.12/site-packages/black/nodes.pyvisitzVisitor.visit   s{      99s?>>$)),Dy+,D
 v5d|##))$/// $/s$   A)B+B,BBBBc              #      K   t        |t              r+|j                  D ]  }| j                  |      E d{     yy7 w)zCDefault `visit_*()` implementation. Recurses to children of `node`.N)
isinstancer   childrenrR   )rN   rD   childs      rQ   rM   zVisitor.visit_default   s8     dD!::e,,, ' ",s   4A?	AN)	__name__
__module____qualname____doc__LNr   r   rR   rM        rQ   rC   rC      s3    L0" 0! 00-" -! -r]   rC   leafcomplex_subscriptmoderE   c                   d}d}d}| j                   }| j                  }| j                  }|t        v r|S |t        j
                  k(  r|S |
J d|        |t        j                  k(  r=|j                   t        j                  t        j                  t        j                  hvr|S |t        j                  k(  r|j                   t        j                  k(  r|S | j                  }	|	st        |      }
|
r|
j                   t        v r|S |t        j                  k(  rB|
j                   t        j                  k(  r|S |
j                   t        j                   k7  r|s|S |S |
j                   t        j"                  k(  r|
j                  r|
j                  j                   t        j$                  t        j&                  t        j(                  t        j*                  hv r|S |
j                  j                   t        j,                  k(  r|
j.                  S |
j                   t        j0                  k(  r|t3        |
      t        j4                  k(  r`t3        |
j                        t        j                  k(  s8t6        j8                  |v r(t3        |
j                        t        j:                  k(  r|S |
j                   t<        v rt?        |
t@        tB        z        r4|S |
j                   t        j                  k(  rI|
j                  r|
j                  j                   t        j                  t        j                  hv r|r|S |S |
j                  r;|
j                  j                   t        jD                  k(  r|
j                   tF        v r|S |
j                   t        jH                  k(  rh|j                  r\|j                  j                   t        jJ                  k(  r5|S |	j                   t        v r|S |	j                   t        jL                  k(  r|S |j                   t        j(                  t        j$                  hv r#|	r|	j                   t        j                   k7  r|S |S |j                   t        j*                  k(  r#|	r|	j                   t        j                   k7  r|S |S |j                   t        j,                  k(  ru|	s|S |t        j"                  k(  r|	j                   tN        vrJ|S |	j                   t        j"                  k(  r|	j.                  S |	j                   t        j                   k7  r|S |S |j                   tN        v r0|	s,t        |      }
|
r|
j                   t        j                   k7  r|S |S |j                   t        jP                  k(  rs|t        jR                  k(  s|t        jT                  k(  r|S |	s(|t        jV                  k(  s|t        jX                  k(  r!|S |	j                   t        j                   k7  r|S |S |j                   t        j&                  k(  rk|t        j"                  k(  r|S |	s,t        |      }
|
r|
j                   t        jR                  k(  r(|S |	j                   t        j"                  ht<        z  v r|S |S |j                   t        jJ                  k(  r|S |j                   t        jZ                  k(  rO|	r|S t        |      }
|
r:|
j                   t        jH                  k(  s|
j                   t        jV                  k(  r|S |S |j                   t        j\                  k(  r8|t        jR                  k(  r|S |	r|	j                   t        jR                  k(  r|S |S |j                   t        j                  t        j                  hv rx|	s>|j                  J d       |j                  j                   t        j                  k(  r|S |S |t        j^                  k(  s|	j                   t        j^                  k(  r|S |s|S |S |j                   t        j`                  k(  r|	r|t        jV                  k(  r|S |S |j                   t        jb                  k(  r#|	r|	j                   t        jd                  k(  r|S |S |j                   t        jD                  t        j4                  hv r|	st        |      }
|
r|
j                   t        v r|S |
j                  }|J |
j                   t        j                  k(  r.|j                   t        j                  t        j                  hv r|S |
j                   t        j"                  k(  rR|j                   t        j&                  k(  r5|S |t        jf                  t        jh                  t        jj                  hv r|S |S |j                   t        jl                  k(  rq|t        jV                  k(  r!|	rZ|	j                   t        jV                  k(  r=|S |t        jf                  k(  r(|dk(  r|S |	r|	j                   t        jV                  k(  r|S |S |j                   t        j                  k(  r|S |j                   t        jn                  k(  r|t        j0                  k(  r|S |S )zReturn whitespace prefix if needed for the given `leaf`.

    `complex_subscript` signals whether the given leaf is part of a subscription
    which has non-trivial arguments, like arithmetic expressions or function calls.
      z  z/INTERNAL ERROR: hand-made leaf without parent: )withinzsubscripts are always parentedimport)8rI   parentvaluer?   r   COMMENTCOLONr   	subscriptsubscriptlistsliceopLBRACEfstring_replacement_fieldprev_siblingpreceding_leafr<   COMMAEQUALarglistargument
parametersvarargslisttypedargslistprefixSTARparent_type	star_exprr   $pep646_typed_star_arg_type_var_tuple
tname_starr%   	is_varargr&   r'   factorr#   AT	decoratorBANGr)   trailerLPARRPARDOTLSQBdotted_nameclassdef
COLONEQUALatomdictsetmaker
DOUBLESTARNAMENUMBERSTRINGimport_fromexcept_clause)r^   r_   r`   NOSPACEDOUBLESPACEtpvprevprevpprevp_parents               rQ   
whitespacer      s    BE"K		AA

AO	EMM=TKD8TT=EKKAFF+ 
 	ELLQVVt'E'EE	Dq!

&66IzzU[[(	u{{*3D	L::$||<<$$LLMMOO$$	)  I\\&&$*<*<< !<<' JJ%**$E"dnn4ELL)T-?-??@@DH#ELL1T__D
 IZZ++9J'JK	ZZ5;;&|| 1 1dnndll5S S 1u9r9 LL!!T[[0

n,IZZ588#QXX]]dnn5TI	&	&		ejj	 	vv$//4<<00tyyEKK/IZ LW 
4##	#DII,IP LM 
4%%	%Iyy+	YY%++% ;;YY%++%In Lk 
;	"1%EEJJ%++5	` L] 
4<<	

?a5::oIEII~ejj	YY%++%IH LE 
4==	 I"1%EEJJ%**4	YY5;;-*:::In Lk 
4>>	!		
4##	#Iq!

ehh.%**		2IIV LS 
4==	 

?IDII+IH LE 
DNNDLL1	188'I)II'xx}} 2 22I%"""dii53C3C&CL"Ij Lg 
499	ANI` L] 
4$$	$DII!1!11IV LS 
DKK0	0"1%EEJJ*::	 <<L+++zzU[[(\->->C . 	u{{*|/@/@DMM/Q	 5::u||U\\::I* L' 
4##	#		>		UYY.	%**_H}		UYY.	 L 
4<<			
4%%	%

?ILr]   nl_count	form_feed
empty_linec                 ,    |r|| dz
  z  dz   |z   S || z  S )z$Generate a normalized prefix string.   r\   )r   r   r   s      rQ   make_simple_prefixr     s)    hl+t3j@@  r]   rD   c                     | rL| j                   }|r/t        |t              r|S 	 t        |j	                               d   S | j                  } | rLy# t
        $ r Y yw xY w)z3Return the first leaf that precedes `node`, if any.N)ro   rT   r   listleaves
IndexErrorrf   )rD   ress     rQ   rp   rp     sf    
#t$
CJJL)"--
 {{  	  s   A 	AAtokensc                 x    |sy|d   | du S | sy| j                   |d   k7  ryt        | j                  |dd       S )a;  Return if the `node` and its previous siblings match types against the provided
    list of tokens; the provided `node`has its type matched against the last element in
    the list.  `None` can be used as the first element to declare that the start of the
    list is anchored at the start of its parent's children.Tr   NF)rI   prev_siblings_arero   )rD   r   s     rQ   r   r     sP    
 bzt|yyF2JT..s<<r]   c                 L    | | j                   y| j                   j                  S )z|
    Returns:
        @node.parent.type, if @node is not None and has a parent.
            OR
        None, otherwise.
    N)rf   rI   rD   s    rQ   rz   rz     s%     |t{{*;;r]   ancestor
descendantc                 h    |}|r-|j                   | k7  r|j                   }|r|j                   | k7  r|S )z:Return the child of `ancestor` that contains `descendant`.)rf   )r   r   rD   s      rQ   child_towardsr     s3    #D
4;;(*{{ 4;;(*Kr]   	old_child	new_childc                 l    | j                   }|sy| j                         }||j                  ||       yy)z
    Side Effects:
        * If @old_child.parent is set, replace @old_child with @new_child in
        @old_child's underlying Node structure.
            OR
        * Otherwise, this function does nothing.
    N)rf   removeinsert_child)r   r   rf   	child_idxs       rQ   replace_childr     s>     F  "IIy1 r]   c                 &   | j                   }| }|r|j                  }|	 |S |j                  d   j                   |k7  r	 |S |j                  t        j
                  k(  r	 |S |j                  |j                  j                  t        v r	 |S |}|r|S )zReturn `leaf` or one of its ancestors that is the topmost container of it.

    By "container" we mean a node where `leaf` is the very first child.
    r   )rx   rf   rU   rI   r   
file_inputro   r>   )r^   same_prefix	containerrf   s       rQ   container_ofr     s    
 ++KI
!!>  ??1$$3  ;;$//) 	 *v/B/B/G/G8/S  	  r]   c                 p    t        | t              r| S | j                  rt        | j                  d         S y)z(Returns the first leaf of the node tree.r   N)rT   r   rU   first_leaf_ofr   s    rQ   r   r     s/    $}}T]]1-..r]   c                     | j                   t        j                  t        j                  t        j                  t        j
                  hv S )z?Whether node is an arithmetic or a binary arithmetic expression)rI   r   
arith_expr
shift_exprxor_exprand_exprr   s    rQ   is_arith_liker     s4    99	  r]   c                    t        | t              rN| j                  t        j                  k7  ryt        | j                        }t        |      j                  d      ryt        j                  |v r| j                  r| j                  j                  t        j                  k(  r^| j                  j                  sH| j                  j                  r2| j                  j                  j                  t        j                  k(  ryt!        | j                  d t        j"                  t        j$                  t        j                  g      ryt!        | j                  t        j&                  t        j(                  t        j                  g      ryy)NFbBfFT)rT   r   rI   r   r   r   rg   setintersectionr   unify_docstring_detectionrf   r   simple_stmtro   r   r   NEWLINEINDENTru   ri   )rD   r`   rx   s      rQ   is_docstringr   )  s   $99$"4::.v;##F+ 	))T1KKKK 0 00((KKKK##t6dEMM5<<9I9IJ  tTEUEU&VW r]   c                     | j                   t        j                  k(  xrp t        | j                        dk(  xrV | j                  d   j                   t
        j                  k(  xr* | j                  d   j                   t
        j                  k(  S )z+Return True if `node` holds an empty tuple.   r   r   )rI   r   r   lenrU   r   r   r   r   s    rQ   is_empty_tupler   J  sq     			TYY 	0!#	0MM!!!UZZ/	0 MM!!!UZZ/	r]   c                    | j                   t        j                  k(  rot        |       }||j                   t        j                  k7  ryt        |j                        dk(  xr* |j                  d   j                   t        j                  k(  S | j                   t        v xrD t        | j                        dk(  xr* | j                  d   j                   t        j                  k(  S )zMReturn True if `node` holds a tuple with one element, with or without parens.Fr   r   )
rI   r   r   unwrap_singleton_parenthesistestlist_gexpr   rU   r   rq   r:   rD   gexps     rQ   is_one_tupler   T  s    yyDII+D1<499(:(::4==!Q&O4==+;+@+@EKK+OO 			^# 	1!#	1MM!!!U[[0r]   c                     | j                   t        j                  k7  ryt        |       }||j                   t        j                  k7  ryt        d |j                  D              S )zDReturn True if `node` holds a tuple that contains a walrus operator.Fc              3   V   K   | ]!  }|j                   t        j                  k(   # y wN)rI   r   namedexpr_test).0rV   s     rQ   	<genexpr>z-is_tuple_containing_walrus.<locals>.<genexpr>l  s      LmUuzzT000m   '))rI   r   r   r   r   anyrU   r   s     rQ   is_tuple_containing_walrusr   d  sM    yyDII'-D|tyyD$6$66LdmmLLLr]   openingclosingr   bracketsc                    | j                   |j                   f|k7  ry|j                  dz   }t        |      D ]  \  }}|| u s n t        d      d}|dz  }||d D ]  }||u r |dk  S |j                  }||k(  s|j                   t        j
                  k(  s=|dz  }|j                  sO|j                  j                   t        j                  t        j                  hv s|dz  } |dk  S  |dk  S )zIReturn True if content between `opening` and `closing` is a one-sequence.Fr   z#Opening paren not found in `leaves`r   Nr   )
rI   bracket_depth	enumerateLookupErrorr   rq   rf   r   rs   rw   )	r   r   r   r   depth_opening_indexr^   commasr   s	            rQ   is_one_sequence_betweenr   o  s    	gll#x/!!A%E )& 17? !2
 ?@@FaN~'7? A: **E!dii5;;&>aKF{{t{{//""4   !A: ( A:r]   c                 ^    t        |       }|duxr |j                  t        j                  k(  S )z7Return True iff `node` is of the shape ( test := test )N)r   rI   r   r   )rD   inners     rQ   is_walrus_assignmentr     s+    (.EBt/B/B!BBr]   lastc                    | j                   t        j                  k(  xr\ t        | j                        dk(  xrV | j                  d   j                   t
        j                  k(  xr* | j                  d   j                   t
        j                  k(  xs |xrp t        | j                        dk(  xrV | j                  d   j                   t
        j                  k(  xr* | j                  d   j                   t
        j                  k(  xst |xrp t        | j                        dk(  xrV | j                  d   j                   t
        j                  k(  xr* | j                  d   j                   t
        j                  k(  S )z?Return True iff `node` is a trailer valid in a simple decoratorr   r   r   r
   )
rI   r   r   r   rU   r   r   r   r   r   )rD   r   s     rQ   is_simple_decorator_trailerr     s1   99$ !# 4a %%24a %%3	
  4DMM"a'4a %%34 a %%3	
  4DMM"a'4a %%34 a %%3'r]   c                    | j                   t        j                  k(  ry| j                   t        j                  k(  r| j
                  r| j
                  d   j                   t        j                  k(  xr\ t        t        t        | j
                  dd             xr4 t        | j
                        dk  xs t        | j
                  d   d      S y)a\  Return True iff `node` could be a 'dotted name' decorator

    This function takes the node of the 'namedexpr_test' of the new decorator
    grammar and test if it would be valid under the old decorator grammar.

    The old grammar was: decorator: @ dotted_name [arguments] NEWLINE
    The new grammar is : decorator: @ namedexpr_test NEWLINE
    Tr   r   r   r   )r   F)
rI   r   r   r   powerrU   allmapr   r   r   s    rQ   is_simple_decorator_expressionr     s     yyEJJyyDJJ==a %%3 7q9LMN &* Q24==3D4P r]   c                    | j                   t        j                  k(  ryt        |       r| j                  dk(  ry| j                   t        j
                  k7  ryt        | j                        dk7  ry| j                  \  }}}|j                   t        j                  k(  r(|j                   t        j                  k(  rt        |      S y)zAReturn True if `node` holds a `yield` or `yield from` expression.TyieldFr
   )rI   r   
yield_expris_name_tokenrg   r   r   rU   r   r   r   is_yield)rD   lparexprrpars       rQ   r   r     s    yyDOO#TtzzW4yyDII
4==Q}}D$yyEJJ499

#:~r]   rd   c                     | j                   t        vs| j                  sy| j                  }|j                   t        j                  k(  r|j                  sy|j                  }|j                   |v S )aF  Return True if `leaf` is a star or double star in a vararg or kwarg.

    If `within` includes VARARGS_PARENTS, this applies to function signatures.
    If `within` includes UNPACKING_PARENTS, it applies to right hand-side
    extended iterable unpacking (PEP 3132) and additional unpacking
    generalizations (PEP 448).
    F)rI   r%   rf   r   r{   )r^   rd   r   s      rQ   r~   r~     sW     yy((Avv xxHH66Vr]   c                 <    | j                   t        j                  k(  S )z&Return True if the node is an f-string)rI   r   fstringr   s    rQ   
is_fstringr    s    99$$r]   c                     t        |       t        | j                        d }t        t        j
                  || j                        }| j                         xs d|_        |S )z/Converts an fstring node back to a string node.N)rx   r   )rK   r   rx   r   r   r   
get_linenolineno)rD   string_without_prefixstring_leafs      rQ   fstring_to_stringr
    sN    Ic$++&6&89u||%:4;;OK*/aKr]   c                     t        | t              rt        |       rt        |       }nt        | t              r| }nyt        |j                        xr d|j                  v S )zKReturn True if `leaf` is a multiline string that actually spans many lines.F
)rT   r   r  r
  r   r   rg   )rD   r^   s     rQ   is_multiline_stringr    sL    $*T"2 &	D$	TZZ(?TTZZ-??r]   c                     | j                   t        j                  t        j                  hv sJ | j                  J | j                  j                   t        j
                  t        j                  hv S r   )rI   r   suiter   rf   funcdefr   r   s    rQ   is_parent_function_or_classr    sU    99T%5%56666;;""";;dmm<<<r]   c                 x    | j                   t        j                  t        j                  t        j                  hv S r   )rI   r   r  r   async_funcdefr   s    rQ   is_function_or_classr    s&    99t}}d6H6HIIIr]   c                    | j                   t        |       sy| j                  j                         ryt	        | j
                        dk7  s~| j
                  d   j                  t        j                  k7  sT| j
                  d   j                  t        j                  k7  s*| j
                  d   j                  t        j                  k7  ry| j
                  d   j                  j                         ryt        | j
                  d         S )z2Return True if `node` is a suite with a stub body.F   r   r   r
   r   )rf   r  rx   stripr   rU   rI   r   r   r   DEDENTis_stub_bodyr   s    rQ   is_stub_suiter    s    {{'B4'H {{ 	DMMa==  EMM1==  ELL0==  ELL0}}Q$$&a())r]   c                    t        | t              r| j                  t        j                  k7  ryt        | j                        dk7  ry| j                  d   }|j                  j                          xrU |j                  t        j                  k(  xr6 t        |j                        dk(  xr t        d |j                  D              S )zCReturn True if `node` is a simple statement containing an ellipsis.Fr   r   r
   c              3   V   K   | ]!  }|t        t        j                  d       k(   # yw).N)r   r   r   )r   r^   s     rQ   r   zis_stub_body.<locals>.<genexpr>@  s!     HUYY,,r   )rT   r   rI   r   r   r   rU   rx   r  r   r   )rD   rV   s     rQ   r  r  3  s    dD!TYY$2B2B%B
4==QMM!ELL   	IJJ$))#	I1$	I HHH	r]   c                    t        | t              s| j                  t        j                  k7  ry| j
                  d   | j
                  d   }}t        |t              xrp |j                  t        j                  k(  xrQ |j                  dk(  xr@ t        |t              xr. |j                  t        j                  k(  xr |j                  dk(  S )zGiven a `LN`, determines whether it's an atom `node` with invisible
    parens. Useful in dedupe-ing and normalizing parens.
    Fr   r   rb   )
rT   r   rI   r   r   rU   r   r   rg   r   )rD   firstr   s      rQ   is_atom_with_invisible_parensr   D  s     $dii!7--"DMM"$54E5$ 	JJ%**$	KK2	 tT"	 II#		
 JJ"r]   c                 2    t        |       xs t        |       S r   )is_empty_lparis_empty_rparr^   s    rQ   is_empty_parr%  V  s    5-"55r]   c                 ^    | j                   t        j                  k(  xr | j                  dk(  S Nrb   )rI   r   r   rg   r$  s    rQ   r"  r"  Z  #    99

"7tzzR'77r]   c                 ^    | j                   t        j                  k(  xr | j                  dk(  S r'  )rI   r   r   rg   r$  s    rQ   r#  r#  ^  r(  r]   c                 *   | j                   }| j                  }| j                  }t        |t        j
                  k(  xrR |dk(  xr! |xr |j                  t        j                  k(  xs( |dk(  xr! |xr |j                  t        j                  k(        S )z9Return True if the given leaf starts an import statement.re   from)	rf   rI   rg   boolr   r   r   import_namer   )r^   r   r   r   s       rQ   	is_importr.  b  s    A		A

A	UZZ 	
(]?q?QVVt/?/?%? BV@@aff0@0@&@	 r]   c                    t        | j                  t        j                  k(  xrF | j                  dk(  xr5 | j
                  xr' | j
                  j                  t        j                  k(        xs] t        | j                  t        j                  k(  xr5 | j                  xr' | j                  j                  t        j                  k(        S )zDReturn True if the given leaf starts a with or async with statement.with)
r,  rI   r   r   rg   rf   r   	with_stmtASYNCnext_siblingr$  s    rQ   is_with_or_async_with_stmtr4  p  s    		UZZ 	/JJ& 	/KK	/ KK.	 	
 
		U[[  	5	5""dnn4
	r]   c                     t        | j                  t        j                  k(  xrD | j                  xr6 | j                  j                  t
        j                  t
        j                  hv       S )zReturn True if the given leaf starts an async def/for/with statement.

    Note that `async def` can be either an `async_stmt` or `async_funcdef`,
    the latter is used when it has decorators.
    )r,  rI   r   r2  rf   r   
async_stmtr  r$  s    rQ   is_async_stmt_or_funcdefr7  ~  sU     		U[[  	FKK	FKK$2D2D EE r]   c                     | j                   }| j                  }|t        j                  t        hv xr |j                  d      S )aB  Return True if the given leaf is a type comment. This function should only
    be used for general type comments (excluding ignore annotations, which should
    use `is_type_ignore_comment`). Note that general type comments are no longer
    used in modern version of Python, this function may be deprecated in the future.z# type:)rI   rg   r   rh   r   
startswithr^   r   r   s      rQ   is_type_commentr;    s9    
 			A

A 233OY8OOr]   c                 |    | j                   }| j                  }|t        j                  t        hv xr t        |      S )zGReturn True if the given leaf is a type comment with ignore annotation.)rI   rg   r   rh   r   is_type_ignore_comment_stringr:  s      rQ   is_type_ignore_commentr>    s5    		A

A 233X8UVW8XXr]   rg   c                 $    | j                  d      S )zSReturn True if the given string match with type comment with
    ignore annotation.z# type: ignore)r9  )rg   s    rQ   r=  r=    s     ,--r]   )visiblerf   rV   r@  c                6   t        t        j                  |rdnd      }t        t        j                  |rdnd      }|j                  }d|_        |j                         xs d}t        t        j                  |||g      }||_        | j                  ||       y)zWrap `child` in parentheses.

    This replaces `child` with an atom holding the parentheses and the old
    child.  That requires moving the prefix.

    If `visible` is False, the leaves will be valueless (and thus invisible).
    (rb   )r   N)
r   r   r   r   rx   r   r   r   r   r   )rf   rV   r@  r   r   rx   indexr   s           rQ   wrap_in_parenthesesrE    s{     

7C3D

7C3D\\FELLLNaETYYud 34II
y)r]   c                     t        | j                        dk7  ry| j                  \  }}}|j                  t        j                  k(  r|j                  t        j
                  k(  sy|S )zqReturns `wrapped` if `node` is of the shape ( wrapped ).

    Parenthesis can be optional. Returns None otherwiser
   N)r   rU   rI   r   r   r   )rD   r   wrappedr   s       rQ   r   r     sO     4==Q--D'4II#		UZZ(?Nr]   c                     | j                   t        j                  k(  rd| _        y| j                   t        j                  k(  rd| _        yy)zMake sure parentheses are visible.

    They could be invisible as part of some statements (see
    :func:`normalize_invisible_parens` and :func:`visit_import_from`).
    rB  rC  N)rI   r   r   rg   r   r$  s    rQ   ensure_visiblerI    s7     yyEJJ
	ejj	 
 
!r]   nlc                 <    | j                   t        j                  k(  S r   )rI   r   r   rJ  s    rQ   r   r         77ejj  r]   c                 <    | j                   t        j                  k(  S r   )rI   r   r   rL  s    rQ   is_lpar_tokenrO    rM  r]   c                 <    | j                   t        j                  k(  S r   )rI   r   r   rL  s    rQ   is_rpar_tokenrQ    rM  r]   c                 <    | j                   t        j                  k(  S r   )rI   r   r   rL  s    rQ   is_number_tokenrS    s    77ell""r]   )rE   paramNc                    | j                   }|w|j                  r(|j                  j                  t        j                  k(  ry|j                   r(|j                   j                  t
        j                  k(  ry|j                   }|wy)z<Returns the type of annotation this leaf is part of, if any.NrE   rT  )rf   ro   rI   r   RARROWr   tname)r^   r   s     rQ   get_annotation_typerX    si    {{H

  X%:%:%?%?5<<%O??x33tzzA?? 
 r]   c                 8    | j                   J t        |       duS )z7Returns whether this leaf is part of a type annotation.N)rf   rX  r$  s    rQ   is_part_of_annotationrZ    s"    ;;"""t$D00r]   c                 p    t        | t              r| S | j                  syt        | j                  d         S )z,Returns the first leaf of the ancestor node.Nr   )rT   r   rU   
first_leafr   s    rQ   r\  r\    s/    $]]$--*++r]   c                 p    t        | t              r| S | j                  syt        | j                  d         S )z+Returns the last leaf of the ancestor node.Nr   )rT   r   rU   	last_leafr   s    rQ   r^  r^    s/    $]]r*++r]   c                    | }|j                   r{|j                   j                  re||j                   j                  d   u rJ|j                   }|j                   r2|j                   j                  r||j                   j                  d   u rJ|S )zGReturns the furthest ancestor that has this leaf node as the last leaf.r   )rf   rU   )r^   rD   s     rQ    furthest_ancestor_with_last_leafr`    sk    D
++$++..44;;;O;OPR;S3S{{ ++$++..44;;;O;OPR;S3SKr]   )r  )F)rZ   systypingr   r   r   r   r   r   r	   version_infor   typing_extensionsmypy_extensionsr   black.cacher   
black.moder   r   black.stringsr   r   blib2to3r   blib2to3.pgen2r   blib2to3.pytreer   r   r   r   
initializepython_symbolsr   __annotations__r   r[   intLeafIDNodeTyper  r   r   r   if_stmt
while_stmtfor_stmttry_stmtr   r1  r  r   
match_stmt
case_blockr   r   rJ   r!   LESSGREATEREQEQUALNOTEQUAL	LESSEQUALGREATEREQUALr"   VBAR
CIRCUMFLEXAMPER	LEFTSHIFT
RIGHTSHIFTPLUSMINUSry   SLASHDOUBLESLASHPERCENTr   TILDEr   r#   r$   r%   rs   rt   r   rw   rv   r&   r   r   	listmakerr   testlist_star_exprsubject_exprpatternr'   testlambdefor_testand_testnot_test
comparisonr{   r   r   r   r   r   termr   r   r(   rW  r}   r)   r9   testlistexprlistr:   r   r   r   RSQBrm   RBRACEr;   r   keysr<   valuesr=   r>   rq   FSTRING_MIDDLEFSTRING_ENDr   r?   rV  rC   r,  rK   r   r   rp   r   r   rz   r   r   r   r   r   r   r   r   r   tupler   r   r   r   r   r~   r  r
  r  r  r  r  r  r   r%  r"  r#  r.  r4  r7  r;  r>  r=  rE  r   rI  r   rO  rQ  rS  rX  rZ  r\  r^  r`  r\   r]   rQ   <module>r     s    N N Nw + & ! $ >    5 5   ) ##e # CL
4:	 \\5<<?
E ?LLOOMMMMNNLLMMOOOO	5    E %9! " &	JJ	MM	MM	NN	OO	U  
JJ		KK	OO		JJ	KK	JJ	KK		MM	HH	KK	   

E,,-u -5;;-/ % /LLMMLL  	IINNLL 5  	IILLLLMMMMOONNIIMMMMOOOOLLIIJJ! % $ jj$//2U 2U $ (?(?O O	JJ

	JJ

	LL%,, 
 glln- % -gnn./ % /"%55% 5)	KK			JJ-   
 .-gaj - /-DsT s sT sc sl! ! !3 !RU !" (4. $=HRL =$x7I2J =t = 
hrl 
x'9 
D b Xb\ 2R 2B 24 2"t  2 x~  t r  $ B  r d  MR MD M "'UZZ 8	""" J" CHo	"
 
"JCr Cd Cb   4  02 $ *D #h- D .%T %d %
D T 	@b 	@T 	@=d =t =Jt J J* * *.r d " t $6t 6 68 8 88 8 8D T T d 
4 
D 
P$ P4 PY Y$ Y. . . EI * *R *T *T *$r hrl 	 	$ 	!b !Yt_ !!b !Yt_ !!b !Yt_ !# #y #	d 	w/F'G 	1 1 1,R ,HTN ,,B ,8D> ,4 B r]   