o
    ^iΟ                     @   s"  d dl Z d dlZd dlmZmZmZ d dlmZmZ d dl	m
Z
mZmZmZ d dlmZmZmZ d dlmZmZ d dlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d dl'm(Z( d d	l)m*Z* d d
l+m,Z,m-Z- edZ.e/Z0e/Z1ee,e-f Z2eG dd dZ3eG dd dZ4eG dd dZ5eG dd dZ6dee. dee7e0e.f  fddZ8	d4de3de3de9e, de:ddf
ddZ;dd d!e3d"ed#e<de:fd$d%Z=d!e3de:fd&d'Z>d(e4d)e/de:fd*d+Z?d!e3d,e,d)e/de:fd-d.Z@d!e3d/e,d)e/de:fd0d1ZAd!e3de<fd2d3ZBdS )5    N)CallableIteratorSequence)	dataclassfield)OptionalTypeVarUnioncast)COMMA_PRIORITYDOT_PRIORITYBracketTracker)ModePreview)BRACKETSCLOSING_BRACKETSOPENING_BRACKETSSTANDALONE_COMMENTTEST_DESCENDANTSchild_towardsis_docstring	is_importis_multiline_stringis_one_sequence_betweenis_type_commentis_type_ignore_commentis_with_or_async_with_stmtmake_simple_prefixreplace_childsyms
whitespace)	str_width)token)LeafNodeTc                	   @   s  e Zd ZU dZeddZeed< dZe	ed< ee
dZe
e ed< eedZeee
e f ed	< eedZeed
< dZeed< dZeed< dZee ed< 	dTdedededdfddZdUdededdfddZedefddZedefddZedefddZedefddZedefdd Zedefd!d"Zedefd#d$Z edefd%d&Z!edefd'd(Z"edefd)d*Z#edefd+d,Z$edefd-d.Z%edefd/d0Z&dd1d2ee'egef  defd3d4Z(defd5d6Z)defd7d8Z*defd9d:Z+defd;d<Z,defd=d>Z-d?edefd@dAZ.dBedefdCdDZ/dede
e fdEdFZ0dVdGdHZ1dedefdIdJZ2	dUdKede3e4e5ee	f  fdLdMZ6dWdNdOZ7de8fdPdQZ9defdRdSZ:dS )XLinez;Holds leaves and comments. Can be printed with `str(line)`.F)reprmoder   depthdefault_factoryleavescommentsbracket_trackerinside_bracketsshould_split_rhsNmagic_trailing_commaleafpreformattedtrack_bracketreturnc                 C   s   |j tv p|j tjtjfv pt|j }|sdS |j tjkr(| j	r(| j
dd= | j
r=|s=| jt|| || jd7  _| jsD|rD|r`| j| | jjrW| |rV|| _n	| |r`|   | |sm| j
| dS dS )ag  Add a new `leaf` to the end of the line.

        Unless `preformatted` is True, the `leaf` will receive a new consistent
        whitespace prefix and metadata applied by :class:`BracketTracker`.
        Trailing commas are maybe removed, unpacked for loop variables are
        demoted from being delimiters.

        Inline comments are put aside.
        N)complex_subscriptr(   )typer   r"   FSTRING_MIDDLETSTRING_MIDDLEboolvaluestripCOLONis_class_paren_emptyr,   prefixr    is_complex_subscriptr(   r/   r.   markr1   has_magic_trailing_commaremove_trailing_commaappend_commentappend)selfr2   r3   r4   	has_value rI   P/var/www/html/stock_analysis/be/venv/lib/python3.10/site-packages/black/lines.pyrF   5   s4   





zLine.appendc                 C   sN   | j jdks| j  r| jrtd| jr|jtkrtd| j||d dS )zLike :func:`append()` but disallow invalid standalone comment structure.

        Raises ValueError when any `leaf` is appended after a standalone comment
        or when a standalone comment is not the first leaf on the line.
        r   z$cannot append to standalone commentsz5cannot append standalone comments to a populated liner3   N)	r.   r)   any_open_for_or_lambda
is_comment
ValueErrorr,   r8   r   rF   )rG   r2   r3   rI   rI   rJ   append_safe^   s   
zLine.append_safec                 C   s   t | jdko| jd jtkS )z"Is this line a standalone comment?   r   )lenr,   r8   r   rG   rI   rI   rJ   rM   r   s   zLine.is_commentc                 C   s   t | o| jd jtjkS )zIs this line a decorator?r   )r;   r,   r8   r"   ATrR   rI   rI   rJ   is_decoratorw   s   zLine.is_decoratorc                 C      t | o
t| jd S )zIs this an import line?r   )r;   r   r,   rR   rI   rI   rJ   r   |      zLine.is_importc                 C   rU   )zIs this a with_stmt line?r   )r;   r   r,   rR   rI   rI   rJ   r      rV   zLine.is_with_or_async_with_stmtc                 C   s*   t | o| jd jtjko| jd jdkS )z Is this line a class definition?r   class)r;   r,   r8   r"   NAMEr<   rR   rI   rI   rJ   is_class   s
   zLine.is_classc                 C   s&   | j o| jdd dd tdD kS )zEIs this line a class definition with a body consisting only of "..."?Nc                 S      g | ]}t tjd qS .r#   r"   DOT.0_rI   rI   rJ   
<listcomp>       z&Line.is_stub_class.<locals>.<listcomp>   )rY   r,   rangerR   rI   rI   rJ   is_stub_class   s   zLine.is_stub_classc                 C   s   z| j d }W n
 ty   Y dS w z| j d }W n ty$   d}Y nw |jtjkr0|jdkpD|jtjkoD|duoD|jtjkoD|jdkS )zBIs this a function definition? (Also returns True for async defs.)r   FrP   Ndef)r,   
IndexErrorr8   r"   rX   r<   ASYNC)rG   
first_leafsecond_leafrI   rI   rJ   is_def   s$   
zLine.is_defc                 C   s4   | j o| jdd ttjdgdd tdD  kS )zHIs this line a function definition with a body consisting only of "..."?N:c                 S   r[   r\   r^   r`   rI   rI   rJ   rc      rd   z$Line.is_stub_def.<locals>.<listcomp>re   )rm   r,   r#   r"   r>   rf   rR   rI   rI   rJ   is_stub_def   s   $
zLine.is_stub_defc                 C   s`   t | o/t| jdko/| jo/| jd jtjko/| jd jdko/| jd jtjko/| jd jdkS )zzIs this a class with no base classes but using parentheses?

        Those are unnecessary and should be removed.
              (re   ))	r;   rQ   r,   rY   r8   r"   LPARr<   RPARrR   rI   rI   rJ   r?      s   zLine.is_class_paren_emptyc                 C   sF   | r| j d jtjkrdS | j d j}|drdS |dr!dS dS )z#Is the line a triple quoted string?r   F)z"""z'''T)zr'''zr"""zR'''zR""")r,   r8   r"   STRINGr<   
startswith)rG   r<   rI   rI   rJ   _is_triple_quoted_string   s   

zLine._is_triple_quoted_stringc                 C   rU   )zIs the line a docstring?r   )r;   r   r,   rR   rI   rI   rJ   r      rV   zLine.is_docstringc                 C   s   dd | j D tjdkS )z Is the line a chained assignmentc                 S   s   g | ]}|j qS rI   r8   ra   r2   rI   rI   rJ   rc      s    z.Line.is_chained_assignment.<locals>.<listcomp>rP   )r,   countr"   EQUALrR   rI   rI   rJ   is_chained_assignment   s   zLine.is_chained_assignmentc                 C   s$   t | jdkr	dS | jd jtjkS )z/Does this line open a new level of indentation.r   F)rQ   r,   r8   r"   r>   rR   rI   rI   rJ   opens_block   s   zLine.opens_blockfirst_leaf_matchesr   c                C   sF   t | jdkr	dS | jd }|jtks|jdu rdS |du p"||jS )zIs this line converted from fmt off/skip code?

        If first_leaf_matches is not None, it only returns True if the first
        leaf of converted code matches.
        rP   Fr   N)rQ   r,   r8   r   fmt_pass_converted_first_leaf)rG   r   r2   rI   rI   rJ   is_fmt_pass_converted   s   

zLine.is_fmt_pass_convertedc                 C   s    | j D ]
}|jtkr dS qdS )z)If so, needs to be split before emitting.TF)r,   r8   r   rG   r2   rI   rI   rJ   contains_standalone_comments   s
   

z!Line.contains_standalone_commentsc                 C   s^   t | jdd D ]#\}}|tjkrq	t|}t|dkrq	|D ]}| |r+  dS q q	dS )zFChck if we have an implicit multiline string with comments on the linec                 S   s   | j S Nrz   )r2   rI   rI   rJ   <lambda>   s    zGLine.contains_implicit_multiline_string_with_comments.<locals>.<lambda>rP   TF)	itertoolsgroupbyr,   r"   rw   listrQ   comments_after)rG   	leaf_typeleaf_group_iterator	leaf_listr2   rI   rI   rJ   0contains_implicit_multiline_string_with_comments   s   


z5Line.contains_implicit_multiline_string_with_commentsc                 C   s   t  }z)| jd }|t| |jtjks|jtjkr+|js+| jd }|t| W n
 t	y6   Y dS w d}| j
 D ]#\}}|D ]}t|| jdr^|sZt|| jds^||vr^  dS d}qDq>dS )Nr   r6   Fr(   T)setr,   addidr8   r"   COMMArv   r<   ri   r-   itemsr   r(   r   )rG   ignored_ids	last_leafcomment_seenleaf_idr-   commentrI   rI   rJ   $contains_uncollapsable_type_comments  s8   



z)Line.contains_uncollapsable_type_commentsc                 C   s   | j sdS tdd | j D d}tdd t| j D d}||krB| j dd  D ]}| jt|g D ]}t|| jdr@  dS q3q(dS )	NFc                 s        | ]}|j d kr|j V  qdS r   Nlinenor{   rI   rI   rJ   	<genexpr>=      z9Line.contains_unsplittable_type_ignore.<locals>.<genexpr>r   c                 s   r   r   r   r{   rI   rI   rJ   r   ?  r   r6   r   T)r,   nextreversedr-   getr   r   r(   )rG   
first_line	last_linenoder   rI   rI   rJ   !contains_unsplittable_type_ignore,  s   z&Line.contains_unsplittable_type_ignorec                 C   s   t dd | jD S )Nc                 s       | ]}t |V  qd S r   )r   r{   rI   rI   rJ   r   N      z2Line.contains_multiline_strings.<locals>.<genexpr>)anyr,   rR   rI   rI   rJ   contains_multiline_stringsM  s   zLine.contains_multiline_stringsclosingc                 C   s   |j tv r| jr| jd j tjksdS |j tjkrdS |j tjkrT|jdurR|jj tj	krR|j
durRt|j
|| jtjtjfdrR|jdusGJ |jj tjksPJ dS dS | jrYdS |j
durht|j
|| jshdS dS )zReturn True if we have a magic trailing comma, that is when:
        - there's a trailing comma here
        - it's not from single-element square bracket indexing
        - it's not a one-tuple
        r   FTN)brackets)r8   r   r,   r"   r   RBRACERSQBparentr   traileropening_bracketr   LSQBprev_siblingsubscriptlistr   )rG   r   rI   rI   rJ   rC   P  sD   

zLine.has_magic_trailing_commar   c                 C   s   |j tkr| j rd|_dS |j tjkrdS | js"t|_ d|_dS | jd }|j tjkrY|j	sY|j
rYtt|j
 dkrYt|| jdsYt| jdk rTt|_ d|_dS | jd }| jt|g | dS )	z0Add an inline or standalone comment to the line. Fr   re   r   rr   r6   T)r8   r   r.   any_open_bracketsr@   r"   COMMENTr,   rv   r<   r   rQ   r   r   r(   r-   
setdefaultr   rF   )rG   r   r   rI   rI   rJ   rE   |  s<   



zLine.append_commentc                 C   s   | j t|g S )z;Generate comments that should appear directly after `leaf`.)r-   r   r   r   rI   rI   rJ   r     s   zLine.comments_afterc                 C   s>   | j  }| jt|g }| jt| j d g | dS )z@Remove the trailing comma and moves the comments attached to it.r   N)r,   popr-   r   r   extend)rG   trailing_commatrailing_comma_commentsrI   rI   rJ   rD     s
   
zLine.remove_trailing_commac                 C   sj   | j  }|du rdS |j}t|tr&|jtjkrdS |jtjkr&t	||}|duo4t
dd | D S )zAReturn True iff `leaf` is part of a slice with non-trivial exprs.NFc                 s   s    | ]}|j tv V  qd S r   )r8   r   )ra   nrI   rI   rJ   r     s    

z,Line.is_complex_subscript.<locals>.<genexpr>)r.   get_open_lsqbnext_sibling
isinstancer$   r8   r   	listmakerr   r   r   	pre_order)rG   r2   	open_lsqbsubscript_startrI   rI   rJ   rA     s   


zLine.is_complex_subscriptis_reversedc                 c   s    t ttt gttttf  f |rtnt}|| j	D ]+\}}t
|jt
|j }d|jv r2 dS | |D ]	}|t
|j7 }q7|||fV  qdS )zReturn an enumeration of leaves with their length.

        Stops prematurely on multiline strings and standalone comments.
        
N)r
   r   r   r#   r   tupleIndexenumerate_reversed	enumerater,   rQ   r@   r<   r   )rG   r   opindexr2   lengthr   rI   rI   rJ   enumerate_with_length  s   

zLine.enumerate_with_lengthc                 C   s   t | j| j| j| j| jdS )N)r(   r)   r/   r0   r1   )r&   r(   r)   r/   r0   r1   rR   rI   rI   rJ   clone  s   z
Line.clonec                 C   s   | sdS d| j  }t| j}t|}|j | |j }|ddd |D 7 }tj	| j
 }dd |D }|d|7 }|d S )zRender the line.r   z    r   c                 s   r   r   strr{   rI   rI   rJ   r     r   zLine.__str__.<locals>.<genexpr>c                 S   s   g | ]}t |qS rI   r   )ra   r   rI   rI   rJ   rc     s    z Line.__str__.<locals>.<listcomp>)r)   iterr,   r   r@   r<   joinr   chainfrom_iterabler-   values)rG   indentr,   firstrescomments_iterr-   rI   rI   rJ   __str__  s   

zLine.__str__c                 C   s   t | jp| jS )z/Return True if the line has leaves or comments.)r;   r,   r-   rR   rI   rI   rJ   __bool__  s   zLine.__bool__)FFF)r5   N)r5   r&   );__name__
__module____qualname____doc__r   r(   r   __annotations__r)   intr   r,   r#   dictr-   LeafIDr   r.   r/   r;   r0   r1   r   rF   rO   propertyrM   rT   r   r   rY   rg   rm   rp   r?   ry   r   r~   r   r   r   r   r   r   r   r   rC   rE   r   rD   rA   r   r   r   r   r   r   r   r   rI   rI   rI   rJ   r&   '   s   
 
)
$!,%


	r&   c                   @   s:   e Zd ZU dZeed< eed< eed< eed< eed< dS )	RHSResultz2Intermediate split result from a right hand split.headbodytailr   closing_bracketN)r   r   r   r   r&   r   r#   rI   rI   rI   rJ   r     s   
 r   c                   @   sz   e Zd ZU dZeed< ed  ed< eed< dZe	ed< e
edZee ed< dZe	ed	< d
Zeed< dee fddZdS )
LinesBlockzClass that holds information about a block of formatted lines.

    This is introduced so that the EmptyLineTracker can look behind the standalone
    comments and adjust their empty lines for class or def lines.
    r(   previous_blockoriginal_liner   beforer*   content_linesafterF	form_feedr5   c                 C   s8   t t| jd}t| j| j|}|g| j || j g S )Nr   )r   r&   r(   r   r   r   r   r   )rG   
empty_liner@   rI   rI   rJ   	all_lines  s   zLinesBlock.all_linesN)r   r   r   r   r   r   r   r&   r   r   r   r   r   r   r   r   r;   r   rI   rI   rI   rJ   r     s   
 r   c                
   @   s   e Zd ZU dZeed< dZee ed< dZ	ee
 ed< eedZee ed< dZee
 ed< d	ed
e
fddZd	ed
efddZd	ed
eeef fddZd	ededed
eeef fddZdS )EmptyLineTrackera{  Provides a stateful method that returns the number of potential extra
    empty lines needed before and after the currently processed line.

    Note: this tracker works on lines that haven't been split yet.  It assumes
    the prefix of the first leaf consists of optional newlines.  Those newlines
    are consumed by `maybe_empty_lines()` and included in the computation.
    r(   Nprevious_liner   r*   previous_defssemantic_leading_commentcurrent_liner5   c                 C   s  |j dkot|jod|jd jv }| |\}}| jr | jjnd}td|| }tj	| j
v r7| |r6d}n| jrV| jjdu rVt| jjjdkrV| jjjrV|jsV|jsVd}t| j
| j||||d}|jr| jdu s{| jjs~| jjrt|r~| jdu s{|r~|| _n|jr|rd| _|| _|| _|S )zReturn the number of extra empty lines before and after the `current_line`.

        This is for separating `def`, `async def` and `class` with extra empty
        lines (two on module-level).
        r   z
rP   N)r(   r   r   r   r   r   )r)   r;   r,   r@   _maybe_empty_linesr   r   maxr   fix_module_docstring_detectionr(   _line_is_module_docstringrQ   r   r   rY   rm   r   rM   r   rT   r   )rG   r   r   r   r   previous_afterblockrI   rI   rJ   maybe_empty_lines$  sh   





z"EmptyLineTracker.maybe_empty_linesc                 C   sZ   | j }|sdS t|jjdks|jjr|js|jrdS |j  }r+|jjs&dS |j  }s dS )NFrP   T)r   rQ   r   r,   r   rY   rm   rM   )rG   r   r   rI   rI   rJ   r   [  s"   

z*EmptyLineTracker._line_is_module_docstringc                 C   s  d}|j dkr| jjrdnd}|jr&|jd }|jd}t||}d|_nd}t|}|j }d }| jrL| jd j |krL| j	 }| jrL| jd j |ks<|j
sR|jrX| j| | jd u r_dS |jrr| jjrhdS | jjrr| jj
rrdS |d ur| jd us}J | jjr|jr|jsd}n8|r|j
s| jj
r|rdnd}n(|rd}n#d}n |rd}n|s|j r|jd jtjkr|jd jd	vrd}nd}|js|j
s|jr| |||S | jjr| jj dkr|j dkr|jstj| jv rd
S | jjr
|js
|jtds
|| jj kr
|pddfS |dfS )NrP   r   rr   r   r   r   r   r   r   rP   )withtryforwhileifmatch)rP   r   r   )r)   r(   is_pyir,   r@   r|   minr;   r   r   rm   rY   rF   r   r   r   rg   r8   r"   r>   r<   rT   #_maybe_empty_lines_for_class_or_defr   r   always_one_newline_after_importr   )rG   r   max_allowedrk   r   user_had_newliner)   previous_defrI   rI   rJ   r   k  s   









z#EmptyLineTracker._maybe_empty_linesr   r  c                 C   s  | j d usJ | j jr| jjr|jrdS dS | j j|jk r5| j js%| j jr5| jjr+dS |r1ddfS ddfS d }| j jrf| j j|jkrf|dkrf| j	}|d urd|j
d urd|j
jjsd|j
jjsd|jdkrd|}ndS | jjr|jsq| j jr| j j|jk r{d}nI| j j|jkrd}n?|jr| j jrd}n5d}n2| j j|jkrd}n(|js|jr| j js|jrtd|}nd}nd}n|jrdnd}| j jr|sd}|d ur|j
}|d urt|j||j |_d}|dfS )Nr  r  rP   r   rr   )r   rT   r(   r  rg   r)   rY   rm   rM   r   r   r   r   r   r  rp   r   r   )rG   r   r   r  comment_to_add_newlinesslcnewlinesr   rI   rI   rJ   r    s   z4EmptyLineTracker._maybe_empty_lines_for_class_or_def)r   r   r   r   r   r   r   r   r&   r   r   r   r   r   r   r  r;   r   r   r   r   r  rI   rI   rI   rJ   r     s&   
 7]
r   sequencer5   c                 c   s2    t | d }t| D ]}||fV  |d8 }qdS )z;Like `reversed(enumerate(sequence))` if that were possible.rP   N)rQ   r   )r  r   elementrI   rI   rJ   r     s   

r   Fnew_lineold_liner,   r3   c                 C   sR   |D ]$}t |j|j}t|| | j||d ||D ]	}| j|dd qqdS )a  
    Append leaves (taken from @old_line) to @new_line, making sure to fix the
    underlying Node structure where appropriate.

    All of the leaves in @leaves are duplicated. The duplicates are then
    appended to @new_line and used to replace their originals in the underlying
    Node structure. Any comments attached to the old leaves are reattached to
    the new leaves.

    Pre-conditions:
        set(@leaves) is a subset of set(@old_line.leaves).
    rK   TN)r#   r8   r<   r   rF   r   )r  r  r,   r3   old_leafnew_leafcomment_leafrI   rI   rJ   append_leaves!  s   
r  r   )line_strliner(   r  c                C   sV  |st | }tj|vrt||jkod|vo|   S |  r!dS d|vr,t||jkS |d^}}}t||jksCt||jkrEdS g }d}g }tj}	t	| j
D ]\}
}|	tjkrd}|jd t|krm|d n|jd t|k rz| }|dur|dur|j|jd kr|j}	|dkr dS |j|	kr|jtjkrdg}||7 }| js|jdkr|
t| j
d ks|j|vr||j  d7  < |	tjkrt|	|j}	t|r|jr|jjtjks|jjr|jjjtjkr dS t|dkr dS |}|}t||v r|| |jdu rn
|j}t||v sqSt|dkr"dS tdd |D S )	a  For non-multiline strings, return True if `line` is no longer than `line_length`.
    For multiline strings, looks at the context around `line` to determine
    if it should be inlined or split up.
    Uses the provided `line_str` rendering, if any, otherwise computes a new one.
    r   FNrP   r   Tc                 s   s    | ]}|d kV  qdS r   rI   )ra   valrI   rI   rJ   r     r   z'is_line_short_enough.<locals>.<genexpr>)line_to_stringr   multiline_string_handlingr!   line_lengthr   splitmathinfr   r,   bracket_depthrQ   rF   r   r8   r"   r   r/   r   r  r   r   r   testdictsetmakerr   all)r  r(   r  r   rb   lastcommasmultiline_stringmultiline_string_contextsmax_level_to_updateir2   	had_commaignore_ctxsctxrI   rI   rJ   is_line_short_enough9  s   




r4  c                 C   s   | j }t|dk rdS |d jtjkrr|d jtjkrrd}d}|d }|ddd D ]G}|jtv r>|jtvr9 dS |d7 }n(|jtjkrI|d7 }n|jtjkr^|jtjks]|jtv s] dS n|jtvrf dS |dkrq|dkrq dS q*dS )	zReturn False if the line cannot be split *for sure*.

    This is not an exhaustive search but a cheap heuristic that we can use to
    avoid some unfortunate formattings (mostly around wrapping unsplittable code
    in unnecessary parentheses).
    rr   Fr   rP   r   r6   NT)	r,   rQ   r8   r"   rw   r_   r   r   rX   )r  r,   
call_count	dot_countr   r2   rI   rI   rJ   can_be_split  s0    




r7  rhsr#  c                 C   s  | j }d}t|jD ]'}|r||ju rd}|jtkr|s dS |s1|jtv r1|j|jv r1|jr1|}q
|j}|j	s:dS |
 }||}|dkrIdS |dkrW|tkrW| jjrWdS |tkr]dS t|jdkshJ d|jd }|jd }	|jtv r|	jtvrt|||drdS |jd	 }
|jd
 }|jtjks|jtjks|jtjkr|jr|jjtjkr|
jtv rdS t|rdS t|||drdS dS )a  Does `rhs.body` have a shape safe to reformat without optional parens around it?

    Returns True for only a subset of potentially nice looking formattings but
    the point is to not return false positives that end up producing lines that
    are too long.
    NFTrP   rr   zStranded delimiterr   )r   r#  r6   r   )r+  r#  )r   r   r,   r   r8   r   r   r<   r.   
delimitersmax_delimiter_prioritydelimiter_count_with_priorityr   r   r   r   rQ   r   _can_omit_opening_parenr"   rv   r   r   r   r   r   r   _can_omit_closing_paren)r8  r#  r  r   r2   btmax_prioritydelimiter_countr   secondpenultimater+  rI   rI   rJ   can_omit_invisible_parens  sl   










rC  r   c                C   s   d}d| j  }d}|  D ]%\}}}|jtv r|j|u rd}|r2||7 }||kr+ dS |jtv r2d}qt| j|d kr>dS dS ) See `can_omit_invisible_parens`.Frq   r   TrP   )r)   r   r8   r   r   r   rQ   r,   )r  r   r#  	remainderr   _indexr2   leaf_lengthrI   rI   rJ   r<    s"   

r<  r+  c                C   sZ   d| j  }d}|  D ]\}}}||7 }||ju r#|s||kr" dS q|jtv r*d}qdS )rD  rq   FT)r)   r   r   r8   r   )r  r+  r#  r   seen_other_bracketsrF  r2   rG  rI   rI   rJ   r=  8  s   


r=  c                 C   s   t | dS )zmReturns the string representation of @line.

    WARNING: This is known to be computationally expensive.
    r   )r   r=   )r  rI   rI   rJ   r!  I  s   r!  r   )Cr   r%  collections.abcr   r   r   dataclassesr   r   typingr   r   r	   r
   black.bracketsr   r   r   
black.moder   r   black.nodesr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    black.stringsr!   blib2to3.pgen2r"   blib2to3.pytreer#   r$   r%   r   r   r   LNr&   r   r   r   r   r   r   r;   r  r   r4  r7  rC  r<  r=  r!  rI   rI   rI   rJ   <module>   s|    L   N
  "	

a$
a