o
    ^i)                    @   sn  d Z ddlZddlZddlmZ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mZmZ ddlmZmZmZmZmZ dd	lmZmZmZmZ dd
lmZmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZKmLZLmMZMmNZN ddlOmPZP ddlQmRZRmSZSmTZTmUZUmVZV ddlWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^ ddl_m`Z` ddlambZbmcZc edZeeebecf ZfG dd deXZgG dd de1e Zhdedee& de'deei fddZj	dldede'dee& dee fddZkdede'delfdd ZmG d!d" d"e	Znded#ee& de'dee fd$d%Zo		dmdede'dee& d&eee dee f
d'd(Zp	dlded&eee defd)d*Zq		dmd+edede'dee& d&eee dee fd,d-Zrd.ed+ede'delfd/d0Zsd1ed2ed3eddfd4d5Ztd6eueb d7ed8ebdelfd9d:Zvd6eueb d7ed8ebd;endef
d<d=Zwd>e]de]fd?d@Zxdedeed fdAdBZydCebdee& delfdDdEZzdFeldGeddedefdHdIZ{eehZ|exdedee& de'dee fdJdKZ}exdedee& de'dee fdLdMZ~dNecdOeei de'dee& ddf
dPdQZdRecdSefdTedddfdUdVZdNecde'dee& ddfdWdXZdNecde'dee& ddfdYdZZdNecdRecde'dee& ddf
d[d\Z	]dndNefdRefde'dee& d^eldelfd_d`Zded8ebdelfdadbZdedceddeeee  fdddeZdfdgdedhe]de'dee& dieideue fdjdkZdS )oz
Generating lines of code.
    N)
CollectionIterator)replace)Enumauto)partialwraps)OptionalUnioncast)COMMA_PRIORITYDOT_PRIORITYSTRING_PRIORITY#get_leaves_inside_matching_bracketsmax_delimiter_priority_in_atom)FMT_OFFFMT_ONgenerate_commentslist_comments)Line	RHSResultappend_leavescan_be_splitcan_omit_invisible_parensis_line_short_enoughline_to_string)FeatureModePreview)%ASSIGNMENTSBRACKETSCLOSING_BRACKETSOPENING_BRACKETSSTANDALONE_COMMENT	STATEMENT
WHITESPACEVisitorensure_visiblefstring_tstring_to_stringget_annotation_typehas_sibling_with_typeis_arith_likeis_async_stmt_or_funcdefis_atom_with_invisible_parensis_docstringis_empty_tupleis_generatoris_lpar_tokenis_multiline_stringis_name_tokenis_one_sequence_betweenis_one_tupleis_parent_function_or_classis_part_of_annotationis_rpar_tokenis_stub_bodyis_stub_suiteis_tupleis_tuple_containing_staris_tuple_containing_walrusis_type_ignore_comment_string	is_varargis_walrus_assignmentis_yieldsymswrap_in_parentheses)normalize_numeric_literal)fix_multiline_docstringget_string_prefixnormalize_string_prefixnormalize_string_quotes"normalize_unicode_escape_sequences)CannotTransformStringMergerStringParenStripperStringParenWrapperStringSplitterTransformerhug_power_op)token)LeafNodec                   @   s   e Zd ZdZdS )CannotSplitzBA readable split that fits the allotted line length is impossible.N)__name__
__module____qualname____doc__ rY   rY   R/var/www/html/stock_analysis/be/venv/lib/python3.10/site-packages/black/linegen.pyrT   _   s    rT   c                	       s  e Zd ZdZdedee ddfddZdJd	ede	e
 fd
dZdede	e
 f fddZdede	e
 fddZdede	e
 fddZdede	e
 fddZdedee dee de	e
 fddZdede	e
 fddZdede	e
 fddZdede	e
 fddZdede	e
 fdd Zdede	e
 fd!d"Zdede	e
 fd#d$Zdede	e
 fd%d&Zdede	e
 fd'd(Zdede	e
 fd)d*Zdede	e
 fd+d,Zdede	e
 fd-d.Z d/ede	e
 fd0d1Z!d/ede	e
 fd2d3Z"d/ede	e
 fd4d5Z#dede	e
 fd6d7Z$dede	e
 fd8d9Z%d/ede	e
 fd:d;Z&d/ede	e
 fd<d=Z'dede	e
 fd>d?Z(dede	e
 fd@dAZ)dede	e
 fdBdCZ*dede	e
 fdDdEZ+dede	e
 fdFdGZ,dKdHdIZ-  Z.S )LLineGeneratorzGenerates reformatted Line objects.  Empty lines are not emitted.

    Note: destroys the tree it's visiting by mutating prefixes of its leaves
    in ways that will no longer stringify to valid Python code on the tree.
    modefeaturesreturnNc                 C   s   || _ || _|  |   d S N)r\   r]   __post_init__)selfr\   r]   rY   rY   rZ   __init__l   s   zLineGenerator.__init__r   indentc                 c   sf    | j s| j  j|7  _dS t| j jdkr t| j jd r dS | j }t| j|j| d| _ |V  dS )zGenerate a line.

        If the line is empty, only emit if it makes sense.
        If the line is too long, split it first and then generate.

        If any lines were generated, set up a new current_line.
        N   r   r\   depth)current_linerf   lenleavesr,   r   r\   )ra   rc   complete_linerY   rY   rZ   liner   s   

zLineGenerator.linenodec                 #   s    t |trW| jj }t|| jdD ]3}|r| j| q|jt	j
kr2| j| |  E dH  q|  E dH  | j| |  E dH  q|rLd|_|jtvrW| j| t |E dH  dS )zCDefault `visit_*()` implementation. Recurses to children of `node`.r\   N )
isinstancerR   rg   bracket_trackerany_open_bracketsr   r\   appendtyperQ   COMMENTrk   prefixr%   supervisit_default)ra   rl   rq   comment	__class__rY   rZ   rw      s"   

zLineGenerator.visit_defaultc                 c   sn    |j o
|j jtjk}|s-ttjd}ttjd}|j}d|_||_|d| || | 	|E dH  dS )zVisit an `x if y else z` testrn   r   N)
prev_siblingrs   rQ   LPARrR   RPARru   insert_childappend_childrw   )ra   rl   already_parenthesizedlparrparru   rY   rY   rZ   
visit_test   s   
zLineGenerator.visit_testc                 c   s&    |  dE dH  | |E dH  dS )z/Increase indentation level, maybe yield a line.rd   Nrk   rw   ra   rl   rY   rY   rZ   visit_INDENT   s   zLineGenerator.visit_INDENTc                 c   s4    |   E dH  | |E dH  |  dE dH  dS )z/Decrease indentation level, maybe yield a line.Nr   r   rY   rY   rZ   visit_DEDENT   s   zLineGenerator.visit_DEDENTkeywordsparensc                 c   sV    t ||| j| jd |jD ]}t|r |j|v r |  E dH  | |E dH  qdS )a  Visit a statement.

        This implementation is shared for `if`, `while`, `for`, `try`, `except`,
        `def`, `with`, `class`, `assert`, and assignments.

        The relevant Python language `keywords` for a given statement will be
        NAME leaves within it. This methods puts those on a separate line.

        `parens` holds a set of string leaf values immediately after which
        invisible parens should be put.
        parens_afterr\   r]   N)normalize_invisible_parensr\   r]   childrenr3   valuerk   visit)ra   rl   r   r   childrY   rY   rZ   
visit_stmt   s   
zLineGenerator.visit_stmtc                 c   "    |  |E d H  d|jd _d S Nrn   r   rw   r   ru   r   rY   rY   rZ   visit_typeparams      zLineGenerator.visit_typeparamsc                 c   r   Nrn   rd   r   r   rY   rY   rZ   visit_typevartuple   r   z LineGenerator.visit_typevartuplec                 c   r   r   r   r   rY   rY   rZ   visit_paramspec   r   zLineGenerator.visit_paramspecc                 c   s    t j| jv rFt|jD ]9\}}|dkrq|j|d  jtjkrE|jtj	kr>|jd jt
v r>t|s>t||| j| jdd qt||dd q| |E d H  d S )Nr   rd   Fparentr\   r]   remove_brackets_around_commavisible)r   wrap_long_dict_values_in_parensr\   	enumerater   rs   rQ   COLONrB   atomr"   r@   #maybe_make_parens_invisible_in_atomr]   rC   rw   )ra   rl   ir   rY   rY   rZ   visit_dictsetmaker   s,   
z LineGenerator.visit_dictsetmakerc                 c   s    |   E dH  d}|jD ]8}|jtjkrd}q|rE|jtjkr<|jd jtjkr<t||| j	| j
ddr;t||dd nt||dd d}q|jD ]
}| |E dH  qIdS )zVisit function definition.NFTr   r   r   )rk   r   rs   rQ   RARROWrB   r   r|   r   r\   r]   rC   r   )ra   rl   is_return_annotationr   rY   rY   rZ   visit_funcdef  s.   

zLineGenerator.visit_funcdefc                 c   sF    t |t | j| jd |  E dH  |jD ]
}| |E dH  qdS )z'Visit either a match or case statement.r   N)r   setr\   r]   rk   r   r   ra   rl   r   rY   rY   rZ   visit_match_case  s   
zLineGenerator.visit_match_casec                 c   s8    t |r| |jd E dH  dS | |E dH  dS )zVisit a suite.   N)r:   r   r   rw   r   rY   rY   rZ   visit_suite)  s   zLineGenerator.visit_suitec                 c   s    d}|j D ]}|du s|tjkrt|rt||dd |j}q|jrU|jjtv rUt|r;t	|r;| 
|E dH  dS | dE dH  | 
|E dH  | dE dH  dS |jrjt|jrjd|_| 
|E dH  dS |  E dH  | 
|E dH  dS )z,Visit a statement without nested statements.NFr   rd   r   rn   )r   rQ   SEMIr+   rC   rs   r   r$   r6   r9   rw   rk   r:   ru   )ra   rl   	prev_typer   rY   rY   rZ   visit_simple_stmt0  s$   
zLineGenerator.visit_simple_stmtc                 c   sj    |   E dH  t|j}|D ]}| |E dH  |jtjks$|jtkr& nqt|}| |E dH  dS )z-Visit `async def`, `async for`, `async with`.N)	rk   iterr   r   rs   rQ   ASYNCr#   next)ra   rl   r   r   internal_stmtrY   rY   rZ   visit_async_stmtH  s   
zLineGenerator.visit_async_stmtc                 c   s0    |j D ]}|  E dH  | |E dH  qdS )zVisit decorators.N)r   rk   r   r   rY   rY   rZ   visit_decoratorsX  s
   
zLineGenerator.visit_decoratorsc                 c   s    t |jd d D ]9\}}|j|d  }t|tsq
|j }|jtjkrC|jt	j
krC|jd jtjkrC|dsCd|vrCt|| q
t|| j| jd | |E d H  d S )Nr   rd   r   )0x0b0ojr\   r]   )r   r   ro   rR   r   lowerrs   rQ   NUMBERrB   trailerDOT
startswithrC   remove_await_parensr\   r]   rw   )ra   rl   idxleaf	next_leafr   rY   rY   rZ   visit_power^  s(   





zLineGenerator.visit_powerr   c                 c   s    |   E dH  dS )zBRemove a semicolon and put the other statement on a separate line.N)rk   ra   r   rY   rY   rZ   
visit_SEMIv  s   zLineGenerator.visit_SEMIc                 c   s$    |  |E dH  |  E dH  dS )zAEnd of file. Process outstanding comments and end with a newline.N)rw   rk   r   rY   rY   rZ   visit_ENDMARKERz  s   zLineGenerator.visit_ENDMARKERc           	      c   s    | j j s|  E d H  |j}| }t|dkr4|d  }|tv }|d  }|t	v }|o2|}nd}|rG| j 
| |  E d H  d S | |E d H  d S )Nr   r   r   F)rg   rp   rq   rk   r   
splitlinesrh   lstripr   r   rr   rw   )	ra   r   r   lines
first_linefirst_is_fmt_off	last_linelast_is_fmt_onis_fmt_off_blockrY   rY   rZ   visit_STANDALONE_COMMENT  s    
z&LineGenerator.visit_STANDALONE_COMMENTc                 c   s    |j \}}|jtjkr;t|j dkr;|j d jtjkr;ttjd}ttj	d}|
 p-d}||ttj|||g | |E dH  dS )z_Force parentheses between a unary op and a binary power:

        -2 ** 8 -> -(2 ** 8)
           rd   ()r   N)r   rs   rB   powerrh   rQ   
DOUBLESTARrR   r|   r}   remover~   rS   r   rw   )ra   rl   	_operatoroperandr   r   indexrY   rY   rZ   visit_factor  s   

zLineGenerator.visit_factorc                 c   sV    t |jdks
J t|jd || j| jdr!t||jd dd | |E dH  dS )a)  
        Add potential parentheses around types in function parameter lists to be made
        into real parentheses in case the type hint is too long to fit on a line
        Examples:
        def foo(a: int, b: float = 7): ...

        ->

        def foo(a: (int), b: (float) = 7): ...
        r   r   r   r\   r]   Fr   N)rh   r   r   r\   r]   rC   rw   r   rY   rY   rZ   visit_tname  s   zLineGenerator.visit_tnamec                 c   s.   t | t|rtd|js| jjrt|j}t|}n|j}t	|}|t
|d  }|d }|d |kr9dnd}|||  }| }d| jj }t|rUt||}n| }d}|r|d |krgd| }|d |krq|d7 }|d d	krt
|t
|d	 }	|	d
 r|d7 }d}n|sd}|| }
|dkr| }|rt
|d nd}t
|dkr|| | jjkrt
|| | jjkr|s|jd|  dkr||
 | |
 |_n!||
 | d | |
 |_n||
 | |
 |_n	||
 | |
 |_| jjr|jtjkrt|j|_t|j|_| |E d H  d S )Nz\\\s*\nr   rd   r   z    F r   \r   T
)rI   r.   researchr   r\   string_normalizationrG   rH   rF   rh   rg   rf   r2   rE   striprstripr   line_lengthrs   rQ   STRINGrw   )ra   r   	docstringru   
quote_char	quote_lendocstring_started_emptyrc   has_trailing_backslashbackslash_countquoter   last_line_lengthrY   rY   rZ   visit_STRING  sh   


zLineGenerator.visit_STRINGc                 c   s    t | | |E d H  d S r_   )rD   rw   r   rY   rY   rZ   visit_NUMBER  s   zLineGenerator.visit_NUMBERc                 c   s    t |jdkr7|jd }|jd }|jtjkr|jtjks*|jtjkr7|jtjkr7t|jd || j	| j
d | |E dH  dS )zVisit any atomr   r   r   rd   r   N)rh   r   rs   rQ   LSQBRSQBLBRACERBRACEr   r\   r]   rw   )ra   rl   firstlastrY   rY   rZ   
visit_atom  s    



zLineGenerator.visit_atomc                 c   Z    t |}|| d|jv r#tdd |jD r#| |E d H  d S | |E d H  d S )Nr   c                 s   (    | ]}|j tjkrd t|v V  qdS r   Nrs   rB   fstring_replacement_fieldstr.0r   rY   rY   rZ   	<genexpr>5      


z.LineGenerator.visit_fstring.<locals>.<genexpr>r(   r   r   anyr   rw   r   ra   rl   string_leafrY   rY   rZ   visit_fstring1     
zLineGenerator.visit_fstringc                 c   r   )Nr   c                 s   r   r   r   r   rY   rY   rZ   r  D  r  z.LineGenerator.visit_tstring.<locals>.<genexpr>r  r  rY   rY   rZ   visit_tstring@  r	  zLineGenerator.visit_tstringc                 c   s8    t j| jv rt|dh| j| jd | |E d H  d S )Ninr   )r   wrap_comprehension_inr\   r   r]   rw   r   rY   rY   rZ   visit_comp_forp  s   zLineGenerator.visit_comp_forc                 c   s    |  |E d H  d S r_   )r  r   rY   rY   rZ   visit_old_comp_forw  s   z LineGenerator.visit_old_comp_forc                 C   sB  t | jd| _| j}t }t|dhddhd| _t|h dddhd| _t|dd	hdhd| _t|d
d	hd
dhd| _	t|h d|d| _
t|dhdhd| _t|dhdhd| _t|dh|d| _t||td| _t|dhdhd| _t||dhd| _t||dhd| _| j| _| j| _| j| _| j| _t||dhd| _dS )z,You are in a twisty little maze of passages.rm   assert,)r   r   >   ifelifelser  r  whiler  forr  >   tryr  exceptfinallyr  withclassr^   importdelN)r   r\   rg   r   r   r   visit_assert_stmtvisit_if_stmtvisit_while_stmtvisit_for_stmtvisit_try_stmtvisit_except_clausevisit_with_stmtvisit_classdefr   visit_expr_stmtvisit_return_stmtvisit_import_fromvisit_del_stmtr   visit_async_funcdefr   visit_decoratedr   visit_match_stmtvisit_case_blockvisit_guard)ra   v   ØrY   rY   rZ   r`   z  s0   
zLineGenerator.__post_init__)r   )r^   N)/rU   rV   rW   rX   r   r   r   rb   intr   r   rk   LNrw   rS   r   rR   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
  r  r  r`   __classcell__rY   rY   ry   rZ   r[   e   sR    

 X0r[   rk   r]   r\   r^   c                 C   s,   zt tt| ||W S  ty   Y d S w r_   )r   r   rP   rJ   )rk   r]   r\   rY   rY   rZ   !_hugging_power_ops_line_to_string  s
   r3  rY   c                 c   s   | j r	| V  dS t| }t| ||p|}|j}|j}t||}t||}t||}	t||}
| 	 s\| j
s\| js\t| ||dsD|  r\| jrK|  s\|  s\tj|v rY||g}nQg }nN| jrht| |shtg}nBdtdtdtt dtdtt f
dd	}td
dd|i }tj|v r| jr|||	tt|
|g}n|||	|
|g}n| jrtt|g}n|g}|t  |D ]}zt!| ||||d}W n	 t"y   Y qw |E dH   dS | V  dS )zTransform a `line`, potentially splitting it into many lines.

    They should fit in the allotted `line_length` but might not be able to.

    `features` are syntactical features that may be used in the output.
    N)r\   line_strra   rk   r]   r\   r^   c                 s   s`    t ||jD ]}tt||||d}t|d |dr#|E dH   dS qt|||dE dH  dS )zWraps calls to `right_hand_split`.

            The calls increasingly `omit` right-hand trailers (bracket pairs with
            content), meaning the trailers get glued together to split on another
            bracket pair instead.
            omitr   rm   N)r]   )generate_trailers_to_omitr   listright_hand_splitr   )ra   rk   r]   r\   r6  r   rY   rY   rZ   _rhs  s   	
ztransform_line.<locals>._rhsrhsrY   __call__r4  )#
is_commentr   r3  r   r   rK   rL   rN   rM   $contains_uncollapsable_type_commentsshould_split_rhsmagic_trailing_commar   !contains_unsplittable_type_ignoreinside_bracketscontains_standalone_comments0contains_implicit_multiline_string_with_commentsr   string_processingis_defshould_split_funcdef_with_rhsleft_hand_splitobjectr   r   r   r   r   rs   delimiter_splitstandalone_comment_splitrr   rP   run_transformerrJ   )rk   r\   r]   r4  line_str_hugging_power_opsllsnstring_mergestring_paren_stripstring_splitstring_paren_wraptransformersr:  r;  	transformresultrY   rY   rZ   transform_line  s   	



	






rX  c                 C   s   g }d}| j D ]}|jtjkrd}|r|| |jtjkr d}qt| j| jd}t	|}|D ]}|j|dt
||v d q/|jduS )zIf a funcdef has a magic trailing comma in the return type, then we should first
    split the line with rhs to respect the comma.
    FTre   preformattedtrack_bracketN)ri   rs   rQ   r   rr   r   r   r\   rf   r   idrA  )rk   r\   return_type_leavesin_return_typer   rW  leaves_to_trackrY   rY   rZ   rH  !  s&   



rH  c                   @   s   e Zd Ze Ze Ze ZdS )_BracketSplitComponentN)rU   rV   rW   r   headbodytailrY   rY   rY   rZ   r`  @  s    
r`  	_featuresc                 c   s   t jt jfD ]}g }g }g }|}d}d}	t| jD ]v\}
}|
dkr-|jt jkr-|	d7 }	n|	dkrF|jt jkr<|	d7 }	n
|jt jkrF|	d8 }	||u rp|jtv rp|j|u rpt	|t
rp|t jkrb|	dkspt| t| |rn|n|}|| ||u r|j|krtj|vs|t jkr|	dks|}|}q|r|r nq|r|stdt|| |tjd}t|| |tjd}t|| |tjd}t||| |||fD ]}|r|V  qdS )a/  Split line into many lines, starting with the first matching bracket pair.

    Note: this usually looks weird, only use this for function definitions.
    Prefer RHS otherwise.  This is why this function is not symmetrical with
    :func:`right_hand_split` which also handles optional parentheses.
    Nr   r   rd   No brackets found	component)rQ   r|   r   r   ri   rs   r   r!   opening_bracketro   rR   r'   rr   r   fix_type_expansion_splitrT   bracket_split_build_liner`  ra  rb  rc   bracket_split_succeeded_or_raise)rk   rd  r\   	leaf_typetail_leavesbody_leaveshead_leavescurrent_leavesmatching_bracketrf   r   r   ra  rb  rc  rW  rY   rY   rZ   rI  F  s~   	







rI  r6  c                 c   s*    t | |d}t|| |||dE dH  dS )aX  Split line into many lines, starting with the last matching bracket pair.

    If the split was by optional parentheses, attempt splitting without them, too.
    `omit` is a collection of closing bracket IDs that shouldn't be considered for
    this split.

    Note: running this function modifies `bracket_depth` on the leaves of `line`.
    r5  r]   r6  N)_first_right_hand_split%_maybe_split_omitting_optional_parens)rk   r\   r]   r6  
rhs_resultrY   rY   rZ   r9    s
   
r9  c                 C   s  g }g }g }|}d}d}t | jD ]+}||u r!||u r!|r|n|}|| ||u r<|jtv r<t||vr<|j}|}|}q|rC|rC|sGtd|  |  |  d}	t	j
| jv r!|d jr!|d j|d u r!t|}
g }g }|d jtjtjfv }|rdnd}t|
d| kr|
d jtv r|
d j|
| u r|r||
d d}||
d |d|
  t|
d| kr|
d jtv r|
d j|
| u s|r!|
r!t|
| |d tjd}| jjr|
d jtjkrd}n | jjtd	d
 || D  }t|t| j|ddrd}nd}|r!|
}|| || }|}	t|| |tjd}|	du r8t|| |tjd}	t|| |tjd}t ||	| t!||	|||S )a#  Split the line into head, body, tail starting with the last bracket pair.

    Note: this function should not have side effects. It's relied upon by
    _maybe_split_omitting_optional_parens to get an opinion whether to prefer
    splitting on the right side of an assignment statement.
    Nre  r   r   rd   r   rf  Tc                 s   s    | ]	}t t|V  qd S r_   )rh   r   r  r   rY   rY   rZ   r    s
    

z*_first_right_hand_split.<locals>.<genexpr>r   rm   F)"reversedri   rr   rs   r!   r\  rh  rT   reverser   *hug_parens_with_braces_and_square_bracketsr\   r   r8  rQ   STARr   rh   popinsertrj  r`  rb  rA  COMMAr   sumr   r   extendra  rc  rk  r   )rk   r6  rm  rn  ro  rp  rh  closing_bracketr   rb  inner_body_leaveshugged_opening_leaveshugged_closing_leavesis_unpackingunpacking_offset
inner_body
should_hugr   ra  rc  rY   rY   rZ   rs    s   








rs  r;  c              
   c   sd   t j|vr| jjtjkr| jjs| jjtjkr| jjs|j	st
| |jrt| jh|}zt||d}t|| |rIt|||||dE d H  W d S W nK ty } z?|jrVn5t| js|t| j|ds|tjrw| jjrw| jjjrw| jjjjtjks|td|| j s| j rtd|W Y d }~nd }~ww t| j t| j | j| j| jfD ]}|r|V  qd S )Nr5  rr  rm   z<Splitting failed, body is still too long and can't be split.zThe current optional pair of parentheses is bound to fail to satisfy the splitting algorithm because the head or the tail contains multiline strings which by definition never fit one line.)r   FORCE_OPTIONAL_PARENTHESESrh  rs   rQ   r|   r   r  r}   	is_importr   r   r\  rs  _prefer_split_rhs_oop_over_rhsrt  rT   is_chained_assignmentr   rb  r   r   r   r   rB   dictsetmakerra  contains_multiline_stringsrc  r'   )r;  rk   r\   r]   r6  rhs_ooperW  rY   rY   rZ   rt    s|   





rt  r  c                 C   s  | j  s| j s| j rdS tjr6|jjr6|jjjr6|jjjjt	j
kr6|jjjr6tdd | jjD S t|j jdkrH|j jd jtjksJdS tdd |j jdd D s[dS t|j t||jd	 d
dskdS |j jdursdS dd |j jD tj}dd | j jD tj}|d	kr||krdS d}t| j jD ]}|jtjkr n
|jtv rd} nq|ptdd | j jD ot| j |dS )z
    Returns whether we should prefer the result from a split omitting optional parens
    (rhs_oop) over the original (rhs).
    Tc                 s       | ]	}|j tjkV  qd S r_   )rs   rQ   r   rv  rY   rY   rZ   r  `      z1_prefer_split_rhs_oop_over_rhs.<locals>.<genexpr>r   c                 s   s    | ]}|j tv V  qd S r_   )rs   r    rv  rY   rY   rZ   r  g      Nr   rd   rw  rm   c                 S      g | ]}|j qS rY   rs   rv  rY   rY   rZ   
<listcomp>w      z2_prefer_split_rhs_oop_over_rhs.<locals>.<listcomp>c                 S   r  rY   r  rv  rY   rY   rZ   r  x  r  Fc                 s   r  r_   )rs   rQ   EQUALrv  rY   rY   rZ   r    r  )ra  rB  rb  rc  r   r   rh  r   rs   rB   r  rp   
delimitersr  ri   rh   rQ   r  r   r   r   rA  countrx  r!   )r  r;  r\   rhs_head_equal_countrhs_oop_head_equal_count has_closing_bracket_after_assignr   rY   rY   rZ   r  H  s\   	$
r  ra  rb  rc  c                 C   sD   t t| }|s|dkrtd|dk r td| ddS dS )a  Raise :exc:`CannotSplit` if the last left- or right-hand split failed.

    Do nothing otherwise.

    A left- or right-hand split is based on a pair of brackets. Content before
    (and including) the opening bracket is left on one line, content inside the
    brackets is put on a separate line, and finally content starting with and
    following the closing bracket is put on a separate line.

    Those are called `head`, `body`, and `tail`, respectively. If the split
    produced the same line (all content in `head`) or ended up with an empty `body`
    and the `tail` is just the closing bracket, then it's considered failed.
    r   z)Splitting brackets produced the same liner   z,Splitting brackets on an empty body to save z characters is not worth itN)rh   r   r   rT   )ra  rb  rc  tail_lenrY   rY   rZ   rk    s   
rk  ri   originalrh  c                 C   s   | sdS |j r	dS |jsdS |jdkrdS tdd | D r dS tdd | D d }|d u r0dS t|dkr8dS |jrI|jjrI|jjjt	j
krIdS dS )NFTr   c                 s   s&    | ]}|j tjkot| V  qd S r_   )rs   rQ   r~  r7   rv  rY   rY   rZ   r    s    
z)_ensure_trailing_comma.<locals>.<genexpr>c                 s   s    | ]}|j r|V  qd S r_   r   rv  rY   rY   rZ   r    r  r^   )r  rG  r   r  r   r)   r   next_siblingrs   rQ   VBAR)ri   r  rh  leaf_with_parentrY   rY   rZ   _ensure_trailing_comma  s2   
r  rg  c          
      C   s  t |j|jd}|tju rHd|_| jd7  _t| ||rHtt| d ddD ] }| | j	t
kr1q'| | j	tjkrGttjd}| |d |  t }|tju rTt| }| D ]}|j|dt||v d ||D ]	}	|j|	dd qiqV|tju rt||rd|_|S )ai  Return a new line with given `leaves` and respective comments from `original`.

    If it's the head component, brackets will be tracked so trailing commas are
    respected.

    If it's the body component, the result line is one-indented inside brackets and as
    such has its first leaf's prefix normalized and a trailing comma added when
    expected.
    re   Trd   r   r  rY  rZ  )r   r\   rf   r`  rb  rC  r  rangerh   rs   r#   rQ   r~  rR   r}  r   ra  r   rr   r\  comments_aftershould_split_liner@  )
ri   r  rh  rg  rW  r   	new_commar_  r   comment_afterrY   rY   rZ   rj    s:   


rj  
split_funcc              
      s2   t  dtdtt dtdtt f fdd}|S )zNormalize prefix of the first leaf in every line returned by `split_func`.

    This is a decorator over relevant split functions.
    rk   r]   r\   r^   c                 3   s*     | ||D ]}d|j d _|V  qd S r   )ri   ru   )rk   r]   r\   
split_liner  rY   rZ   split_wrapper  s
   z0dont_increase_indentation.<locals>.split_wrapper)r   r   r   r   r   r   )r  r  rY   r  rZ   dont_increase_indentation  s   r  c                 C   s8   t t| jd ddD ]}| j| jtkr|  S qd S )Nrd   r   r   )r  rh   ri   rs   r#   )rk   leaf_idxrY   rY   rZ   _get_last_non_comment_leaf  s
   r  r   c                 C   s<   t | tjhdrtj|v S t | tjtjhdrtj|v S dS )N)withinT)r?   rB   typedargslistr   TRAILING_COMMA_IN_DEFarglistargumentTRAILING_COMMA_IN_CALL)r   r]   rY   rY   rZ   _can_add_trailing_comma  s
   

r  safedelimiter_priorityc                 C   sH   | r"|t kr"|jd jtjkr"|jd jtkr"ttjd}|| |S )Nr   r  )r   ri   rs   rQ   r~  r#   rR   rr   )r  r  rk   r  rY   rY   rZ   _safe_add_trailing_comma"  s   
r  c                 #   s   t jdkrtddjd }j}z|jt|hd}W n ty,   tddw |tkr<||dkr<tdt	j
jjd	tj}d
}dtdtt	 ffdd dtdtt	 f fdd}t}	tjD ]~\}
} |E dH  |
dko|jtj|
d  }||ks|tv r||E dH  t||j}|r|j|krt||}|jtkr|
|	krt|||jt|}||kr|
d t jk r|tvr|j|
d  E dH  V  t	j
jjd	qprt||V  dS dS )zSplit according to delimiters of the highest priority.

    If the appropriate Features are given, the split will add trailing commas
    also in function signatures and calls that contain `*` and `**`.
    r   z
Line emptyNr   excludezNo delimiters foundrd   z7Splitting a single attribute from its owner looks wrongr\   rf   rC  Tr   r^   c                 3   P    z
 j | dd W dS  ty'    V  tjjjd  |  Y dS w )EAppend `leaf` to current line or to new line if appending impossible.Tr  r  Nappend_safe
ValueErrorr   r\   rf   rC  rr   r   rg   rk   rY   rZ   append_to_lineP     z'delimiter_split.<locals>.append_to_linec                 3   s$     | D ]	} |E d H  qd S r_   )r  )r   r  )r  rk   rY   rZ   append_comments]  s   z(delimiter_split.<locals>.append_comments)rh   ri   rT   rp   max_delimiter_priorityr\  r  r   delimiter_count_with_priorityr   r\   rf   rC  sysmaxsizerR   r   r  r   r  getMIGRATE_COMMENT_DELIMITERSminbracket_depthr  rs   r#   r  )rk   r]   r\   	last_leafbtr  lowest_depthtrailing_comma_safer  last_non_comment_leafr  r   previous_priorityleaf_priorityrY   )r  rg   rk   rZ   rK  1  st   	




rK  c                 #   s      s	tdtjjjd dtdtt f fdd}jD ]}||E dH  	|D ]	}||E dH  q2q$ rD V  dS dS )z4Split standalone comments from the rest of the line.z*Line does not have any standalone commentsr  r   r^   c                 3   r  )r  Tr  )rf   rC  Nr  r  r  rY   rZ   r    r  z0standalone_comment_split.<locals>.append_to_lineN)
rD  rT   r   r\   rf   rC  rR   r   ri   r  )rk   r]   r\   r  r   r  rY   r  rZ   rL    s   

rL  rl   r   c          	      C   s  t | jd|dD ]
}|jtv r dS q| jtjkrt| || d}tt	| j
D ]=\}}t|tr@|jtjkr@t||||d t|trT|jtjkrTt|dh||d t|trh|jtjkrht|dh||d |dkryt|try|jtjkryd}|rR|jtjkr| jtjkrt|jtr|jjtjkr|jjd	krt|| ||dd
rt| |dd nt|tr| jtjkrt|| ||d n|jtjkrd|v rt|j
dkrt|j
d rt|j
d r|j
d jtjkst|| ||drt| |dd nZt|rt| |dd nM| jtj krt!| ||  dS |dkr)|jtj"kr)| jtj#kr)q(t|trF|j$durF|j$jtj%krF|jdkrF dS t&|sRt| |dd |jtj'k}t|toe|j|v pe|}q(dS )aE  Make existing optional parentheses invisible or create new ones.

    `parens_after` is a set of string leaf values immediately after which parens
    should be put.

    Standardizes on visible parentheses for single-element tuples, and keeps
    existing visible parentheses for other tuples and generator expressions.
    F)is_endmarkerr\   Nr   caser  r   Tr  r   r   r   r  r   r   rd   r   )(r   ru   r   r   rs   rB   	with_stmt_maybe_wrap_cms_in_parensr   r8  r   ro   rS   	annassignr   
case_blockguardtestlist_star_exprr   for_stmtr{   rR   rQ   NAMEr   rC   remove_with_parensrh   r1   r8   testr5   import_from_normalize_import_fromr{  except_clauser  r   r2   r~  )	rl   r   r\   r]   pc
check_lparr   r   comma_checkrY   rY   rZ   r     s   











r   r   r   r   c                 C   sj   t |rt| jd sJ d|_d| jd _d S |jtjkr3| |ttj	d | 
ttjd d S d S )Nr   rn   )r1   r8   r   r   rs   rQ   r{  r~   rR   r|   r   r}   )r   r   r   rY   rY   rZ   r  "  s   r  c                 C   s  | j d jtjkrt| j dkr| j d jtjkr| j d j d jtjkrt| j d | ||ddr;t	| | j d dd t
t| j d j d }t
t| j d j d }| j d j d }t|tr|jtjksw|j d jtjkswtdd	 |j D rt| t| d S d S d S d S d S d S d S )
Nr   rd   Tr   Fr   r   c                 s   s&    | ]}t |to|jtjkV  qd S r_   )ro   rR   rs   rQ   r   r   rY   rY   rZ   r  L  s
    
z&remove_await_parens.<locals>.<genexpr>)r   rs   rQ   AWAITrh   rB   r   r|   r   rC   r   rR   ro   rS   r   r  r'   )rl   r\   r]   rh  r  bracket_contentsrY   rY   rZ   r   0  s<    	

r   c           
      C   s   t j|vst| jdks| jd jtjkrdS d}tdt| jD ]}| j| jtj	kr0|} nq!|durft
tjd}t
tjd}| jd| }|D ]}|  qJttj|ttj||g}	| d|	 dS dS )zWhen enabled and safe, wrap the multiple context managers in invisible parens.

    It is only safe when `features` contain Feature.PARENTHESIZED_CONTEXT_MANAGERS.
    r   rd   Nrn   )r   PARENTHESIZED_CONTEXT_MANAGERSrh   r   rs   rB   r   r  rQ   r   rR   r|   r}   r   rS   testlist_gexpr~   )
rl   r\   r]   colon_indexr   r   r   context_managersr   	new_childrY   rY   rZ   r  U  s0   
r  c                 C   s   | j tjkr-t| |||ddrt|| dd t| jd tr+t| jd | ||d d
S d
S | j tj	krH| jD ]}t|trEt|| ||d q6d
S | j tj
krqtdd |  D sst| jd	 | ||ddrut| | jd	 dd d
S d
S d
S d
S )z6Recursively hide optional parens in `with` statements.Tr   Fr   rd   r   c                 s   r  r_   )rs   rQ   
COLONEQUALrv  rY   rY   rZ   r    s    
z%remove_with_parens.<locals>.<genexpr>r   N)rs   rB   r   r   rC   ro   r   rS   r  r  asexpr_testr  ri   )rl   r   r\   r]   r   rY   rY   rZ   r    s>   

r  Fr   c                 C   s  | j tjtjfvsst| sst| sst| r|j tjksst| r+|j tjkr+t	| t
jsst| r5|j tjkss|sgt| tkrgtj|v rstj|v rst| rs| jdurs| jj tjkrs| jdurgt| jrg| jjdksst| sst| sst| rudS t| r|j tjtjtjtjtjtj tjtj!tj"tj#tj$tj#fv rdS | j%d }| j%d }t&|rt'|r| j%d }t(|j)* |dsd|_d|_t+|||||d	 t,|r|-|j%d  |j%d j)* r|j%d j)|j%d j) |j%d _)|j%d j)* r|j%d j)|j) |_)dS d
S )a  If it's safe, make the parens in the atom `node` invisible, recursively.
    Additionally, remove repeated, adjacent invisible parens from the atom `node`
    as they are redundant.

    Returns whether the node should itself be wrapped in invisible parentheses.
    NasFr   r   rd   rm   rn   r   T).rs   rB   r   exprr/   r5   r;   r  r  r*   rQ   r~  rA   	expr_stmtr   r   r   !remove_parens_around_except_typesr   UNPARENTHESIZED_EXCEPT_TYPESr   r  r  r3   r   r=   r<   r0   r@   r  assert_stmtreturn_stmtfuncdefr  tnamer  del_stmtr   r1   r8   r>   ru   r   r   r-   r   )rl   r   r\   r]   r   r   r   middlerY   rY   rZ   r     s   






 
!%&')



r   c              	   C   s   |j r|jdv s
dS t }d}z| jd }|jtjkr$d}|t| | j	j
|d}W n ttfy8   Y dS w |tkoL| jjrC|pL|j jtjtjhv S )zFShould `line` be immediately split with `delimiter_split()` after RHS?z[{(Fr   Tr  )r   r   r   ri   rs   rQ   r~  addr\  rp   r  
IndexErrorr  r   r\   rA  rB   r   r  )rk   rh  r  trailing_commar  max_priorityrY   rY   rZ   r  !  s"   
r  r   c                 c   s   t  }| js
|V  d| j }d}d}t  }| jddD ]\}}}	||	7 }||kr, dS |	t|jt|j k}
|jtks?|
rB dS |r}||u rKd}q|jt	v r||dkr[| j
|d  nd}|ru|jtjkru|jdurut|j|| j
su dS |t| q|jt	v r|dkr| j
|d  nd}|r|jtv r|t| q|r|t| || |  |V  |r|jtjkr|jdurt|j|| j
s dS |jr|j}|}qdS )a  Generate sets of closing bracket IDs that should be omitted in a RHS.

    Brackets can be omitted if the entire trailer up to and including
    a preceding closing bracket fits in one line.

    Yielded sets are cumulative (contain results of previous yields, too).  First
    set is empty, unless the line should explode, in which case bracket pairs until
    the one that needs to explode are omitted.
       NT)is_reversedr   rd   )r   rA  rf   enumerate_with_lengthrh   r   ru   rs   r#   r!   ri   rQ   r~  rh  r4   r  r\  r"   updateclear)rk   r   r6  lengthrh  r  inner_bracketsr   r   leaf_lengthhas_inline_commentprevrY   rY   rZ   r7  <  sr   







r7  rn   r=  rV  r4  c                   s&  |st | }g }|| | D ]}t|d|krtd|t| |d qt|}tj|v sh|j	j
dksh| jjrhtdd | jjD sh|  sh|d  sh|d  sht|d  dshtd	d | jD rj|S |  }t|| | j |tjhB }	t|| |	|d
}
t fdd|
D r|
}|S )Nr   z-Line transformer returned an unchanged resultr   r;  c                 s   s    | ]}|j V  qd S r_   )r   )r  bracketrY   rY   rZ   r    s    z"run_transformer.<locals>.<genexpr>r   rm   c                 s   s    | ]}|j d u V  qd S r_   r  rv  rY   rY   rZ   r    r  r=  c                 3   s    | ]	}t | d V  qdS )rm   N)r   )r  lnrm   rY   rZ   r    r  )r   r   r   rJ   r  rX  r   r   r  rz   rU   rp   	invisibler  r  r?  rB  r   ri   cloner   rM  all)rk   rV  r\   r]   r4  rW  transformed_linefeatures_set	line_copyfeatures_fopsecond_opinionrY   rm   rZ   rM    sH   



rM  )rY   )rY   rY   )F)rX   r   r  collections.abcr   r   dataclassesr   enumr   r   	functoolsr   r   typingr	   r
   r   black.bracketsr   r   r   r   r   black.commentsr   r   r   r   black.linesr   r   r   r   r   r   r   
black.moder   r   r   black.nodesr   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   black.numericsrD   black.stringsrE   rF   rG   rH   rI   black.transrJ   rK   rL   rM   rN   rO   rP   blib2to3.pgen2rQ   blib2to3.pytreerR   rS   r0  LeafIDr1  rT   r[   r   r3  rX  boolrH  r`  rI  r9  rs  rt  r  rk  r8  r  rj  r  r  r  r  r  rK  rL  r   r   r  r   r  r  r   r  r7  rM  rY   rY   rY   rZ   <module>   s   $	'$	    9

|
F

k
D
K
$
1Y"
t%
*
5
rR