
    hy                     *   U d Z ddlZddlm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 ddlmZ dd	l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d0Zd|d1e&d2ed3ed/efd4Zd5ee%   d/ee   fd6Zd5ee%   d7eee(      d/efd8Zd5ee%   d/ee(   fd9Zd:ed;e%d/ee%   fd<Zd=e%d>e%d/dfd?Zd,ed/e%fd@Zd5e%d/ee   fdAZd5e%d/efdBZd5ed/efdCZd5e%d/efdDZd5e%d/efdEZd5e%d/efdFZd5e%d/efdGZd5e%d/efdHZd5e%d/efdIZej                  ej                  ffdJedKedLee   dMee&e&f   d/ef
dNZd5e%d/efdOZd}d5e%dPed/efdQZd5e%d/efdRZd5e%d/efdSZd,edTee(   d/efdUZd5ed/efdVZd5ed/efdWZd5e%d/efdXZd5ed/efdYZd5ed/efdZZd5ed/efd[Zd5e%d/efd\Zd5e%d/efd]Zd,ed/efd^Zd,ed/efd_Zd,ed/efd`Zd,ed/efdaZd,ed/efdbZd,ed/efdcZd,ed/efddZd,ed/efdeZdfed/efdgZd(dhdiedje%dked/dfdlZd5e%d/ee%   fdmZd,ed/dfdnZdoed/ee   fdpZdoed/ee   fdqZdoed/ee   fdrZdoed/ee   fdsZd,ed/edt   fduZd,ed/efdvZd5e%d/ee   fdwZd5e%d/ee   fdxZd,ed/e%fdyZd5e%dze&d/efd{Zy)~z>
blib2to3 Node/Leaf transformation-related utility functions.
    N)Iterator)FinalGenericLiteralOptionalTypeVarUnion)   
   )	TypeGuard)
mypyc_attr)	CACHE_DIR)Mode)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)selfrC   namevisitfs       >/var/www/html/immo/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   childrenrQ   )rM   rC   childs      rP   rL   zVisitor.visit_default   s=     dD! -::e,,,- ",s   4A?	AN)	__name__
__module____qualname____doc__LNr   r   rQ   rL        rP   rB   rB      s3    L0" 0! 00-" -! -r\   rB   leafcomplex_subscriptmoderD   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                  rY|
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(  rSt3        |
      t        j4                  k(  r7t3        |
j                        t        j                  t        j6                  fv r|S |
j                   t8        v rt;        |
t<        t>        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        j@                  k(  r|
j                   tB        v r|S |
j                   t        jD                  k(  rh|j                  r\|j                  j                   t        jF                  k(  r5|S |	j                   t        v r|S |	j                   t        jH                  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                   tJ        vrJ|S |	j                   t        j"                  k(  r|	j.                  S |	j                   t        j                   k7  r|S |S |j                   tJ        v r0|	s,t        |      }
|
r|
j                   t        j                   k7  r|S |S |j                   t        jL                  k(  rs|t        jN                  k(  s|t        jP                  k(  r|S |	s(|t        jR                  k(  s|t        jT                  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        jN                  k(  r(|S |	j                   t        j"                  ht8        z  v r|S |S |j                   t        jF                  k(  r|S |j                   t        jV                  k(  rO|	r|S t        |      }
|
r:|
j                   t        jD                  k(  s|
j                   t        jR                  k(  r|S |S |j                   t        jX                  k(  r8|t        jN                  k(  r|S |	r|	j                   t        jN                  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        jZ                  k(  s|	j                   t        jZ                  k(  r|S |s|S |S |j                   t        j\                  k(  r|	r|t        jR                  k(  r|S |S |j                   t        j^                  k(  r#|	r|	j                   t        j`                  k(  r|S |S |j                   t        j@                  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        jb                  t        jd                  t        jf                  hv r|S |S |j                   t        jh                  k(  rq|t        jR                  k(  r!|	rZ|	j                   t        jR                  k(  r=|S |t        jb                  k(  r(|dk(  r|S |	r|	j                   t        jR                  k(  r|S |S |j                   t        j                  k(  r|S |j                   t        jj                  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)6rH   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_expr
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               rP   
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)d.@.@$//-RR 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      rP   make_simple_prefixr     s)    hl+t3j@@  r\   rC   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)rn   rS   r   listleaves
IndexErrorre   )rC   ress     rP   ro   ro     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)rH   prev_siblings_arern   )rC   r   s     rP   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)re   rH   rC   s    rP   ry   ry     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`.)re   )r   r   rC   s      rP   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)re   removeinsert_child)r   r   re   	child_idxs       rP   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   )rw   re   rT   rH   r   
file_inputrn   r=   )r]   same_prefix	containerre   s       rP   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)rS   r   rT   first_leaf_ofr   s    rP   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)rH   r   
arith_expr
shift_exprxor_exprand_exprr   s    rP   is_arith_liker     s4    99	  r\   c                    t        | t              rN| j                  t        j                  k7  ryt        | j                        }t        |      j                  d      ry| 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)rS   r   rH   r   r   r   rf   setintersectionre   r   simple_stmtrn   r   r   NEWLINEINDENTrt   rh   )rC   rw   s     rP   is_docstringr   $  s    $99$"4::.v;##F+ 	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   )rH   r   r   lenrT   r   r   r   r   s    rP   is_empty_tupler   D  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   )
rH   r   r   unwrap_singleton_parenthesistestlist_gexpr   rT   r   rp   r9   rC   gexps     rP   is_one_tupler   N  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y)z$Return True if `node` holds a tuple.FT)rH   r   r   r   r   r   s     rP   is_tupler   ^  s;    yyDII'-D|tyyD$6$66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)rH   r   namedexpr_test.0rU   s     rP   	<genexpr>z-is_tuple_containing_walrus.<locals>.<genexpr>q  s     LUuzzT000L   ')rH   r   r   r   r   anyrT   r   s     rP   is_tuple_containing_walrusr   i  sM    yyDII'-D|tyyD$6$66LdmmLLLr\   c                     | j                   t        j                  k7  ryt        |       }||j                   t        j                  k7  ryt        d |j                  D              S )zBReturn True if `node` holds a tuple that contains a star operator.Fc              3   V   K   | ]!  }|j                   t        j                  k(   # y wr   )rH   r   rz   r   s     rP   r   z+is_tuple_containing_star.<locals>.<genexpr>|  s     GuzzT^^+Gr   r   r   s     rP   is_tuple_containing_starr   t  sM    yyDII'-D|tyyD$6$66GGGGr\   c                     | j                   t        j                  k7  ryt        |       }||j                   t        j                  k7  ryt        d |j                  D              S )z(Return True if `node` holds a generator.Fc              3   V   K   | ]!  }|j                   t        j                  k(   # y wr   )rH   r   old_comp_forr   s     rP   r   zis_generator.<locals>.<genexpr>  s     J5uzzT...Jr   r   r   s     rP   is_generatorr     sM    yyDII'-D|tyyD$6$66JDMMJJJr\   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   )
rH   bracket_depth	enumerateLookupErrorr   rp   re   r   rr   rv   )	r   r   r   r   depth_opening_indexr]   commasr   s	            rP   is_one_sequence_betweenr     s    	gll#x/!!A%E )& 1 A7?A
 ?@@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   rH   r   r   )rC   inners     rP   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
   )
rH   r   r   r   rT   r   r   r   r   r   )rC   r   s     rP   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)
rH   r   r   r   powerrT   allmapr   r   r   s    rP   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
   )rH   r   
yield_expris_name_tokenrf   r   r   rT   r   r   r   is_yield)rC   lparexprrpars       rP   r  r    s    yyDOO#TtzzW4yyDII
4==Q}}D$yyEJJ499

#:~r\   rc   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)rH   r$   re   r   rz   )r]   rc   r   s      rP   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)rH   r   fstringr   s    rP   
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)rw   r   )rJ   r   rw   r   r   r   
get_linenolineno)rC   string_without_prefixstring_leafs      rP   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
)rS   r   r  r  r   r   rf   )rC   r]   s     rP   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   )rH   r   suiter   re   funcdefr   r   s    rP   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   )rH   r   r  r   async_funcdefr   s    rP   is_function_or_classr  3  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   )re   r  rw   stripr   rT   rH   r   r   r   DEDENTis_stub_bodyr   s    rP   is_stub_suiter"  7  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     rP   r   zis_stub_body.<locals>.<genexpr>[  s      HUYY,,Hr   )rS   r   rH   r   r   r   rT   rw   r  r   r   )rC   rU   s     rP   r!  r!  N  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   ra   )
rS   r   rH   r   r   rT   r   r   rf   r   )rC   firstr   s      rP   is_atom_with_invisible_parensr(  _  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    rP   is_empty_parr-  q  s    5-"55r\   c                 ^    | j                   t        j                  k(  xr | j                  dk(  S Nra   )rH   r   r   rf   r,  s    rP   r*  r*  u  #    99

"7tzzR'77r\   c                 ^    | j                   t        j                  k(  xr | j                  dk(  S r/  )rH   r   r   rf   r,  s    rP   r+  r+  y  r0  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.rd   from)	re   rH   rf   boolr   r   r   import_namer   )r]   r   r   r   s       rP   	is_importr6  }  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)
r4  rH   r   r   rf   re   r   	with_stmtASYNCnext_siblingr,  s    rP   is_with_or_async_with_stmtr<    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.
    )r4  rH   r   r:  re   r   
async_stmtr  r,  s    rP   is_async_stmt_or_funcdefr?    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:)rH   rf   r   rg   r   
startswithr]   r   r   s      rP   is_type_commentrC    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.)rH   rf   r   rg   r   is_type_ignore_comment_stringrB  s      rP   is_type_ignore_commentrF    s5    		A

A 233X8UVW8XXr\   rf   c                 $    | j                  d      S )zSReturn True if the given string match with type comment with
    ignore annotation.z# type: ignore)rA  )rf   s    rP   rE  rE    s     ,--r\   )visiblere   rU   rH  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).
    (ra   )r   N)
r   r   r   r   rw   r   r   r   r   r   )re   rU   rH  r  r  rw   indexr   s           rP   wrap_in_parenthesesrM    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   rT   rH   r   r   r   )rC   r  wrappedr  s       rP   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`).
    rJ  rK  N)rH   r   r   rf   r   r,  s    rP   ensure_visiblerQ    s7     yyEJJ
	ejj	 
 
!r\   nlc                 <    | j                   t        j                  k(  S r   )rH   r   r   rR  s    rP   r  r        77ejj  r\   c                 <    | j                   t        j                  k(  S r   )rH   r   r   rT  s    rP   is_lpar_tokenrW    rU  r\   c                 <    | j                   t        j                  k(  S r   )rH   r   r   rT  s    rP   is_rpar_tokenrY    rU  r\   c                 <    | j                   t        j                  k(  S r   )rH   r   r   rT  s    rP   is_number_tokenr[    s    77ell""r\   )rD   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.NrD   r\  )re   rn   rH   r   RARROWr   tname)r]   r   s     rP   get_annotation_typer`    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)re   r`  r,  s    rP   is_part_of_annotationrb    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   )rS   r   rT   
first_leafr   s    rP   rd  rd    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   )rS   r   rT   	last_leafr   s    rP   rf  rf    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   )re   rT   )r]   rC   s     rP    furthest_ancestor_with_last_leafrh    sk    D
++$++..44;;;O;OPR;S3S{{ ++$++..44;;;O;OPR;S3SKr\   rH   c                     | j                   }||j                  |k(  ry|j                   }|| j                  }||j                  |k(  ry|j                  }|y)NTF)rn   rH   r;  )rC   rH   siblings      rP   has_sibling_with_typerk  '  so    G

<<4&& 
 G

<<4&& 

 r\   )r  )F)rY   syscollections.abcr   typingr   r   r   r   r   r	   version_infor   typing_extensionsmypy_extensionsr   black.cacher   
black.moder   black.stringsr   r   blib2to3r   blib2to3.pgen2r   blib2to3.pytreer   r   r   r   
initializepython_symbolsr   __annotations__r   rZ   intLeafIDNodeTyper   r   r   r   if_stmt
while_stmtfor_stmttry_stmtr   r9  r  r   
match_stmt
case_blockr   r   rI   r    LESSGREATEREQEQUALNOTEQUAL	LESSEQUALGREATEREQUALr!   VBAR
CIRCUMFLEXAMPER	LEFTSHIFT
RIGHTSHIFTPLUSMINUSrx   SLASHDOUBLESLASHPERCENTr~   TILDEr   r"   r#   r$   rr   rs   r   rv   ru   r%   r   r   	listmakerr   testlist_star_exprsubject_exprpatternr&   testlambdefor_testand_testnot_test
comparisonrz   r  r   r   r   r   termr   r   r'   r_  r{   r(   r8   testlistexprlistr9   r   r   r   RSQBrl   RBRACEr:   r   keysr;   valuesr<   r=   rp   FSTRING_MIDDLEFSTRING_ENDr   r>   r^  rB   r4  rJ   r   r   ro   r   r   ry   r   r   r   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+  r6  r<  r?  rC  rF  rE  rM  r   rQ  r  rW  rY  r[  r`  rb  rd  rf  rh  rk  r[   r\   rP   <module>r     s$	    $ D D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mT m mT mc m`! ! !3 !RU !" (4. $=HRL =$x7I2J =t = 
hrl 
x'9 
D b Xb\ 2R 2B 24 2"t  2 x~  t r d @  r d  2 $ MR MD MH2 H$ HKr Kd K "'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\   