o
    b^                     @   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mZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ee ejZ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j)ej*ej+ej,ej-ej.ej/hZ0ee'd< dZ1ee'd< dej2e1< ddhZ3ee'd< ej4ej5ej6ej7ej8ej9hZ:ee'd< ej;ej<ej=ej>ej?ej@ejAejBejCejDejEejFejGejHhZIee'd< ejBejHhZJee'd< eJejChB ZKee'd< ejLejMejNejOejPhZQee'd< ejRejSejTejUejVhZWee'd< ejXejYejZej[ej\ej]ej^ej_ej`ejaejbejcejNejdejehZfee'd< h dZgee'd< ejhejVejihZjejkejlejmejnejoejpiZqereqs Zterequ ZvetevB Zwevejxe1hB ZydZzG dd dee Z{ded e|d!e}fd"d#Z~d$ee d!ee fd%d&Zd$ee d'eee"  d!e|fd(d)Zd*ee d+ee! d!e	eef fd,d-Zd$ee d!ee" fd.d/Zd0ed1ed!ee fd2d3Zd4ed5ed!dfd6d7Zded!efd8d9Zd$ed!ee  fd:d;Zd$ed!e|fd<d=Zded!e|fd>d?Zd$ed!e|fd@dAZd$ed!e|fdBdCZdDedEed*ee d!e|fdFdGZd$ed!e|fdHdIZdtd$edKe|d!e|fdLdMZd$ed!e|fdNdOZd$ed!e|fdPdQZdedRee" d!e|fdSdTZded!e|fdUdVZd$ed!e|fdWdXZd$ed!e|fdYdZZd$ed!e|fd[d\Zded!e|fd]d^Zded!e|fd_d`Zded!e|fdadbZded!e|fdcddZdudedfe}d!e|fdgdhZdidjdkedledme|d!dfdndoZd$ed!ee fdpdqZded!dfdrdsZdS )vz>
blib2to3 Node/Leaf transformation-related utility functions.
    N)	
CollectionGenericIteratorListOptionalSetTupleTypeVarUnion)      )Final)NodeLeaf	type_repr)pygram)token)	CACHE_DIR)has_triple_quotesT
WHITESPACE	STATEMENT   STANDALONE_COMMENTandorLOGIC_OPERATORSCOMPARATORSMATH_OPERATORSSTARSVARARGS_SPECIALSVARARGS_PARENTSUNPACKING_PARENTSTEST_DESCENDANTS>   %=&=*=+=-=/=@=^=|=**=//=<<=>>==ASSIGNMENTS7   c                   @   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)selfr5   nameZvisitf r@   J/var/www/secure340b-portal/env/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   childrenrB   )r>   r5   childr@   r@   rA   r=      s   

zVisitor.visit_defaultN)	__name__
__module____qualname____doc__LNr   r   rB   r=   r@   r@   r@   rA   r4      s    r4   leafcomplex_subscriptr6   c                C   sT  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 nw|	j tv rt|	ttB dr|S ng|	j tjkr|	jr|	jj tjtj
hv r|r|S |S nM|	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|	jr|	jj tjkr|	jjdk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r^|s8|S |tjkrI|j tj!krG|S |S |j tjkrS|jS |j tjkr\|S |S |j tj!krz|sxt|}	|	rv|	j tjkrx|S |S |j tj"kr|tj#ks|tj$kr|S |s|tj%krt|}	|	r|	j tj&kr|S |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 rf|s_|jdusSJ d|jj tj	kr]|S |S |sd|S |S |j tj*krz|rx|tj%krx|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j&tj.hv r|S |S |j tj/k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 |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: )withinprintzsubscripts are always parentedimport)0r9   parentvalueALWAYS_NO_SPACEr   COMMENTCOLONsymsZ	subscriptZsubscriptlistZsliceopprev_siblingpreceding_leafOPENING_BRACKETSCOMMAEQUALarglistargument
parametersvarargslisttypedargslistprefixr    	is_varargr!   r"   factorr   
RIGHTSHIFT
shift_exprNAMEAT	decoratorZtnametrailerLPARRPARDOTNUMBERLSQBZdotted_nameclassdefatomdictsetmaker
DOUBLESTAR	star_exprSTRINGimport_from)rK   rL   NOSPACEZDOUBLESPACEtpvprevZprevpZprevp_parentr@   r@   rA   
whitespace   s  




	 
    |tmb_\RO"C<0+&
r}   r5   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)rX   rC   r   listleaves
IndexErrorrR   )r5   resr@   r@   rA   rY     s   
rY   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)r9   prev_siblings_arerX   )r5   r   r@   r@   rA   r     s   r   r   omitc                 C   sX   d}d}t | D ]}|r||u rd}q|r||f  S t||v r%|j}q|}qtd)zKReturn (penultimate, last) leaves skipping brackets in `omit` and contents.Nz!Last two leaves were also skipped)reversedidZopening_bracketLookupError)r   r   
stop_afterlastrK   r@   r@   rA   last_two_except  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)rR   r9   r5   r@   r@   rA   parent_type  s   r   ancestor
descendantc                 C   s*   |}|r|j | kr|j }|r|j | ks	|S )z:Return the child of `ancestor` that contains `descendant`.)rR   )r   r   r5   r@   r@   rA   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)rR   removeinsert_child)r   r   rR   Z	child_idxr@   r@   rA   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   )rb   rR   rD   r9   rW   Z
file_inputrX   BRACKETS)rK   Zsame_prefix	containerrR   r@   r@   rA   container_of  s&   	r   c                 C   s$   | j D ]}t|tr|j  S qdS )z5Returns the column of the first leaf child of a node.N)rD   rC   r   columnr5   rE   r@   r@   rA   first_leaf_column  s
   


r   c                 C   s.   t jt jt jt jh}t| jo| jd j|v S )zFWhether first child is an arithmetic or a binary arithmetic expressionr   )rW   
arith_exprrf   xor_exprand_exprboolrD   r9   )r5   Z
expr_typesr@   r@   rA   first_child_is_arith  s   r   c                 C   s>   t | jd tjtjtjgrdS t | jtjtjtjgrdS dS )NTF)	r   rR   r   NEWLINEINDENTrW   simple_stmtr_   rV   rK   r@   r@   rA   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      )r9   rW   rq   lenrD   r   rk   rl   r   r@   r@   rA   is_empty_tuple0  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   )
r9   rW   rq   unwrap_singleton_parenthesistestlist_gexpr   rD   r   r[   IMPLICIT_TUPLE)r5   Zgexpr@   r@   rA   is_one_tuple:  s    
r   openingclosingc                 C   s   | j tjkr|j tjkrdS |jd }t|D ]
\}}|| u r! nqtdd}|d7 }||d D ]2}||u r= |dk S |j}||krd|j tjkrd|d7 }|jrd|jj t	j
t	jhv rd|d7 } |dk S q2|dk S )zNReturn True if content between `opening` and `closing` looks like a one-tuple.Fr   z#Opening paren not found in `leaves`r   Nr   )r9   r   rk   rl   bracket_depth	enumerater   r[   rR   rW   r]   ra   )r   r   r   depthZ_opening_indexrK   Zcommasr   r@   r@   rA   is_one_tuple_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   r9   rW   Znamedexpr_test)r5   innerr@   r@   rA   is_walrus_assignmentj  s   r   Fr   c                 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   )
r9   rW   rj   r   rD   r   rm   rg   rk   rl   )r5   r   r@   r@   rA   is_simple_decorator_trailerp  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)
r9   r   rg   rW   powerrD   allmapr   r   r   r@   r@   rA   is_simple_decorator_expression  s   	r   c                 C   s|   | j tjkrdS | j tjk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   )r9   rW   Z
yield_exprr   rg   rS   rq   r   rD   rk   rl   is_yield)r5   lparexprrparr@   r@   rA   r     s   r   rO   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)r9   r    rR   rW   rt   )rK   rO   rz   r@   r@   rA   rc     s   
rc   c                 C   s   t | jo	d| jv S )zKReturn True if `leaf` is a multiline string that actually spans many lines.
)r   rS   r   r@   r@   rA   is_multiline_string  s   r   c                 C   sV   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 t| jd S )z2Return True if `node` is a suite with a stub body.   r   r   r   Fr   )r   rD   r9   r   r   r   DEDENTis_stub_bodyr   r@   r@   rA   is_stub_suite  s   r   c                 C   sd   t | tr| jtjkrdS t| jdkrdS | jd }|jtjko1t|jdko1t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   rm   ).0rK   r@   r@   rA   	<genexpr>  s    zis_stub_body.<locals>.<genexpr>)	rC   r   r9   rW   r   r   rD   rq   r   r   r@   r@   rA   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~   rM   )
rC   r   r9   rW   rq   rD   r   rk   rS   rl   )r5   firstr   r@   r@   rA   is_atom_with_invisible_parens  s   


r   c                 C   s   t | pt| S )N)is_empty_lparis_empty_rparr   r@   r@   rA   is_empty_par  s   r   c                 C      | j tjko
| jdkS NrM   )r9   r   rk   rS   r   r@   r@   rA   r        r   c                 C   r   r   )r9   r   rl   rS   r   r@   r@   rA   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.rQ   from)	rR   r9   rS   r   r   rg   rW   import_namerv   )rK   rz   ry   r{   r@   r@   rA   	is_import  s   
r   rM   suffixc                 C   s(   | j }| j}|tjthv o|d| S )zdReturn True if the given leaf is a special comment.
    Only returns true for type comments for now.z# type:)r9   rS   r   rU   r   
startswith)rK   r   ry   r{   r@   r@   rA   is_type_comment  s   r   T)visiblerR   rE   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).
    (rM   )r   N)
r   r   rk   rl   rb   r   r   rW   rq   r   )rR   rE   r   r   r   rb   indexr   r@   r@   rA   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   rD   r9   r   rk   rl   )r5   r   wrappedr   r@   r@   rA   r   6  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)r9   r   rk   rS   rl   r   r@   r@   rA   ensure_visibleD  s
   

r   )F)rM   )rI   systypingr   r   r   r   r   r   r   r	   r
   version_infoZtyping_extensionsr   Zblib2to3.pytreer   r   r   Zblib2to3r   Zblib2to3.pgen2r   Zblack.cacher   Zblack.stringsr   Z
initializeZpython_symbolsrW   r   rJ   intZLeafIDZNodeTyper   r   r   r   __annotations__Zif_stmtZ
while_stmtZfor_stmtZtry_stmtZexcept_clauseZ	with_stmtZfuncdefrp   r   r   r:   r   LESSGREATEREQEQUALNOTEQUAL	LESSEQUALGREATEREQUALr   VBAR
CIRCUMFLEXAMPER	LEFTSHIFTre   PLUSMINUSSTARSLASHDOUBLESLASHPERCENTrh   TILDErs   r   r   r    r]   r^   rj   ra   r`   r!   rq   rr   Z	listmakerr   Ztestlist_star_exprr"   testZlambdefZor_testZand_testZnot_testZ
comparisonrt   r   r   r   rf   r   termr   r#   r2   ZtestlistZexprlistr   rk   rl   ro   RSQBLBRACERBRACEZBRACKETsetkeysrZ   valuesZCLOSING_BRACKETSr   r[   rT   RARROWr4   r   r;   r}   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rc   r   r   r   r   r   r   r   r   r   r   r   r   r@   r@   r@   rA   <module>   s    ,



	" j"&
  