o
    hFl                     @   s"  U d Z ddlZddlmZ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 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"e ej#Z$ee%d< e
dZ&eee f Z'e(Z)e(Z*ej+ej,ej-hZ.ee%d< e$j/e$j0e$j1e$j2e$j3e$j4e$j5e$j6e$j7e$j8h
Z9ee%d< dZ:ee%d< dej;e:< ddhZ<ee%d< ej=ej>ej?ej@ejAejBhZCee%d< ejDejEejFejGejHejIejJejKejLejMejNejOejPejQhZRee%d< ejKejQhZSee%d< eSejLhB ZTee%d< e$jUe$jVe$jWe$jXe$jYhZZee%d< e$j[e$j\e$j]e$j^e$j_e$j`e$jahZbee%d< e$jce$jde$jee$jfe$jge$jhe$jie$jje$jke$jle$jme$jne$jWe$joe$jphZqee%d< e$jre$jshZtee%d< h dZuee%d< e$jve$j_e$jwhZxee%d < ejyejzej{ej|ej}ej~iZee%d!< ee Zee%d"< ee Zee%d#< eeB Zee%d$< eeje:hB Zee%d%< d&Zed'd(G d)d* d*ee& Zd+ed,ed-ed.efd/d0Zd1ee' d.ee fd2d3Zd1ee' d4eee*  d.efd5d6Zd1ee' d.ee* fd7d8Zd9e d:e'd.ee' fd;d<Zd=e'd>e'd.dfd?d@Zd+ed.e'fdAdBZd1e'd.ee fdCdDZd1e'd.efdEdFZd+ed.efdGdHZd1e'd.efdIdJZd1e'd.efdKdLZd1e'd.efdMdNZejyejzffdOedPedQee dRe	e(e(f d.ef
dSdTZd1e'd.efdUdVZdd1e'dXed.efdYdZZd1e'd.efd[d\Zd1e'd.efd]d^Zd+ed_ee* d.efd`daZd+ed.efdbdcZd1e d.efdddeZd1e d.efdfdgZd1e'd.efdhdiZd1e'd.efdjdkZd+ed.efdldmZd+ed.efdndoZd+ed.efdpdqZd+ed.efdrdsZd+ed.efdtduZd+ed.efdvdwZd+ed.efdxdyZd+ed.efdzd{Zd|ed.efd}d~Zd'dde de'ded.dfddZd1e'd.ee' fddZd+ed.dfddZded.ee fddZded.ee fddZded.ee fddZded.ee fddZded.ee fddZd+ed.efddZd1e'd.ee fddZd1e'd.ee fddZd+ed.e'fddZdS )z>
blib2to3 Node/Leaf transformation-related utility functions.
    N)	FinalGenericIteratorListOptionalSetTuple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                   @   s<   e Zd ZdZdedee fddZdedee fddZdS )	VisitorzBBasic lib2to3 visitor that yields things of type `T` on `visit()`.nodereturnc                 c   sd    |j dk rtj|j  }ntt|j }t| d| d}|r(||E dH  dS | |E dH  dS )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visitf rO   A/var/www/html/ai/venv/lib/python3.10/site-packages/black/nodes.pyvisit   s   

zVisitor.visitc                 c   s0    t |tr|jD ]}| |E dH  q	dS dS )zCDefault `visit_*()` implementation. Recurses to children of `node`.N)
isinstancer   childrenrQ   )rL   rC   childrO   rO   rP   rK      s   

zVisitor.visit_defaultN)	__name__
__module____qualname____doc__LNr   r   rQ   rK   rO   rO   rO   rP   rB      s    rB   leafcomplex_subscriptmoderD   c                C   s^  d}d}d}| j }| j}| j}|tv r|S |tjkr|S |dus'J d| |tjkr9|j tjtj	tj
hvr9|S | j}	|	st|}
|
rI|
j tv rK|S |tjkrd|
j tjkrX|S |
j tjkrb|sb|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 nl|
j tjkrt|
tjkrt|
jtj	kr|S |
j tv rt|
ttB dr|S nE|
j tjkr|
jr|
jj tjtj
hv r|r|S |S n+|
jr|
jj tjkr|
j tv r|S |
j tjkr|jr|jj tj kr|S n|	j tv r|S |j tjtjhv r|	r|	j tjkr
|S |S |j tjkr!|	r|	j tjkr|S |S |j tjkrR|	s-|S |tjkr=|	j t!vr;|S |S |	j tjkrG|	jS |	j tjkrP|S |S |j t!v rm|	skt|}
|
ri|
j tjkrk|S |S |j tj"kr|tj#ks|tj$kr|S |	s|tj%ks|tj&kr|S |S |	j tjkr|S |S |j tjkr|tjkr|S |	st|}
|
r|
j tj#kr|S |S |	j tjhtB v r|S |S |j tj kr|S |j tj'kr |	r|S t|}
|
r|
j tjks|
j tj%kr|S |S |j tj(kr|tj#kr|S |	r|	j tj#kr|S |S |j tjtj
hv r\|	s@|jdus4J d|jj tj	kr>|S |S t)j*|v rU|tj+ksS|	j tj+krU|S |sZ|S |S |j tj,krp|	rn|tj%krn|S |S |j tj-kr|	r|	j tj.kr|S |S |j tjtjhv r|	st|}
|
r|
j tv r|S |
j}|dusJ |
j tjkr|j tjtj
hv r|S |
j tjkr|j tjkr|S |S |tj/tj0tj1hv r|S |S |j tj2kr|tj%kr|	r|	j tj%kr|S |S |tj/kr|dkr|S |	r|	j tj%kr|S |S |j tj
kr|S |j tj3kr-|tj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  Nz/INTERNAL ERROR: hand-made leaf without parent: )withinzsubscripts are always parentedimport)4rG   parentvaluer?   r   COMMENTCOLONr   	subscriptsubscriptlistsliceopprev_siblingpreceding_leafr<   COMMAEQUALarglistargument
parametersvarargslisttypedargslistprefixSTARparent_type	star_exprr&   	is_varargr'   r(   factorr$   AT	decoratorr*   trailerLPARRPARDOTLSQBdotted_nameclassdefr   walrus_subscript
COLONEQUALatomdictsetmaker
DOUBLESTARNAMENUMBERSTRINGimport_fromexcept_clause)rZ   r[   r\   NOSPACEDOUBLESPACEtpvprevprevpprevp_parentrO   rO   rP   
whitespace   sp  



 
   
  xqhe[X"LE4/*
	r   rC   c                 C   sR   | r'| j }|r"t|tr|S z	t| d W S  ty!   Y dS w | j} | sdS )z3Return the first leaf that precedes `node`, if any.N)rh   rR   r   listleaves
IndexErrorra   )rC   resrO   rO   rP   ri     s   
ri   tokensc                 C   sJ   |sdS |d du r| du S | sdS | j |d krdS 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)rG   prev_siblings_arerh   )rC   r   rO   rO   rP   r     s   r   c                 C   s   | du s	| j du rdS | j jS )z|
    Returns:
        @node.parent.type, if @node is not None and has a parent.
            OR
        None, otherwise.
    N)ra   rG   rC   rO   rO   rP   rs     s   rs   ancestor
descendantc                 C   s*   |}|r|j | kr|j }|r|j | ks	|S )z:Return the child of `ancestor` that contains `descendant`.)ra   )r   r   rC   rO   rO   rP   child_towards  s
   r   	old_child	new_childc                 C   s2   | j }|sdS |  }|dur||| dS dS )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)ra   removeinsert_child)r   r   ra   	child_idxrO   rO   rP   replace_child  s   r   c                 C   sr   | j }| }|r7|j}|du r	 |S |jd j |kr	 |S |jtjkr%	 |S |jdur3|jjtv r3	 |S |}|s|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.
    Nr   )rq   ra   rS   rG   r   
file_inputrh   r>   )rZ   same_prefix	containerra   rO   rO   rP   container_of  s&   	r   c                 C   s&   t | tr| S | jrt| jd S dS )z(Returns the first leaf of the node tree.r   N)rR   r   rS   first_leaf_ofr   rO   rO   rP   r     s
   
r   c                 C   s   | j tjtjtjtjhv S )z?Whether node is an arithmetic or a binary arithmetic expression)rG   r   
arith_expr
shift_exprxor_exprand_exprr   rO   rO   rP   is_arith_like  s   r   c                 C   sj   | j tjkrdS t| j}t|drdS t| jd tj	tj
tjgr%dS t| jtjtjtjgr3dS dS )NFbBfFT)rG   r   r   r   rb   setintersectionr   ra   NEWLINEINDENTr   simple_stmtrn   rd   )rZ   rq   rO   rO   rP   is_docstring  s   
r   c                 C   s>   | j tjkot| jdko| jd j tjko| jd j tjkS )z+Return True if `node` holds an empty tuple.   r      )rG   r   r   lenrS   r   rz   r{   r   rO   rO   rP   is_empty_tuple%  s   r   c                 C   sv   | j tjkr&t| }|du s|j tjkrdS t|jdko%|jd j tjkS | j t	v o:t| jdko:| jd j tjkS )zMReturn True if `node` holds a tuple with one element, with or without parens.NFr   r   )
rG   r   r   unwrap_singleton_parenthesistestlist_gexpr   rS   r   rj   r:   rC   gexprO   rO   rP   is_one_tuple/  s    
r   c                 C   sD   | j tjkrdS t| }|du s|j tjkrdS tdd |jD S )zDReturn True if `node` holds a tuple that contains a walrus operator.FNc                 s   s    | ]	}|j tjkV  qd S N)rG   r   namedexpr_test).0rT   rO   rO   rP   	<genexpr>G  s    z-is_tuple_containing_walrus.<locals>.<genexpr>)rG   r   r   r   r   anyrS   r   rO   rO   rP   is_tuple_containing_walrus?  s   r   openingclosingr   bracketsc           	      C   s   | j |j f|kr
dS |jd }t|D ]
\}}|| u r nqtdd}|d7 }||d D ]2}||u r9 |dk S |j}||kr`|j tjkr`|d7 }|jr`|jj tjtj	hv r`|d7 } |dk S q.|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   )
rG   bracket_depth	enumerateLookupErrorr   rj   ra   r   rl   rp   )	r   r   r   r   depth_opening_indexrZ   commasr   rO   rO   rP   is_one_sequence_betweenJ  s4   
 r   c                 C   s   t | }|duo|jtjkS )z7Return True iff `node` is of the shape ( test := test )N)r   rG   r   r   )rC   innerrO   rO   rP   is_walrus_assignmento  s   r   Flastc                 C   s   | j tjkoTt| jdko| jd j tjko| jd j tjkpT|o9t| jdko9| jd j tjko9| jd j tj	kpT|oTt| jdkoT| jd j tjkoT| jd j tj	kS )z?Return True iff `node` is a trailer valid in a simple decoratorr   r   r   r   )
rG   r   ry   r   rS   r   r|   r   rz   r{   )rC   r   rO   rO   rP   is_simple_decorator_traileru  s(   r   c                 C   sp   | j tjkrdS | j tjkr6| jr6| jd j tjko5ttt| jdd o5t	| jdk p5t| jd ddS dS )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)
rG   r   r   r   powerrS   allmapr   r   r   rO   rO   rP   is_simple_decorator_expression  s   	r   c                 C   sx   | j tjkrdS t| r| jdkrdS | j tjkrdS t| jdkr$dS | j\}}}|j tj	kr:|j tj
kr:t|S dS )zAReturn True if `node` holds a `yield` or `yield from` expression.TyieldFr   )rG   r   
yield_expris_name_tokenrb   r   r   rS   r   rz   r{   is_yield)rC   lparexprrparrO   rO   rP   r     s   r   r_   c                 C   s@   | j tvs| js
dS | j}|j tjkr|jsdS |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)rG   r&   ra   r   rt   )rZ   r_   r   rO   rO   rP   ru     s   
ru   c                 C   s   t | jo	d| jv S )zKReturn True if `leaf` is a multiline string that actually spans many lines.
)r   rb   rZ   rO   rO   rP   is_multiline_string  s   r   c                 C      | j tjkS r   )rG   r   funcdefr   rO   rO   rP   
is_funcdef     r   c                 C   sx   | j  rdS t| jdks)| jd jtjks)| jd jtjks)| jd jtjkr+dS | jd j  r5dS t	| jd S )z2Return True if `node` is a suite with a stub body.F   r   r   r   r   )
rq   stripr   rS   rG   r   r   r   DEDENTis_stub_bodyr   rO   rO   rP   is_stub_suite  s   
r   c                 C   sp   t | tr| jtjkrdS t| jdkrdS | jd }|j  o7|jtj	ko7t|jdko7t
dd |jD S )zCReturn True if `node` is a simple statement containing an ellipsis.Fr   r   r   c                 s   s     | ]}|t tjd kV  qdS ).N)r   r   r|   )r   rZ   rO   rO   rP   r     s    zis_stub_body.<locals>.<genexpr>)rR   r   rG   r   r   r   rS   rq   r   r   r   )rC   rT   rO   rO   rP   r     s   

r   c                 C   sp   t | ts| jtjkrdS | jd | jd }}t |to7|jtjko7|jdko7t |to7|jtj	ko7|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   r]   )
rR   r   rG   r   r   rS   r   rz   rb   r{   )rC   firstr   rO   rO   rP   is_atom_with_invisible_parens  s   


r   c                 C   s   t | pt| S r   )is_empty_lparis_empty_rparr   rO   rO   rP   is_empty_par  s   r   c                 C      | j tjko
| jdkS Nr]   )rG   r   rz   rb   r   rO   rO   rP   r        r   c                 C   r   r   )rG   r   r{   rb   r   rO   rO   rP   r     r   r   c                 C   sP   | j }| j}| j}t|tjko&|dkr|r|jtjkp&|dko&|o&|jtjkS )z9Return True if the given leaf starts an import statement.r`   from)	ra   rG   rb   boolr   r   r   import_namer   )rZ   r   r   r   rO   rO   rP   	is_import   s   
r   c                 C   sR   t | jtjko| jdko| jo| jjtjkp(t | jtjko'| j	o'| j	jtjkS )zDReturn True if the given leaf starts a with or async with statement.with)
r   rG   r   r   rb   ra   r   	with_stmtASYNCnext_siblingr   rO   rO   rP   is_with_or_async_with_stmt.  s   r   c                 C   s*   t | jtjko| jo| 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   rG   r   r   ra   r   
async_stmtasync_funcdefr   rO   rO   rP   is_async_stmt_or_funcdef<  s   r   c                 C   s$   | j }| j}|tjthv o|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:)rG   rb   r   rc   r   
startswithrZ   r   r   rO   rO   rP   is_type_commentI  s   r  c                 C   s"   | j }| j}|tjthv ot|S )zGReturn True if the given leaf is a type comment with ignore annotation.)rG   rb   r   rc   r   is_type_ignore_comment_stringr   rO   rO   rP   is_type_ignore_commentS  s   r  rb   c                 C   s
   |  dS )zSReturn True if the given string match with type comment with
    ignore annotation.z# type: ignore)r   )rb   rO   rO   rP   r  Z  s   
r  )visiblera   rT   r  c                C   sh   t tj|rdnd}t tj|rdnd}|j}d|_| pd}ttj|||g}||_| 	|| dS )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).
    (r]   )r   N)
r   r   rz   r{   rq   r   r   r   r   r   )ra   rT   r  r   r   rq   indexr   rO   rO   rP   wrap_in_parentheses`  s   r  c                 C   s>   t | jdkr	dS | j\}}}|jtjkr|jtjksdS |S )zqReturns `wrapped` if `node` is of the shape ( wrapped ).

    Parenthesis can be optional. Returns None otherwiser   N)r   rS   rG   r   rz   r{   )rC   r   wrappedr   rO   rO   rP   r   r  s   r   c                 C   s0   | j tjkrd| _dS | j tjkrd| _dS dS )zMake sure parentheses are visible.

    They could be invisible as part of some statements (see
    :func:`normalize_invisible_parens` and :func:`visit_import_from`).
    r  r  N)rG   r   rz   rb   r{   r   rO   rO   rP   ensure_visible  s
   

r
  nlc                 C   r   r   )rG   r   r   r  rO   rO   rP   r     r   r   c                 C   r   r   )rG   r   rz   r  rO   rO   rP   is_lpar_token  r   r  c                 C   r   r   )rG   r   r{   r  rO   rO   rP   is_rpar_token  r   r  c                 C   r   r   )rG   r   r   r  rO   rO   rP   is_string_token  r   r  c                 C   r   r   )rG   r   r   r  rO   rO   rP   is_number_token  r   r  c                 C   sP   | j }|dur&|jr|jjtjkrdS |j r|j jtjkrdS |j }|dusdS )z6Returns whether this leaf is part of type annotations.NTF)ra   rh   rG   r   RARROWr   tname)rZ   r   rO   rO   rP   is_part_of_annotation  s   r  c                 C   &   t | tr| S | jsdS t| jd S )z,Returns the first leaf of the ancestor node.Nr   )rR   r   rS   
first_leafr   rO   rO   rP   r    
   
r  c                 C   r  )z+Returns the last leaf of the ancestor node.Nr   )rR   r   rS   	last_leafr   rO   rO   rP   r    r  r  c                 C   sJ   | }|j r#|j jr#||j jd u r#|j }|j r#|j jr#||j jd u s|S )zGReturns the furthest ancestor that has this leaf node as the last leaf.r   )ra   rS   )rZ   rC   rO   rO   rP    furthest_ancestor_with_last_leaf  s
   r  )F)rX   systypingr   r   r   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   rY   intLeafIDNodeTyper   r   r   r   if_stmt
while_stmtfor_stmttry_stmtr   r   r   r   
match_stmt
case_blockr   r   rH   r"   LESSGREATEREQEQUALNOTEQUAL	LESSEQUALGREATEREQUALr#   VBAR
CIRCUMFLEXAMPER	LEFTSHIFT
RIGHTSHIFTPLUSMINUSrr   SLASHDOUBLESLASHPERCENTrw   TILDEr   r$   r%   r&   rl   rm   ry   rp   ro   r'   r   r   	listmakerr   testlist_star_exprsubject_exprpatternr(   testlambdefor_testand_testnot_test
comparisonrt   r   r   r   r   r   termr   r)   r  
tname_starr*   r9   testlistexprlistr:   rz   r{   r}   RSQBLBRACERBRACEr;   r   keysr<   valuesr=   r>   rj   r?   r  rB   r   rI   r   ri   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   ru   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   r
  r   r  r  r  r  r  r  r  r  rO   rO   rO   rP   <module>   s>   ,


	
" l"





%
 

