o
    h                     @   s  d Z ddlZddl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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 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.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZF ddlGmHZH ddlImJZJmKZKmLZLmMZMmNZN ddlOmPZPmQZQmRZRmSZSmTZTmUZUmVZV ddlWmXZX ddlYmZZZm[Z[ e\Z]eeZe[f Z^G dd dePZ_G dd de1e Z`dedee% de&deea fddZb	djdede&dee% dee fddZcdede&dedfddZeG d d! d!eZfded"ee% de&dee fd#d$Zg		dkdede&dee% d%ee] dee f
d&d'Zh	djded%ee] defd(d)Zi		dkd*edede&dee% d%ee] dee fd+d,Zjd-ede&dedfd.d/Zkd0ed1ed2eddfd3d4Zld5eeZ d6ed7eZd8efdef
d9d:Zmd;eUdeUfd<d=Zndedee\ fd>d?Zod@eddAe\dedefdBdCZpendedee% de&dee fdDdEZqendedee% de&dee fdFdGZrdHeZdIedddfdJdKZsdLe[dMeea de&dee% ddf
dNdOZtdPe[dQe^dRe\ddfdSdTZudLe[ddfdUdVZvdLe[de&dee% ddfdWdXZwdLe[dPe[ddfdYdZZx	[dldLe^dPe^d\eddedfd]d^Zyded7eZdedfd_d`Zzdedae\deee]  fdbdcZ{dddededfeUde&dee% dgeadee fdhdiZ|dS )mz
Generating lines of code.
    N)replace)Enumauto)partialwraps)
CollectionIteratorListOptionalSetUnioncast)COMMA_PRIORITYDOT_PRIORITY#get_leaves_inside_matching_bracketsmax_delimiter_priority_in_atom)FMT_OFF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RARROWSTANDALONE_COMMENT	STATEMENT
WHITESPACEVisitorensure_visibleis_arith_likeis_async_stmt_or_funcdefis_atom_with_invisible_parensis_docstringis_empty_tupleis_lpar_tokenis_multiline_stringis_name_tokenis_one_sequence_betweenis_one_tupleis_rpar_tokenis_stub_bodyis_stub_suiteis_tuple_containing_walrusis_type_ignore_comment_string	is_varargis_walrus_assignmentis_yieldsymswrap_in_parentheses)normalize_numeric_literal)fix_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__ rR   rR   C/var/www/html/ai/venv/lib/python3.10/site-packages/black/linegen.pyrM   V   s    rM   c                	       sH  e Zd ZdZdedee ddfddZd>d	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?d<d=Z'  Z(S )@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)rU   rV   __post_init__)selfrU   rV   rR   rR   rS   __init__c   s   zLineGenerator.__init__r   indentc                 c   sr    | j s| j  j|7  _dS tj| jv r&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   rU   depth)	current_liner_   r   "improved_async_statements_handlingrU   lenleavesr*   r   )rZ   r\   complete_linerR   rR   rS   linei   s   
zLineGenerator.linenodec                 #   s    t |tru| jj }t|D ]3}|r| j| q|jtj	kr/| j| | 
 E dH  q| 
 E dH  | j| | 
 E dH  qt||d | jjr`|jtjkr`t|j|_t|j|_|jtjkrjt| |jtvru| j| t |E dH  dS )zCDefault `visit_*()` implementation. Recurses to children of `node`.Ninside_brackets)
isinstancerK   r`   bracket_trackerany_open_bracketsr   appendtyperJ   COMMENTre   normalize_prefixrU   string_normalizationSTRINGr@   valuerA   NUMBERr=   r&   supervisit_default)rZ   rf   rk   comment	__class__rR   rS   ru      s*   

zLineGenerator.visit_defaultc                 c   sh    t j| jv r*|jo|jjtjk}|s*ttjd}ttjd}|	d| |
| | |E dH  dS )zVisit an `x if y else z` test r   N)r   $parenthesize_conditional_expressionsrU   prev_siblingrm   rJ   LPARrK   RPARinsert_childappend_childru   )rZ   rf   already_parenthesizedlparrparrR   rR   rS   
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.r]   Nre   ru   rZ   rf   rR   rR   rS   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   rR   rR   rS   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_afterrU   rV   N)normalize_invisible_parensrU   rV   childrenr0   rr   re   visit)rZ   rf   r   r   childrR   rR   rS   
visit_stmt   s   
zLineGenerator.visit_stmtc                 c   "    |  |E d H  d|jd _d S )Nry   r   ru   r   prefixr   rR   rR   rS   visit_typeparams      zLineGenerator.visit_typeparamsc                 c   r   Nry   r]   r   r   rR   rR   rS   visit_typevartuple   r   z LineGenerator.visit_typevartuplec                 c   r   r   r   r   rR   rR   rS   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j
kr>t||ddr=t||dd qt||dd q| |E d H  d S )Nr   r]   Fparentremove_brackets_around_commavisible)r   wrap_long_dict_values_in_parensrU   	enumerater   rm   rJ   COLONr;   atomr|   #maybe_make_parens_invisible_in_atomr<   ru   )rZ   rf   ir   rR   rR   rS   visit_dictsetmaker   s"   z LineGenerator.visit_dictsetmakerc                 c   s    |   E dH  d}|jD ]4}|jtjkrd}q|rA|jtjkr8|jd jtjkr8t||ddr7t	||dd nt	||dd d}q|jD ]
}| 
|E dH  qEdS )zVisit function definition.NFTr   r   r   )re   r   rm   rJ   r#   r;   r   r|   r   r<   r   )rZ   rf   is_return_annotationr   rR   rR   rS   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   setrU   rV   re   r   r   rZ   rf   r   rR   rR   rS   visit_match_case  s   
zLineGenerator.visit_match_casec                 c   sL    | j jstj| j v rt|r| |jd E dH  dS | |E dH  dS )zVisit a suite.   N)rU   is_pyir   dummy_implementationsr5   r   r   ru   r   rR   rR   rS   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o(|jjtv }|r]| jj	s5t
j| jv rCt|rC| |E dH  dS | dE dH  | |E dH  | dE dH  dS | jj	sgt
j| jv ro|jrot|jsv|  E dH  | |E dH  dS )z,Visit a statement without nested statements.NFr   r]   r   )r   rJ   SEMIr)   r<   rm   r   r%   rU   r   r   r   r4   ru   re   r5   )rZ   rf   	prev_typer   is_suite_likerR   rR   rS   visit_simple_stmt%  s4   
zLineGenerator.visit_simple_stmtc                 c   s    |   E dH  t|j}|D ]}| |E dH  |jtjks$|jtkr& nqt|}t	j
| jv r;| |E dH  dS |jD ]
}| |E dH  q>dS )z-Visit `async def`, `async for`, `async with`.N)re   iterr   r   rm   rJ   ASYNCr$   nextr   ra   rU   )rZ   rf   r   r   internal_stmtrR   rR   rS   visit_async_stmtA  s   

zLineGenerator.visit_async_stmtc                 c   s0    |j D ]}|  E dH  | |E dH  qdS )zVisit decorators.N)r   re   r   r   rR   rR   rS   visit_decoratorsU  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| | |E d H  d S )Nr   r]   r   )0x0b0oj)r   r   ri   rK   rr   lowerrm   rJ   rs   r;   trailerDOT
startswithr<   remove_await_parensru   )rZ   rf   idxleaf	next_leafrr   rR   rR   rS   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)re   rZ   r   rR   rR   rS   
visit_SEMIs  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)ru   re   r   rR   rR   rS   visit_ENDMARKERw  s   zLineGenerator.visit_ENDMARKERc                 c   s0    | j j s|  E d H  | |E d H  d S rX   )r`   rj   rk   re   ru   r   rR   rR   rS   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)
           r]   ()r   N)r   rm   r;   powerrb   rJ   
DOUBLESTARrK   r|   r}   remover~   rL   r   ru   )rZ   rf   	_operatoroperandr   r   indexrR   rR   rS   visit_factor  s   
zLineGenerator.visit_factorc                 c   sZ    t j| jv r#t|jdksJ t|jd |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   Fr   N)r   parenthesize_long_type_hintsrU   rb   r   r   r<   ru   r   rR   rR   rS   visit_tname  s   zLineGenerator.visit_tnamec                 c   s   t j| jv rt| t|rtd|js| jjr$t	|j}t
|}n|j}t|}|t|d  }|d }|d |kr?dnd}|||  }| }d| jj }t|r[t||}n| }d}|r|d |krmd| }|d |krw|d7 }|d d	krt|t|d	 }	|	d
 r|d7 }d}n|sd}|| }
| jr|dkr| }|rt|d nd}t|dkr|| | jjkrt|| | jjkr|s||
 | d | |
 |_n||
 | |
 |_n	||
 | |
 |_| |E d H  d S )Nz\\\s*\nr   r]   r   z    F r   \r   T
)r   hex_codes_in_unicode_sequencesrU   rB   r,   researchrr   rp   r@   rA   r?   rb   r`   r_   r/   r>   striprstrip
splitlinesline_lengthru   )rZ   r   	docstringr   
quote_char	quote_lendocstring_started_emptyr\   has_trailing_backslashbackslash_countquotelineslast_line_lengthrR   rR   rS   visit_STRING  sZ   

zLineGenerator.visit_STRINGc                 C   sL  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j| jv rntdhB }nt}t|||d| _t|dhdhd| _t||dhd| _t||dhd| _| j| _| j| _| j| _| j| _dS )z,You are in a twisty little maze of passages.rU   assert,)r   r   >   ifelifelser   r   whiler   forin>   tryr   exceptfinallyr   withclass:rW   importdelN)r   rU   r`   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   r   r   visit_expr_stmtvisit_return_stmtvisit_import_fromvisit_del_stmtr   visit_async_funcdefr   visit_decoratedr   visit_match_stmtvisit_case_block)rZ   v   ØassignmentsrR   rR   rS   rY     s4   
zLineGenerator.__post_init__)r   )rW   N))rN   rO   rP   rQ   r   r   r   r[   intr   r   re   LNru   rL   r   rK   r   r   r   strr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rY   __classcell__rR   rR   rw   rS   rT   \   sF    

	SrT   re   rV   rU   rW   c                 C   s,   zt tt| ||W S  ty   Y d S w rX   )r   r   rI   rC   )re   rV   rU   rR   rR   rS   !_hugging_power_ops_line_to_string  s
   r  rR   c                 c   s   | j r	| V  dS t| }tj|v rt| ||p|n|}|j}|j}t||}t||}t	||}	t
||}
|  sc| jsc| jsct| ||dsK|  rc| jrR|  sc|  sctj|v r`||g}nQg }nN| jrot| |sot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)rU   line_strrZ   re   rV   rU   rW   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   r   N)rV   )generate_trailers_to_omitr   listright_hand_splitr   )rZ   re   rV   rU   r  r   rR   rR   rS   _rhsZ  s   	
ztransform_line.<locals>._rhsrhsrR   __call__r  )$
is_commentr   r   fix_power_op_line_lengthr  r   rp   rD   rE   rG   rF   $contains_uncollapsable_type_commentsshould_split_rhsmagic_trailing_commar   !contains_unsplittable_type_ignorerh   contains_standalone_comments0contains_implicit_multiline_string_with_commentsstring_processingis_defshould_split_funcdef_with_rhsleft_hand_splitobjectr   r   r   r   r   rm   delimiter_splitstandalone_comment_splitrl   rI   run_transformerrC   )re   rU   rV   r  line_str_hugging_power_opsllsnstring_mergestring_paren_stripstring_splitstring_paren_wraptransformersr  r  	transformresultrR   rR   rS   transform_line'  s   	




	






r8  c                 C   s   t j|vrd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 q6|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.
    FTr^   preformattedtrack_bracketN)r   +respect_magic_trailing_comma_in_return_typerc   rm   rJ   r   rl   r#   r   rU   r_   r   idr"  )re   rU   return_type_leavesin_return_typer   r7  leaves_to_trackrR   rR   rS   r(    s*   




r(  c                   @   s   e Zd Ze Ze Ze ZdS )_BracketSplitComponentN)rN   rO   rP   r   headbodytailrR   rR   rR   rS   rA    s    
rA  	_featuresc                 c   s    g }g }g }|}d}| j D ]5}||u r1|jtv r1|j|u r1t|tr1t| t| |r/|n|}|| ||u rC|jtv rC|}|}q|sJt	dt
|| |tjd}	t
|| |tjd}
t
|| |tjd}t|	|
| |	|
|fD ]}|rw|V  qpd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.
    NNo brackets found	component)rc   rm   r!   opening_bracketri   rK   r(   rl   r"   rM   bracket_split_build_linerA  rB  rC  rD   bracket_split_succeeded_or_raise)re   rE  rU   tail_leavesbody_leaveshead_leavescurrent_leavesmatching_bracketr   rB  rC  rD  r7  rR   rR   rS   r)    sL   	







r)  r  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`.
    r  rV   r  N)_first_right_hand_split%_maybe_split_omitting_optional_parens)re   rU   rV   r  
rhs_resultrR   rR   rS   r    s
   
r  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|  |  |  t	j
| jv r|d jtjtjfv rfdnd}	|d jtjkr|d jr|d j|d u r|d jtjtjfv r|d j||	 u r||dd|	   }|dd | }|d|	 d }t|| |tjd}
t|| |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.
    NrF  r   r]   r   rG  )reversedrc   rl   rm   r!   r=  rI  rM   reverser   *hug_parens_with_braces_and_square_bracketsrU   rJ   STARr   r}   rr   RBRACERSQBrJ  rA  rB  rC  rD  rK  r   )re   r  rL  rM  rN  rO  rI  closing_bracketr   is_unpackingrB  rC  rD  rR   rR   rS   rR    sX   




rR  r  c              
   c   s   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|}zWt||d}tj|jv rtt| jjdkrt| jjd jtjkrttdd | jjd d D rtt| jt||jd dd	rt| jjd u rtt||rt|||||d
E d H  W d S W n2 ty } z&t| jst| j|d	st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 )Nr  r   c                 s   s    | ]}|j tv V  qd S rX   )rm   r    .0r   rR   rR   rS   	<genexpr>m      z8_maybe_split_omitting_optional_parens.<locals>.<genexpr>r   r]   )r   r   rQ  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_PARENTHESESrI  rm   rJ   r|   rr   r[  r}   	is_importr   r   r=  rR  r   /prefer_splitting_right_hand_side_of_assignmentsrU   rb   rB  rc   EQUALanyr   r   r"  _prefer_split_rhs_ooprS  rM   r   rC  contains_multiline_stringsrD  r(   )r  re   rU   rV   r  rhs_ooper7  rR   rR   rS   rS  N  sz   






rS  ri  c                 C   s~   d}t | jjD ]}|jtjkr n
|jtv rd} nq|p>tdd | jjD o/t| j|dp>| j	 p>| j
	 p>| j	 S )z\
    Returns whether we should prefer the result from a split omitting optional parens.
    FTc                 s       | ]	}|j tjkV  qd S rX   )rm   rJ   re  r^  rR   rR   rS   r`        z(_prefer_split_rhs_oop.<locals>.<genexpr>r   )rU  rB  rc   rm   rJ   re  r!   rf  r   r#  rC  rD  )ri  rU    has_closing_bracket_after_assignr   rR   rR   rS   rg    s$   
	
rg  rB  rC  rD  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)rb   r  r   rM   )rB  rC  rD  tail_lenrR   rR   rS   rK    s   
rK  rc   originalrI  rH  c                C   s  t |j|jd}|tju rd|_| jd7  _| rt| d dd |jo^|jdko^t	dd | D  o^t	d	d | d j
t| d j
d
dfD  o^| d j
o]| d j
jo]| d j
jjtjk }|jsd|rtt| d ddD ] }| | jtkrxqn| | jtjkrttjd}| |d |  t }|tju rt| }| D ]}	|j|	dt|	|v d ||	D ]	}
|j|
dd qq|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.
    r^   Tr]   r   rg   r   c                 s   rk  rX   )rm   rJ   COMMAr^  rR   rR   rS   r`    rl  z+bracket_split_build_line.<locals>.<genexpr>c                 s   s2    | ]}t |trt |jtr|jjtkV  qd S rX   )ri   rL   r{   rK   rm   r#   )r_  rf   rR   rR   rS   r`    s    


r   Nr   r   r9  r:  )r   rU   r_   rA  rC  rh   ro   r'  rr   rf  r   getattrnext_siblingrm   rJ   VBARrc  rangerb   r$   rp  rK   insertr   rB  r   rl   r=  comments_aftershould_split_liner!  )rc   ro  rI  rH  r7  	no_commasr   	new_commar@  r   comment_afterrR   rR   rS   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.
    re   rV   rU   rW   c                 3   s0     | ||D ]}t |jd dd |V  qd S )Nr   Trg   )ro   rc   )re   rV   rU   
split_liner|  rR   rS   split_wrapper'  s
   z0dont_increase_indentation.<locals>.split_wrapper)r   r   r   r   r   r   )r|  r  rR   r~  rS   dont_increase_indentation!  s   r  c                 C   s8   t t| jd ddD ]}| j| jtkr|  S qd S )Nr]   r   r   )ru  rb   rc   rm   r$   )re   leaf_idxrR   rR   rS   _get_last_non_comment_leaf2  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   rc   rm   rJ   rp  r$   rK   rl   )r  r  re   rz  rR   rR   rS   _safe_add_trailing_comma9  s   
r  c                 #   s   zj d }W n ty   tddw 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}t}	tj D ]s\}
}||E dH  |D ]	}||E dH  qut||j}|j|krt|tjhdr|otj|v }nt|tjtjhdr|otj|v }tj|v r|j t!kr|
|	krt"||  |j#$t|}||kr؈ V  t	j
jjd qe 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 emptyNexcludezNo delimiters foundr]   z7Splitting a single attribute from its owner looks wrongrU   r_   rh   Tr   rW   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.Trq  r  Nappend_safe
ValueErrorr   rU   r_   rh   rl   r   r`   re   rR   rS   append_to_linec     z'delimiter_split.<locals>.append_to_line)within)%rc   
IndexErrorrM   rj   max_delimiter_priorityr=  r  r   delimiter_count_with_priorityr   rU   r_   rh   sysmaxsizerK   r   r  r   rw  minbracket_depthr8   r;   typedargslistr   TRAILING_COMMA_IN_DEFarglistargumentTRAILING_COMMA_IN_CALLr   add_trailing_comma_consistentlyrm   r$   r  
delimitersget)re   rV   rU   	last_leafbtr  lowest_depthtrailing_comma_safer  last_non_comment_leafr  r   r{  leaf_priorityrR   r  rS   r+  E  sj   	





r+  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   rW   c                 3   r  )r  Trq  )r_   rh   Nr  r  r  rR   rS   r    r  z0standalone_comment_split.<locals>.append_to_lineN)
r$  rM   r   rU   r_   rh   rK   r   rc   rw  )re   rV   rU   r  r   r{  rR   r  rS   r,    s   

r,  r   rh   c                C   sV   |s&| j d}d|d vr&|d d}t|dkr|d8 }d| | _ dS d| _ dS )	zLeave existing extra newlines if not `inside_brackets`. Remove everything
    else.

    Note: don't use backslashes for formatting or you'll lose your voting rights.
    #r   r   r   r   r]   Nry   )r   splitcountrb   )r   rh   splnl_countrR   rR   rS   ro     s   

ro   rf   r   c          	      C   sn  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rX|jtjkrXtj|v rXt|dh||d |dkrit|tri|jtjkrid}|r |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||  nu|jtjkrt|| drt| |dd
 nat|rt| |dd
 nU| jtjkrt| ||  dS |dkr|jtjkr| jtj krq't|tr|j!dur|j!jtj"kr|jdkrtj|v r dS t|trt#|s t| |dd
 |jtj$k}t|to3|j|v p3|}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_endmarkerNr   caser   Tr   r   r   r   r]   )%r   r   rr   r   rm   r;   	with_stmt_maybe_wrap_cms_in_parensr   r  r   ri   rL   	annassignr   
case_blockr   long_case_block_line_splittingtestlist_star_exprr   for_stmtr{   rK   rJ   NAMEr   r<   remove_with_parensr2   import_from_normalize_import_fromrX  except_clausers  r   r/   rp  )	rf   r   rU   rV   pc
check_lparr   r   comma_checkrR   rR   rS   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   ry   )r.   r3   r   rr   rm   rJ   rX  r~   rK   r|   r   r}   )r   r   r   rR   rR   rS   r  :  s   r  c                 C   s  | j d jtjkrt| j dkr| j d jtjkr| j d j d jtjkrt| j d | ddr9t	| | 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su|j d jtjksutdd	 |j D rt| t| d S d S d S d S d S d S d S )
Nr   r]   Tr   Fr   r   c                 s   s&    | ]}t |to|jtjkV  qd S rX   )ri   rK   rm   rJ   r   )r_  r   rR   rR   rS   r`  b  s
    
z&remove_await_parens.<locals>.<genexpr>)r   rm   rJ   AWAITrb   r;   r   r|   r   r<   r   rK   ri   rL   r   rf  r(   )rf   rI  r[  bracket_contentsrR   rR   rS   r   H  s4    	
r   c           
      C   s   t j|v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r5|} nq&|durktt
jd}tt
jd}| jd| }|D ]}|  qOt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   r]   Nry   )r   PARENTHESIZED_CONTEXT_MANAGERSr   (wrap_multiple_context_managers_in_parensrb   r   rm   r;   r   ru  rJ   r   rK   r|   r}   r   rL   testlist_gexpr~   )
rf   rU   rV   colon_indexr   r   r   context_managersr   	new_childrR   rR   rS   r  k  s,   


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	S d	S | j tj	kr@| jD ]}t|tr=t||  q1d	S | j tj
krgtdd |  D sit| jd | ddrkt| | jd dd d	S d	S d	S d	S )
z6Recursively hide optional parens in `with` statements.Tr   Fr   r]   c                 s   rk  rX   )rm   rJ   
COLONEQUALr^  rR   rR   rS   r`    s    
z%remove_with_parens.<locals>.<genexpr>r   N)rm   r;   r   r   r<   ri   r   rL   r  r  asexpr_testrf  rc   )rf   r   r   rR   rR   rS   r    s6   


r  Fr   c                 C   s
  | j tjtjfvs't| s't| s't| r|j tjks'|s#t| t	ks't
| r)dS t| rJ|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 rJdS | jd }| jd }t|rt|r| jd }t|j snd|_d|_t|||d t|r||jd  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.
    Fr   r   r]   ry   r   T)rm   r;   r   exprr-   r2   r:   	expr_stmtr   r   r6   r9   r  assert_stmtreturn_stmtr  funcdefr  tnamer  del_stmtr   r.   r3   r7   r   r   rr   r   r+   r   )rf   r   r   firstlastmiddlerR   rR   rS   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   rr   r   rc   rm   rJ   rp  addr=  rj   r  r  r  r   rU   r"  r;   r   r  )re   rI  r  trailing_commar  max_priorityrR   rR   rS   rx    s"   
rx  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)rU  r   r]   )r   r"  r_   enumerate_with_lengthrb   rr   r   rm   r$   r!   rc   rJ   rp  rI  r1   r  r=  r"   updateclear)re   r   r  lengthrI  r[  inner_bracketsr   r   leaf_lengthhas_inline_commentprevrR   rR   rS   r  #  sj   






r  ry   r  r6  r  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 result)rU   rV   r  c                 s   s    | ]}|j V  qd S rX   )rr   )r_  bracketrR   rR   rS   r`    s    z"run_transformer.<locals>.<genexpr>r   r   c                 s   s    | ]}|j d u V  qd S rX   r   r^  rR   rR   rS   r`    ra  r  c                 3   s    | ]	}t | d V  qdS )r   N)r   )r_  lnr   rR   rS   r`    rl  )r   r  r   rC   extendr8  r   r   rb  rx   rN   rj   	invisiblerf  rh  r   r#  r   rc   cloner   r-  all)re   r6  rU   rV   r  r7  transformed_linefeatures_set	line_copyfeatures_fopsecond_opinionrR   r   rS   r-  o  sD   



r-  )rR   )rR   rR   )F)}rQ   r   r  dataclassesr   enumr   r   	functoolsr   r   typingr   r   r	   r
   r   r   r   black.bracketsr   r   r   r   black.commentsr   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<   black.numericsr=   black.stringsr>   r?   r@   rA   rB   black.transrC   rD   rE   rF   rG   rH   rI   blib2to3.pgen2rJ   blib2to3.pytreerK   rL   r  LeafIDr  rM   rT   r  r  r8  boolr(  rA  r)  r  rR  rS  rg  rK  rJ  r  r  r  r+  r,  ro   r   r  r   r  r  r   rx  r  r-  rR   rR   rR   rS   <module>   s`   $$	 $	   C

~"
2

B
K
QS"
l#
+-
HR