a
    GN^#                 $   @   s  U 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 d dlm	Z	 d dl
mZmZmZ d dlZd dlZd dlZd dlmZmZ d dlZd dlmZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd d	lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 d d
l1m2Z2 d dl3m4Z4m5Z5m6Z6 d dl7Z7d dl8Z8d dl9m:Z:m;Z; d dl<m=Z= d dl>m?Z?m@Z@mAZA d dlBmCZCmDZD d dlEmFZFmGZG d dlHmIZI d dlJmKZK d dlLmMZN dZOdZPdZQee2deNdZReSZTeSZUeSZVeWZXeWZYeWZZeWZ[eWZ\e/e@e?f Z]e!de"d ge'd f Z^e_Z`eWZae-e`eaf Zbe#eebf Zcee7jddddZeee7jddddZfeCgeR eCjhZiG dd dejZkG d d! d!elZmG d"d# d#enZoG d$d% d%e	ZpG d&d' d'e	ZqG d(d) d)e	ZrerjserjterjuhZvG d*d de	Zwerjxewjyherjzewj{ewjyherj|ewj{ewjyherj}ewj{ewj~ewjyherjsewj{ewjewjewj~ewjewjyherjtewj{ewjewjewj~ewjewjherjuewj{ewjewjewj~ewjewjewjewjhiZe#ere,ew f ed+< e4G d,d- d-Ze,er ewed.d/d0Ze7je7je/eSeWedf e)eS d1d2d3Ze7jed4d5gd6d7e7jd8d9eSd:d;e7jd<d=eWeOd>dd?e7jd@dAe7dBdC erD dDdE ddFdGe7jdHddIdJe7jdKddLdJe7jdMdNddOdJe7jdPddQdJe7jdRddSdJe7jdTddUdJe7jdVeSeQdWdd?e7jdXeSePdYdd?e7jdZd[dd\dJe7jd]d^dd_dJe7jeNde7jd`dae7jddddddbddce7jdde7jdeddeddedbdedfdge7je7je)eS eWe(er eeeeeeeeeSeSe-eS e)eS ddhdidjZe-eS eee7jddkdldmZeeepednddodpdqZe,e eepednddrdsdtZe,e eepednejeddudvdwZepjdfeeeepe edxdydzZepjd{eepeed|d}d~ZeSeeeTdddZeSeeTdddZee-eTeUeVf dddZe,er e(eI dddZdzeSe&er e?dddZe?eSdddZe.dZG dd de%e Ze4G dd dee ZeGjeGjeGjhZeijeijeijeijeijeijeijeijhZdZdeGje< ddhZeGjeGjeGjeGjeGjeGjhZeGjeGjeGjeGjeGjeGjeGjeGjeGjeGjeGjeGjeGjeGjhZeGjeGjhZeeGjhB ZeijeijeijeijeijhZeijeijeijeijeijhZeijeijeijeijeijeijeijeijeijeijeijeijeijeijeijhZh dZdZdZdZdZdZdZeGjdeGjdeGjdeGjdeGjdeGjdeGjdeGjdeGjdeGjdeGjdeGjdeGjdeGjdiZdZe4G dd dZe4G dd dZe4G dd dZe4G dd dee ZeijeijeijhZeGjeGjeGjeGjeGjeGjiZe e Ze e ZeeB ZeeGjehB Ze@eeSdddZe)e] e)e@ dddZ	e?e]e)e] dddZ
e@e]dddZd{e@e)e@ e[dddZd|e@e)e@ e[dddZh d£Zh dãZe]e'e@ dddńZe4G ddǄ dǃZeddɍeSee(e dʜdd̄ZeSeSd͜ddτZd}eeWee"ew e'e dМdd҄Zd~ee"ew e'e dӜddՄZdeeWe"ew e"eZ e'e d֜dd؄ZeeeddٜddۄZdedܜe(e@ ee@eedݜdd߄Ze^e^dddZedee"ew e'e dӜddZedee"ew e'e dӜddZe@edddZde@eSedddZe@eddddZde@eddddZe@ddddZ e@ddddZ!eSeSdddZ"e?e,eS ddddZ#e?ddddZ$e?eddd Z%e@e'e] dddZ&e]e]edddZ'e]edddZ(e]eddd	Z)e]e)e] dd
dZ*dde?e]eddddZ+e]edddZ,e]edddZ-e]edddZ.e@e,eY edddZ/e@edddZ0e?edddZ1e]edddZ2e]e[ddd Z3e@ddd!d"Z4ee@ed#d$d%Z5e?e,ew dd&d'Z6e?e,er dd(d)Z7eeWe'e,eZ  d*d+d,Z8e?e,eS dd-d.Z9e ee=d/d0d1Z:eee*eS e*eS dne=e'e d2d3d4Z;e e&eS ed5d6d7Z<e4G d8dn dnZ=eSe/e j>e:j>e;j>f dd9d:Z?e/e j>e:j>e;j>f e/e j>e:j>e;j>f dd;d<Z@eSeSdd=d>d?ZAeSeSedd@dAdBZBeSeSdCdDdEZCee'd dFdGdHZDeSeSeSeSeSdIdJdKZEe&ejF ddLdMdNZGejddOdPdQZHe*eS eSeSeSdRdSdTZIeSe*eS dUdVdWZJe+e e'e-e\ef  dXdYdZZKdeee'e-e\e@eWf  d[d\d]ZLdd^eeWeSed_d`daZMeedbdcddZNeeWed*dedfZOeedgdhdiZPeecdgdjdkZQeebdldmdnZRece&e e-e,e e,e f dodpdqZSece&e eddrdsdtZTddFdudvZUddFdwdxZVeWdykreV  dS (      N)ExecutorProcessPoolExecutor)contextmanager)datetime)Enum)	lru_cachepartialwraps)Managerfreeze_support)Path)AnyCallable
CollectionDict	GeneratorGenericIterableIteratorListOptionalPatternSequenceSetTupleTypeVarUnioncast)user_cache_dir)	dataclassevolveFactory)ast3ast27)PathSpec)NodeLeaf	type_repr)pygrampytree)drivertoken)Grammar)
ParseError)versionX   zV/(\.eggs|\.git|\.hg|\.mypy_cache|\.nox|\.tox|\.venv|\.svn|_build|buck-out|build|dist)/z\.pyi?$blackLineFeatureT)bolderrred)fgr4   c                   @   s   e Zd ZdZdS )NothingChangedz3Raised when reformatted code is the same as source.N__name__
__module____qualname____doc__ r=   r=   $lib/python3.9/site-packages/black.pyr7   U   s   r7   c                   @   s   e Zd ZdZdS )CannotSplitzBA readable split that fits the allotted line length is impossible.Nr8   r=   r=   r=   r>   r?   Y   s   r?   c                   @   s   e Zd ZdZdS )InvalidInputz7Raised when input source code fails all parse attempts.Nr8   r=   r=   r=   r>   r@   ]   s   r@   c                   @   s2   e Zd ZdZdZdZdZeeed dddZ	dS )		WriteBackr            )checkdiffreturnc                C   s   |r|s| j S |r| jS | jS N)CHECKDIFFYES)clsrE   rF   r=   r=   r>   from_configurationg   s    zWriteBack.from_configurationN)
r9   r:   r;   NOrK   rJ   rI   classmethodboolrM   r=   r=   r=   r>   rA   a   s   rA   c                   @   s   e Zd ZdZdZdZdS )Changedr   rB   rC   N)r9   r:   r;   rN   CACHEDrK   r=   r=   r=   r>   rQ   o   s   rQ   c                   @   s6   e Zd ZdZdZdZdZdZdZdZ	e
dd	d
ZdS )TargetVersionrC   rD                  rG   c                 C   s
   | t ju S rH   )rS   PY27selfr=   r=   r>   
is_python2~   s    zTargetVersion.is_python2N)r9   r:   r;   rZ   PY33PY34PY35PY36PY37PY38rP   r]   r=   r=   r=   r>   rS   u   s   rS   c                   @   s0   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
S )r2   rB   rC   rD   rT   rU   rV   rW   rX   	   N)r9   r:   r;   UNICODE_LITERALS	F_STRINGSNUMERIC_UNDERSCORESTRAILING_COMMA_IN_CALLTRAILING_COMMA_IN_DEFASYNC_IDENTIFIERSASYNC_KEYWORDSASSIGNMENT_EXPRESSIONSPOS_ONLY_ARGUMENTSr=   r=   r=   r>   r2      s   VERSION_TO_FEATURESc                   @   sT   e Zd ZU eeZee ed< e	Z
eed< dZeed< dZeed< eddd	Zd
S )FileModetarget_versionsline_lengthTstring_normalizationFis_pyirY   c                 C   s^   | j r*ddd t| j dd dD }nd}|t| jtt| jtt| jg}d|S )	N,c                 s   s   | ]}t |jV  qd S rH   )strvalue.0r.   r=   r=   r>   	<genexpr>   s   z)FileMode.get_cache_key.<locals>.<genexpr>c                 S   s   | j S rH   rv   )vr=   r=   r>   <lambda>       z(FileMode.get_cache_key.<locals>.<lambda>)key-.)rp   joinsortedru   rq   intrr   rs   )r\   Zversion_strpartsr=   r=   r>   get_cache_key   s    

zFileMode.get_cache_keyN)r9   r:   r;   r!   setrp   r   rS   __annotations__DEFAULT_LINE_LENGTHrq   r   rr   rP   rs   ru   r   r=   r=   r=   r>   ro      s
   
ro   )rp   featurerG   c                    s   t  fdd| D S )Nc                 3   s   | ]} t | v V  qd S rH   rn   rw   r   r=   r>   ry      r}   z#supports_feature.<locals>.<genexpr>)all)rp   r   r=   r   r>   supports_feature   s    r   )ctxparamrv   rG   c              
   C   s   t |ttfrJ d|sJt| jdd}|d }| rFt|}ndS z"t	|}|di di }W n> tj
tfy } z tj|d| d	W Y d}~n
d}~0 0 |sdS | jdu ri | _| jd
d | D  |S )zInject Black configuration from "pyproject.toml" into defaults in `ctx`.

    Returns the path to a successfully found and read configuration file, None
    otherwise.
    zInvalid parameter type passedsrcr=   pyproject.tomlNZtoolr0   z"Error reading configuration file: )filenamehintc                 S   s&   i | ]\}}| d d dd|qS )z-- r   _)replacerx   kr{   r=   r=   r>   
<dictcomp>   r}   z'read_pyproject_toml.<locals>.<dictcomp>)
isinstancer   rP   find_project_rootparamsgetis_fileru   tomlloadZTomlDecodeErrorOSErrorclickZ	FileErrorZdefault_mapupdateitems)r   r   rv   rootpathZpyproject_tomlconfiger=   r=   r>   read_pyproject_toml   s,    



r   z-hz--help)Zhelp_option_names)Zcontext_settingsz-cz--codez&Format the code passed in as a string.)typehelpz-lz--line-lengthz&How many characters per line to allow.)r   defaultr   Zshow_defaultz-tz--target-versionc                 C   s   g | ]}|j  qS r=   )namelower)rx   r{   r=   r=   r>   
<listcomp>  r}   r   c                 C   s   dd |D S )Nc                 S   s   g | ]}t |  qS r=   )rS   upper)rx   valr=   r=   r>   r     r}   z<lambda>.<locals>.<listcomp>r=   )cpr{   r=   r=   r>   r|     r}   r|   z^Python versions that should be supported by Black's output. [default: per-file auto-detection])r   callbackZmultipler   z--py36zAllow using Python 3.6-only syntax on all input files.  This will put trailing commas in function signatures and calls also after *args and **kwargs. Deprecated; use --target-version instead. [default: per-file auto-detection])Zis_flagr   z--pyiztFormat all input files like typing stubs regardless of file extension (useful when piping source on standard input).z-Sz--skip-string-normalizationz*Don't normalize string quotes or prefixes.z--checkzDon't write the files back, just return the status.  Return code 0 means nothing would change.  Return code 1 means some files would be reformatted.  Return code 123 means there was an internal error.z--diffzGDon't write the files back, just output a diff for each file on stdout.z--fast/--safez@If --fast given, skip temporary sanity checks. [default: --safe]z	--includea%  A regular expression that matches files and directories that should be included on recursive searches.  An empty value means all files are included regardless of the name.  Use forward slashes for directories on all platforms (Windows, too).  Exclusions are calculated first, inclusions later.z	--excludea  A regular expression that matches files and directories that should be excluded on recursive searches.  An empty value means no paths are excluded. Use forward slashes for directories on all platforms (Windows, too).  Exclusions are calculated first, inclusions later.z-qz--quietzbDon't emit non-error messages to stderr. Errors are still emitted; silence those with 2>/dev/null.z-vz	--verbosezaAlso emit messages to stderr about files that were not changed or were ignored due to --exclude=.r   )existsZ	file_okayZdir_okayreadableZ
allow_dash)nargsr   is_eagerz--configFzRead configuration from PATH.)r   r   r   r   )r   coderq   target_versionrE   rF   fastpyipy36skip_string_normalizationquietverboseincludeexcluder   r   rG   c                 C   sN  t j||d}|r4|r*td | d qLt|}n|rFtd t}nt }t||||	 d}|r||r|td| ddd	d
 |durtt	||d | d zt
|}W n, tjy   td| | d Y n0 zt
|}W n. tjy   td| | d Y n0 t||
|d}t|}t }t||
||  |D ]d}t|}| rv|t|||||t| n.| s|dkr|| ntd|  qBt|dkr|s|
std | d t|dkrt| ||||d nt|||||d |s|
s>t|jr&dnd tjt|dd | |j dS )z"The uncompromising code formatter.)rE   rF   z+Cannot use both --target-version and --py36rC   z`--py36 is deprecated and will be removed in a future version. Use --target-version py36 instead.)rp   rq   rs   rr   zUsing configuration from r   Fblue)r3   r6   Nmoder   z.Invalid regular expression for include given: z.Invalid regular expression for exclude given: )rE   r   r   r   zinvalid path: u?   No Python files are present to be formatted. Nothing to do 😴rB   )r   r   
write_backr   report)sourcesr   r   r   r   u   Oh no! 💥 💔 💥u   All done! ✨ 🍰 ✨T)r4   )rA   rM   r4   exitr   PY36_VERSIONSro   outprint
format_strre_compile_maybe_verbosereerrorReportr   
path_emptyr   is_dirr   gen_python_files_in_dirget_gitignorer   addlenreformat_onepopreformat_manyreturn_coder   sechoru   )r   r   rq   r   rE   rF   r   r   r   r   r   r   r   r   r   r   r   versionsr   Zinclude_regexZexclude_regexr   r   r   sr   r=   r=   r>   main   s     




r   )r   r   r   r   rG   c                 C   s"   | s|s|st d |d dS )z;
    Exit if there is no `src` provided for formatting
    u$   No Path provided. Nothing to do 😴r   N)r   r   )r   r   r   r   r=   r=   r>   r     s    r   r   )r   r   r   r   r   rG   c           	   
   C   s  zt j}|  s2t| dkr2t|||drt j}ni }|tjkrnt|}| 	 }||v rn|| t
|krnt j}|t jurt| |||drt j}|tju r|t jus|tju r|t ju rt|| g| || | W n6 ty } z|| t| W Y d}~n
d}~0 0 dS )zReformat a single file under `src` without spawning child processes.

    `fast`, `write_back`, and `mode` options are passed to
    :func:`format_file_in_place` or :func:`format_stdin_to_stdout`.
    r   )r   r   r   N)rQ   rN   r   ru   format_stdin_to_stdoutrK   rA   rJ   
read_cacheresolveget_cache_inforR   format_file_in_placerI   write_cachedone	Exceptionfailed)	r   r   r   r   r   changedcacheZres_srcexcr=   r=   r>   r     s0    
r   )r   r   r   r   r   rG   c                 C   sv   t  }t }tjdkr$t|d}t|d}z0|t	| ||||||d W t
| |
  nt
| |
  0 dS )z4Reformat multiple files using a ProcessPoolExecutor.win32=   )max_workers)r   r   r   r   r   loopexecutorN)asyncioZget_event_loopos	cpu_countsysplatformminr   run_until_completeschedule_formattingshutdown)r   r   r   r   r   r   Zworker_countr   r=   r=   r>   r     s*    



r   )r   r   r   r   r   r   r   rG   c                    s  i }t jkr@t}t|| \} }t|D ]}	||	tj q,| sHdS g }
g }dt jkrlt }|	  fddt| D }|
 }z$tjt| tjt| W n ty   Y n0 |rtj|tjdI dH \}}|D ]}||}	| r|
| q| r4||	t|  q| rDtjntj}t ju snt ju rx|tju rx||	 ||	| qq|
rtj|
ddI dH  |rt|| dS )zRun formatting of `sources` in parallel using the provided `executor`.

    (Use ProcessPoolExecutors for actual parallelism.)

    `write_back`, `fast`, and `mode` options are passed to
    :func:`format_file_in_place`.
    Nc                    s*   i | ]"}t  t||qS r=   )r   Zensure_futureZrun_in_executorr   rx   r   r   r   lockr   r   r   r=   r>   r   D  s   z'schedule_formatting.<locals>.<dictcomp>)Zreturn_whenTr   Zreturn_exceptions) rA   rJ   r   filter_cachedr   r   rQ   rR   r
   LockkeysZadd_signal_handlersignalSIGINTcancelSIGTERMNotImplementedErrorr   waitZFIRST_COMPLETEDr   	cancelledappend	exceptionr   ru   resultrK   rN   rI   gatherr   )r   r   r   r   r   r   r   r   cachedr   r  Zsources_to_cacheZmanagertaskspendingr   r   taskr   r=   r   r>   r   #  sV    





r   )r   r   r   r   r   rG   c                 C   sl  | j dkrt|dd}t|  j}t| d"}t| \}}}	W d   n1 sX0    Y  zt	|||d}
W n t
y   Y dS 0 ||jkrt| d||	d	}||
 W d   n1 s0    Y  n||jkrht }|  d
| d}|  d
| d}t||
||}|pt 8 tjtjj||	dd}|| |  W d   n1 s^0    Y  dS )zFormat file under `src` path. Return True if changed.

    If `write_back` is DIFF, write a diff to stdout. If it is YES, write reformatted
    code to the file.
    `mode` and `fast` options are passed to :func:`format_file_contents`.
    z.pyiTrs   rbNr   r   Fw)encodingnewline	 +0000r  r  write_through)suffixr    r   Zutcfromtimestampstatst_mtimeopendecode_bytesreadformat_file_contentsr7   rK   writerJ   utcnowrF   nullcontextioTextIOWrapperr   stdoutbufferdetach)r   r   r   r   r   thenbufsrc_contentsr  r  dst_contentsfnowsrc_namedst_nameZdiff_contentsr=   r=   r>   r   j  s6    
0
*
(r   )r   )r   r   r   rG   c                C   s2  t  }ttjj \}}}|}zzt|| |d}W W tj	tj
j||dd}|tjkrf|| n>|tjkrt  }	d| d}
d|	 d}|t|||
| |  dS  ty:   Y W tj	tj
j||dd}|tjkr|| n@|tjkr.t  }	d| d}
d|	 d}|t|||
| |  dS 0 W tj	tj
j||dd}|tjkrl|| n@|tjkrt  }	d| d}
d|	 d}|t|||
| |  nxtj	tj
j||dd}|tjkr|| n@|tjkr$t  }	d| d}
d|	 d}|t|||
| |  0 dS )	zFormat file on stdin. Return True if changed.

    If `write_back` is YES, write reformatted code back to stdout. If it is DIFF,
    write a diff to stdout. The `mode` argument is passed to
    :func:`format_file_contents`.
    r  Tr  zSTDIN	r  zSTDOUT	FN)r   r#  r  r   stdinr(  r   r!  r%  r&  r'  rA   rK   r"  rJ   rF   r)  r7   )r   r   r   r*  r   r  r  dstr.  r/  r0  r1  r=   r=   r>   r     sl    	



r   )r,  r   r   rG   c                C   sH   |   dkrtt| |d}| |kr(t|sDt| | t| ||d |S )zReformat contents a file and return new contents.

    If `fast` is False, additionally confirm that the reformatted code is
    valid by calling :func:`assert_equivalent` and :func:`assert_stable` on it.
    `mode` is passed to :func:`format_str`.
    r   r   )stripr7   r   assert_equivalentassert_stable)r,  r   r   r-  r=   r=   r>   r!    s    	
r!  )r,  r   rG   c                   s  t |  |j}g }t|}|jr*|j nt| t| td|v pNt tj	|j
|jd}t|j
d}t }d} fddtjtjhD }	||D ]n}
t|D ]}|t| q||
\}}t|D ]}|t| qt|
|j|	dD ]}|t| qqd|S )	zReformat a string and return new contents.

    `mode` determines formatting options, such as how many characters per line are
    allowed.
    Zunicode_literals)remove_u_prefixrs   normalize_stringsr  r   c                    s   h | ]}t  |r|qS r=   )r   )rx   r   r   r=   r>   	<setcomp>  s   
zformat_str.<locals>.<setcomp>rq   featuresr   )lib2to3_parselstriprp   get_future_importsdetect_target_versionsnormalize_fmt_offLineGeneratorr   r2   re   rs   rr   EmptyLineTrackerr1   rh   ri   visitranger	  ru   maybe_empty_lines
split_linerq   r   )r,  r   Zsrc_noder-  Zfuture_importslineseltZ
empty_lineafterZsplit_line_featurescurrent_liner   beforeliner=   r9  r>   r     s<    



r   )r   rG   c                 C   s   t | }t|j\}}|s(d|dfS d|d dd kr@dnd}|d t ||}| ||fW  d   S 1 s~0    Y  dS )zReturn a tuple of (decoded_contents, encoding, newline).

    `newline` is either CRLF or LF but `decoded_contents` is decoded with
    universal newlines (i.e. only contains LF).
    r   
s   
r   Nz
)r%  BytesIOtokenizedetect_encodingreadlineseekr&  r   )r   Zsrcbufr  rH  r  Ztiowr=   r=   r>   r    s    


r  )rp   rG   c                 C   sn   | st jt jt jt jgS tdd | D r6t jt jgS g }t| tjsR|	t j t| tj
sj|	t j |S )Nc                 s   s   | ]}|  V  qd S rH   )r]   rw   r=   r=   r>   ry     r}   zget_grammars.<locals>.<genexpr>)r(   ZBpython_grammar_no_print_statement_no_exec_statement_async_keywordsZ3python_grammar_no_print_statement_no_exec_statementZ!python_grammar_no_print_statementZpython_grammarr   r   r2   rj   r	  rk   )rp   Zgrammarsr=   r=   r>   get_grammars	  s$    rU  r=   )src_txtrp   rG   c                 C   s   | dd dkr| d7 } t t|D ]}t|tj}z|| d}W  qW q$ ty } zd|jd \}}| 	 }z||d  }	W n t
y   d}	Y n0 td| d| d	|	 }
W Y d}~q$d}~0 0 q$|
dt|trttj|g}|S )
z4Given a string with source, return the lib2to3 Node.r   NrN  TrB   z<line number missing in source>zCannot parse: :: )rU  r   r*   ZDriverr)   ZconvertZparse_stringr-   context
splitlines
IndexErrorr@   r   r&   r%   syms
file_input)rV  rp   Zgrammardrvr  ZpelinenocolumnrH  Zfaulty_liner   r=   r=   r>   r=  0  s&    

2
r=  noderG   c                 C   s   t | }|S )z7Given a lib2to3 node, return its string representation.ru   )rb  r   r=   r=   r>   lib2to3_unparseK  s    rd  Tc                   @   s8   e Zd ZdZeee dddZeee dddZdS )VisitorzBBasic lib2to3 visitor that yields things of type `T` on `visit()`.ra  c                 c   sD   |j dk rtj|j  }n
t|j }t| d| | j|E dH  dS )az  Main method to visit `node` and its children.

        It tries to find a `visit_*()` method for the given `node.type`, like
        `visit_simple_stmt` for Node objects or `visit_INDENT` for Leaf objects.
        If no dedicated `visit_*()` method is found, chooses `visit_default()`
        instead.

        Then yields objects of type `T` from the selected visitor.
           Zvisit_N)r   r+   tok_namer'   getattrvisit_default)r\   rb  r   r=   r=   r>   rD  W  s    


zVisitor.visitc                 c   s*   t |tr&|jD ]}| |E dH  qdS )CDefault `visit_*()` implementation. Recurses to children of `node`.N)r   r%   childrenrD  r\   rb  childr=   r=   r>   rj  g  s    

zVisitor.visit_defaultN)	r9   r:   r;   r<   LNr   re  rD  rj  r=   r=   r=   r>   rf  T  s   rf  c                   @   sL   e Zd ZU dZeed< eee dddZ	e
eeeef dddd	ZdS )
DebugVisitorr   
tree_depthra  c                 c   s   dd| j   }t|trt|j}t| | dd |  j d7  _ |jD ]}| |E d H  qJ|  j d8  _ t| d| ddd n`tj	
|jt|j}t| | d	dd
 |jrtd|jdddd td|jd	dd d S )N rC   Zyellowr6   rB   /F)r6   r3   r   )r6   nlZgreen)r6   r3   ru  )rq  r   r%   r'   r   r   rl  rD  r+   rh  r   ru   prefixrv   )r\   rb  indentZ_typern  r=   r=   r>   rj  r  s    


zDebugVisitor.visit_defaultN)r   rG   c                 C   s*   t  }t|trt|}t|| dS )zmPretty-print the lib2to3 AST of a given string of `code`.

        Convenience method for debugging.
        N)rp  r   ru   r=  listrD  )rL   r   r{   r=   r=   r>   show  s    
zDebugVisitor.show)r9   r:   r;   rq  r   r   ro  r   re  rj  rO   r   ru   r&   r%   ry  r=   r=   r=   r>   rp  n  s   
rp     STANDALONE_COMMENTandor>   z-=z%=z&=z+==z@=z>>=z/=z//=z|=z^=z*=z**=z<<=               
   rd   rX   rW   rV   rU   rT   rD   rC   rB   c                   @   s&  e Zd ZU dZdZeed< eeZ	e
eeef ef ed< eeZe
eef ed< dZee ed< eeZee ed< eeZee ed	< edd
ddZedddZd!ee edddZd"eedddZeed
ddZeed
ddZeed
ddZ eed
ddZ!ee ddd Z"dS )#BracketTrackerz"Keeps track of brackets on a line.r   depthbracket_match
delimitersNprevious_for_loop_depths_lambda_argument_depthsleafrG   c                 C   s   |j tjkrdS | | | | |j tv rV|  jd8  _| j| j|j f}||_	| j|_
| jdkrt|| j}|r| jdur|| jt| j< nt|| j}|r|| jt|< |j tv r|| j| jt|j  f< |  jd7  _|| _| | | | dS )a  Mark `leaf` with bracket-related metadata. Keep track of delimiters.

        All leaves receive an int `bracket_depth` field that stores how deep
        within brackets a given leaf is. 0 means there are no enclosing brackets
        that started on this line.

        If a leaf is itself a closing bracket, it receives an `opening_bracket`
        field that it forms a pair with. This is a one-directional link to
        avoid reference cycles.

        If a leaf is a delimiter (a token on which Black can split the line if
        needed) and it's on depth 0, its `id()` is stored in the tracker's
        `delimiters` field.
        NrB   r   )r   r+   COMMENT'maybe_decrement_after_for_loop_variable&maybe_decrement_after_lambda_argumentsCLOSING_BRACKETSr  r  r   opening_bracketbracket_depthis_split_before_delimiterr  r  idis_split_after_delimiterOPENING_BRACKETSBRACKET maybe_increment_lambda_arguments!maybe_increment_for_loop_variable)r\   r  r  delimr=   r=   r>   mark  s,    





zBracketTracker.markrY   c                 C   s
   t | jS )zBReturn True if there is an yet unmatched open bracket on the line.)rP   r  r[   r=   r=   r>   any_open_brackets5  s    z BracketTracker.any_open_bracketsr=   )r   rG   c                    s   t  fdd| j D S )zReturn the highest priority of a delimiter found on the line.

        Values are consistent with what `is_split_*_delimiter()` return.
        Raises ValueError on no delimiters.
        c                 3   s   | ]\}}| vr|V  qd S rH   r=   r   r   r=   r>   ry   ?  r}   z8BracketTracker.max_delimiter_priority.<locals>.<genexpr>)maxr  r   )r\   r   r=   r  r>   max_delimiter_priority9  s    z%BracketTracker.max_delimiter_priority)priorityrG   c                    s2   | j s
dS  p|   t fdd| j  D S )zReturn the number of delimiters with the given `priority`.

        If no `priority` is passed, defaults to max priority on the line.
        r   c                 3   s   | ]}| krd V  qdS )rB   Nr=   )rx   r   r  r=   r>   ry   J  r}   z?BracketTracker.delimiter_count_with_priority.<locals>.<genexpr>)r  r  sumvalues)r\   r  r=   r  r>   delimiter_count_with_priorityA  s    z,BracketTracker.delimiter_count_with_priorityc                 C   s:   |j tjkr6|jdkr6|  jd7  _| j| j dS dS )zIn a for loop, or comprehension, the variables are often unpacks.

        To avoid splitting on the comma in this situation, increase the depth of
        tokens between `for` and `in`.
        forrB   TF)r   r+   NAMErv   r  r  r	  r\   r  r=   r=   r>   r  L  s
    z0BracketTracker.maybe_increment_for_loop_variablec                 C   sL   | j rH| j d | jkrH|jtjkrH|jdkrH|  jd8  _| j   dS dS )z>See `maybe_increment_for_loop_variable` above for explanation.r   inrB   TF)r  r  r   r+   r  rv   r   r  r=   r=   r>   r  Y  s    

z6BracketTracker.maybe_decrement_after_for_loop_variablec                 C   s:   |j tjkr6|jdkr6|  jd7  _| j| j dS dS )zIn a lambda expression, there might be more than one argument.

        To avoid splitting on the comma in this situation, increase the depth of
        tokens between `lambda` and `:`.
        lambdarB   TF)r   r+   r  rv   r  r  r	  r  r=   r=   r>   r  g  s
    z/BracketTracker.maybe_increment_lambda_argumentsc                 C   sB   | j r>| j d | jkr>|jtjkr>|  jd8  _| j   dS dS )z=See `maybe_increment_lambda_arguments` above for explanation.r   rB   TF)r  r  r   r+   COLONr   r  r=   r=   r>   r  t  s    

z5BracketTracker.maybe_decrement_after_lambda_argumentsc                 C   s   | j | jd tjfS )z7Return the most recent opening square bracket (if any).rB   )r  r   r  r+   RSQBr[   r=   r=   r>   get_open_lsqb  s    zBracketTracker.get_open_lsqb)r=   )r   )#r9   r:   r;   r<   r  r   r   r!   dictr  r   r   DepthNodeTyper&   r  LeafIDPriorityr  r   rx  r  r   r  r  rP   r  r   r  r  r  r  r  r  r  r=   r=   r=   r>   r    s    
 (r  c                   @   s  e Zd ZU dZdZeed< eeZ	e
e ed< eeZeee
e f ed< eeZeed< dZeed< dZeed	< d=eed
dddZd>eed
dddZeedddZeedddZeedddZeedddZeedddZeedddZeedddZeeddd Zeedd!d"Z e!j"feed#d$d%Z#edd&d'Z$edd(d)Z%edd*d+Z&eed,d-d.Z'eed/d0d1Z(ee
e d2d3d4Z)d
dd5d6Z*eed2d7d8Z+e,dd9d:Z-edd;d<Z.d
S )?r1   z;Holds leaves and comments. Can be printed with `str(line)`.r   r  leavescommentsbracket_trackerFinside_bracketsshould_explodeN)r  preformattedrG   c                 C   s   |j tv pt|j }|s dS tj|j kr>| jr>| jdd= | jrd|sd| j	t
|| |d7  _	| jsn|s| j| | | | |s| j| 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.
        NrO  )complex_subscript)r   BRACKETSrP   rv   r4  r+   r  is_class_paren_emptyr  rv  
whitespaceis_complex_subscriptr  r  r  maybe_remove_trailing_commaappend_commentr	  )r\   r  r  Z	has_valuer=   r=   r>   r	    s    






zLine.appendc                 C   sD   | j jdkr2| jrtd| jr2|jtkr2t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r  N)r  r  
is_comment
ValueErrorr  r   r{  r	  )r\   r  r  r=   r=   r>   append_safe  s    zLine.append_saferY   c                 C   s   t | jdko| jd jtkS )z"Is this line a standalone comment?rB   r   )r   r  r   r{  r[   r=   r=   r>   r    s    zLine.is_commentc                 C   s   t | o| jd jtjkS )zIs this line a decorator?r   )rP   r  r   r+   ATr[   r=   r=   r>   is_decorator  s    zLine.is_decoratorc                 C   s   t | ot| jd S )zIs this an import line?r   )rP   	is_importr  r[   r=   r=   r>   r    s    zLine.is_importc                 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)rP   r  r   r+   r  rv   r[   r=   r=   r>   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   s   g | ]}t tjd qS )r   r&   r+   DOT)rx   r   r=   r=   r>   r     s   z&Line.is_stub_class.<locals>.<listcomp>rD   )r  r  rE  r[   r=   r=   r>   is_stub_class  s    zLine.is_stub_classc                 C   sd  | j rt| j dk rdS | j d jtjkr:| j d }d}n| j d }d}|jtvsX| jr\dS |jtjkrD|j}t	| j D ]\}}||u rz qqzdS d}| j |d  j
}| j |d | D ]"}|j
|kr|jtjkr|d7 }q|dkr| j |d  jtjkS |dkr
dS | j |d  jtv rD|d8 }| j | }|jtjkrDdS | j |d  jtjkr`dS dS )zIs this line a collection literal with a trailing comma that's optional?

        Note that the trailing comma in a 1-tuple is not optional.
        rT   Fr   rO  r   rB   T)r  r   r   r+   r  r  r  RPARr  	enumerater  COMMA)r\   ZcloserZclose_indexopenerZ_open_indexr  ZcommasZcomma_depthr=   r=   r>   *is_collection_with_optional_trailing_comma  s@    





z/Line.is_collection_with_optional_trailing_commac                 C   s   z| j d }W n ty"   Y dS 0 z| j d }W n tyH   d}Y n0 |jtjkr`|jdkp|jtjko|duo|jtjko|jdkS )zBIs this a function definition? (Also returns True for async defs.)r   FrB   Ndef)r  r[  r   r+   r  rv   ASYNC)r\   
first_leafZsecond_leafr=   r=   r>   is_def  s     

zLine.is_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.
        rT   rC   (rD   ))	rP   r   r  r  r   r+   LPARrv   r  r[   r=   r=   r>   r  /  s    zLine.is_class_paren_emptyc                 C   s,   t | o*| jd jtjko*| jd jdS )z#Is the line a triple quoted string?r   )"""''')rP   r  r   r+   STRINGrv   
startswithr[   r=   r=   r>   is_triple_quoted_string?  s
    zLine.is_triple_quoted_string)depth_limitrG   c                 C   s*   | j D ]}|jtkr|j|kr dS qdS )z)If so, needs to be split before emitting.TF)r  r   r{  r  )r\   r  r  r=   r=   r>   contains_standalone_commentsH  s    
z!Line.contains_standalone_commentsc                 C   s   t  }zR| jd }|t| |jtjks>|jtjkrV|jsV| jd }|t| W n t	yl   Y dS 0 d}| j
 D ]2\}}|D ]$}t|r||vs|r  dS d}qq|dS )Nr   rO  FT)r   r  r   r  r   r+   r  r  rv   r[  r  r   is_type_comment)r\   Zignored_ids	last_leafZcomment_seenZleaf_idr  commentr=   r=   r>   $contains_uncollapsable_type_commentsP  s*    


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r| j dd  D ].}| jt|g D ]}t|drf  dS qfqPdS )	NFc                 s   s   | ]}|j d kr|j V  qdS r   Nr_  rx   lr=   r=   r>   ry     r}   z9Line.contains_unsplittable_type_ignore.<locals>.<genexpr>r   c                 s   s   | ]}|j d kr|j V  qdS r  r  r  r=   r=   r>   ry     r}   rO  z ignoreT)r  nextreversedr  r   r  r  )r\   Z
first_line	last_linerb  r  r=   r=   r>   !contains_unsplittable_type_ignoreq  s    
z&Line.contains_unsplittable_type_ignorec                 C   s   | j D ]}t|r dS qdS )NTF)r  is_multiline_stringr  r=   r=   r>   contains_multiline_strings  s    
zLine.contains_multiline_strings)closingrG   c                 C   s   | j r| j d jtjksdS | j r| jrt| j dkr| j d jtjkr|jtv r| j d jtjkr| j d jdkst| j dkr| j d jdkr| j d jd	kst| j d
kr| j d jdkr| j d jd	kr|jtj	ksdS | 
  dS )z4Remove trailing comma if there is one and it's safe.r   FrT   importrV   ir  asrU   T)r  r   r+   r  r  r   r  r  rv   r  remove_trailing_comma)r\   r  r=   r=   r>   r    sB    	
z Line.maybe_remove_trailing_comma)r  rG   c                 C   s   |j tkr| j rd|_dS |j tjkr.dS | jsDt|_ d|_dS | jd }|j tjkr|j	s|j
rtt|j
 dkrt|st| jdk rt|_ d|_dS | jd }| jt|g | dS )z0Add an inline or standalone comment to the line.r   Fr   rD   rC   rO  T)r   r{  r  r  rv  r+   r  r  r  rv   parentr   rx  r  r  
setdefaultr  r	  )r\   r  r  r=   r=   r>   r    s<    



zLine.append_commentr  c                 C   s   | j t|g S )z;Generate comments that should appear directly after `leaf`.)r  r   r  r  r=   r=   r>   comments_after  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  r   r  r  r  extend)r\   Ztrailing_commaZtrailing_comma_commentsr=   r=   r>   r    s
    
zLine.remove_trailing_commac                 C   sj   | j  }|du rdS |j}t|trL|jtjkr6dS |jtjkrLt	||}|duoht
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 rH   )r   TEST_DESCENDANTSrx   nr=   r=   r>   ry     s   z,Line.is_complex_subscript.<locals>.<genexpr>)r  r  next_siblingr   r%   r   r\  	listmakersubscriptlistchild_towardsany	pre_order)r\   r  Z	open_lsqbZsubscript_startr=   r=   r>   r    s    


zLine.is_complex_subscriptc                 C   sz   | sdS d| j  }t| j}t|}|j | |j }|D ]}|t|7 }q<tj	| j
 D ]}|t|7 }q`|d S )zRender the line.rN  z    )r  iterr  r  rv  rv   ru   	itertoolschainfrom_iterabler  r  )r\   rw  r  firstresr  r  r=   r=   r>   __str__  s    

zLine.__str__c                 C   s   t | jp| jS )z/Return True if the line has leaves or comments.)rP   r  r  r[   r=   r=   r>   __bool__  s    zLine.__bool__)F)F)/r9   r:   r;   r<   r  r   r   r!   rx  r  r   r&   r  r  r   r  r  r  r  rP   r  r	  r  propertyr  r  r  r  r  r  r  r  r  r   maxsizer  r  r  r  r  r  r  r  r  ru   r  r  r=   r=   r=   r>   r1     sL   
>!%%c                   @   s   e Zd ZU dZdZeed< dZee	 ed< dZ
eed< eeZee ed< e	eeef d	d
dZe	eeef d	ddZe	eeeef dddZdS )rC  a{  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.
    Frs   Nprevious_liner   previous_afterprevious_defs)rK  rG   c                 C   s:   |  |\}}| jdu rdn|| j }|| _|| _||f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).
        Nr   )_maybe_empty_linesr  r  )r\   rK  rL  rJ  r=   r=   r>   rF  "  s    z"EmptyLineTracker.maybe_empty_linesc                 C   s  d}|j dkr| jrdnd}|jrJ|jd }|jd}t||}d|_nd}|j }| jr| jd |kr| j  | jr|rdnd}qT|rdnd}qT|js|j	s|j
r| ||S | jr| jjr|js|| jj kr|pddfS | jr| jj
r|jr|dfS |dfS )NrB   r   rC   rN  r   r   )r  rs   r  rv  countr   r  r   r  r  r  #_maybe_empty_lines_for_class_or_defr  r  r  )r\   rK  Zmax_allowedr  rL  r  r=   r=   r>   r  4  sD    




z#EmptyLineTracker._maybe_empty_lines)rK  rL  rG   c                 C   s   |j s| j|j | jd u r"dS | jj r.dS | jj|jk rP| jjsL| jjrPdS | jjrr| jj|jkrr|dkrrdS | jr| jj|jkrd}q|js| jjr|j	r| jj	rd}qd}q|jr| jjsd}qd}nd}|jr|r|d8 }|dfS )N)r   r   r   rB   rC   )
r  r  r	  r  r  r  r  r  rs   r  )r\   rK  rL  newlinesr=   r=   r>   r  [  sB    

z4EmptyLineTracker._maybe_empty_lines_for_class_or_def)r9   r:   r;   r<   rs   rP   r   r  r   r1   r  r   r!   rx  r  r   r   rF  r  r  r=   r=   r=   r>   rC    s   
(
rC  c                       sn  e Zd ZU dZdZeed< dZeed< ee	Z
e	ed< dZeed< d+eee	 d	d
dZeee	 d fddZeee	 dddZeee	 dddZeee ee ee	 dddZeee	 dddZeee	 dddZeee	 dddZeee	 dddZeee	 ddd Zeee	 dd!d"Zeee	 dd#d$Zeee	 dd%d&Zd'd(d)d*Z   Z!S ),rB  zGenerates 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.
    Frs   Tr8  rK  r7  r   )rw  rG   c                 c   s<   | j s| j  j|7  _dS | j }t|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  )rK  r  r1   )r\   rw  Zcomplete_liner=   r=   r>   rM    s    zLineGenerator.linera  c                 #   s   t |tr| jj }t|D ]f}|r4| j| q|jtj	kr\| j| | 
 E dH  q| 
 E dH  | j| | 
 E dH  qt||d | jr|jtjkrt|| jd t| |jtjkrt| |jtvr| j| t |E dH  dS )rk  Nr  )r7  )r   r&   rK  r  r  generate_commentsr	  r   r+   r  rM  normalize_prefixr8  r  normalize_string_prefixr7  normalize_string_quotesNUMBERnormalize_numeric_literal
WHITESPACEsuperrj  )r\   rb  r  r  	__class__r=   r>   rj    s(    

zLineGenerator.visit_defaultc                 c   s$   |  dE dH  | |E dH  dS )z/Increase indentation level, maybe yield a line.rB   NrM  rj  r\   rb  r=   r=   r>   visit_INDENT  s    zLineGenerator.visit_INDENTc                 c   s2   |   E dH  | |E dH  |  dE dH  dS )z/Decrease indentation level, maybe yield a line.Nr   r  r  r=   r=   r>   visit_DEDENT  s    zLineGenerator.visit_DEDENT)rb  keywordsparensrG   c                 c   sP   t ||d |jD ]8}|jtjk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_afterN)normalize_invisible_parensrl  r   r+   r  rv   rM  rD  )r\   rb  r"  r#  rn  r=   r=   r>   
visit_stmt  s
    
zLineGenerator.visit_stmtc                 c   s:   | j r&t|r&| |jd E dH  n| |E dH  dS )zVisit a suite.rC   N)rs   is_stub_suiterD  rl  rj  r  r=   r=   r>   visit_suite  s    zLineGenerator.visit_suitec                 c   s   |j o|j jtv }|rh| jr6t|r6| |E dH  q| dE dH  | |E dH  | dE dH  n4| jr~|j r~t|j s|  E dH  | |E dH  dS )z,Visit a statement without nested statements.NrB   r   )r  r   	STATEMENTrs   is_stub_bodyrj  rM  r'  )r\   rb  Zis_suite_liker=   r=   r>   visit_simple_stmt  s    zLineGenerator.visit_simple_stmtc                 c   sj   |   E dH  t|j}|D ]$}| |E dH  |jtjkr qBqt|}|jD ]}| |E dH  qPdS )z-Visit `async def`, `async for`, `async with`.N)rM  r  rl  rD  r   r+   r  r  )r\   rb  rl  rn  Zinternal_stmtr=   r=   r>   visit_async_stmt  s    

zLineGenerator.visit_async_stmtc                 c   s.   |j D ]"}|  E dH  | |E dH  qdS )zVisit decorators.N)rl  rM  rD  rm  r=   r=   r>   visit_decorators  s    
zLineGenerator.visit_decoratorsr  c                 c   s   |   E dH  dS )zBRemove a semicolon and put the other statement on a separate line.N)rM  r  r=   r=   r>   
visit_SEMI  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)rj  rM  r  r=   r=   r>   visit_ENDMARKER  s    zLineGenerator.visit_ENDMARKERc                 c   s.   | j j s|  E d H  | |E d H  d S rH   )rK  r  r  rM  rj  r  r=   r=   r>   visit_STANDALONE_COMMENT!  s    z&LineGenerator.visit_STANDALONE_COMMENTc                 c   s   |j \}}|jtjkrtt|j dkrt|j d jtjkrtttjd}ttj	d}|
 pXd}||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   rB   r  r  r   N)rl  r   r\  powerr   r+   
DOUBLESTARr&   r  r  removeinsert_childr%   atomrj  )r\   rb  	_operatoroperandlparrparindexr=   r=   r>   visit_factor&  s    

zLineGenerator.visit_factorNrY   c                 C   s   | 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| _t|dh|d| _	t|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| _dS )z,You are in a twisty little maze of passages.assertrt   )r"  r#  >   elseelififr?  r>  whiler=  r  r  >   finallytryr=  exceptrC  withr  r  rG   r  delN)r&  r   r   Zvisit_assert_stmtZvisit_if_stmtZvisit_while_stmtZvisit_for_stmtZvisit_try_stmtZvisit_except_clauseZvisit_with_stmtZvisit_funcdefZvisit_classdefASSIGNMENTSZvisit_expr_stmtZvisit_return_stmtZvisit_import_fromZvisit_del_stmtr,  Zvisit_async_funcdefr-  Zvisit_decorated)r\   r{      Ør=   r=   r>   __attrs_post_init__7  s*    
z!LineGenerator.__attrs_post_init__)r   )"r9   r:   r;   r<   rs   rP   r   r8  r!   r1   rK  r7  r   r   rM  ro  rj  r%   r   r!  r   ru   r&  r(  r+  r,  r-  r&   r.  r/  r0  r;  rH  __classcell__r=   r=   r  r>   rB    s*   
rB  )r  r  rG   c                C   sJ  d}d}d}| j }| j}| j}|tv r*|S |tjkr8|S |dusNJ d| |tjkrr|j tjtj	tj
hvrr|S | j}|st|}	|	r|	j tv r|S |tjkr|	j tjkr|S |	j tjkr|s|S |S |	j tjkr|	jr|	jj tjtjtjtjhv r|S |	jj tjkr|	jS n|	j tv r>t|	ttB dr|S n|	j tjkrz|	jr|	jj tjtj
hv r|rt|S |S nx|	jr|	jj tjkr|	j tv r|S |	j tjkr|	jr|	jj tjkr|	jr|	jj tjkr|	jjdkr|S n|j tv r|S |j tjtjhv r4|r,|j tjkrF|S n|j tjkr^|rF|j tjkrF|S n|j tjkr|sv|S |tjkr|j tjkr|S n&|j tjkr|jS |j tjkrF|S n|j tjkr|sFt|}	|	r|	j tjkrF|S nN|j tj kr~|tj!ks|tj"kr"|S |sh|tj#krVt|}	|	rP|	j tj$krf|S n|tj%krz|S n|j tjkrF|S n|j tjkr|tjkr|S |st|}	|	r|	j tj!kr|S n|j tjhtB v rF|S nf|j tj&kr|S |j tj'kr<|r
|S t|}	|	r4|	j tj(ks4|	j tj#krF|S n
|j tj)krv|tj!krZ|S |rF|j tj!krF|S n|j tjtj
hv r|s|jdusJ d|jj tj	kr|S |S |sF|S n||j tj*kr|rF|tj#krF|S nT|j tj+kr|rF|j tj,krF|S n*|j tjtj-hv r|st|}	|	rP|	j tv rT|S |	j}
|
dushJ |	j tjkr|
j tjtj
hv r|S |	j tjkr|
j tjkr|S n|tjtj$tj.hv rF|S nz|j tj/kr4|tj#kr |r2|j tj#kr2|S n2|tjkrF|d	kr|S |rF|j tj#krF|S n|j tj
krF|S |S )
zReturn whitespace prefix if needed for the given `leaf`.

    `complex_subscript` signals whether the given leaf is part of a subscription
    which has non-trivial arguments, like arithmetic expressions or function calls.
    r   rr    Nz/INTERNAL ERROR: hand-made leaf without parent: withinr   zsubscripts are always parentedr  )0r   r  rv   ALWAYS_NO_SPACEr+   r  r  r\  Z	subscriptr  Zsliceopprev_siblingpreceding_leafr  r  EQUALarglistargument
parametersvarargslisttypedargslistrv  VARARGS_SPECIALS	is_varargVARARGS_PARENTSUNPACKING_PARENTSfactorMATH_OPERATORS
RIGHTSHIFT
shift_exprr  Ztnametrailerr  r  r  r  LSQB	decoratordotted_namer  classdefr5  dictsetmakerr2  	star_exprr  import_from)r  r  rN   ZSPACEZDOUBLESPACEtr   r{   prevZprevpZprevp_parentr=   r=   r>   r  X  sH   



	"
r  c                 C   sP   | rL| j }|rDt|tr|S zt| d W S  tyB   Y dS 0 | j} q dS )z3Return the first leaf that precedes `node`, if any.r   N)rN  r   r&   rx  r  r[  r  )rb  r  r=   r=   r>   rO  >  s    
rO  )ancestor
descendantrG   c                 C   s   |}|r|j | kr|j }q|S )z:Return the child of `ancestor` that contains `descendant`.r  )rh  ri  rb  r=   r=   r>   r  P  s    r  r  c                 C   s`   | j }| }|r\|j}|du rq\|jd j |kr0q\|jtjkr>q\|jdurV|jjtv rVq\|}q
|S )zReturn `leaf` or one of its ancestors that is the topmost container of it.

    By "container" we mean a node where `leaf` is the very first child.
    Nr   )rv  r  rl  r   r\  r]  rN  r  )r  Zsame_prefix	containerr  r=   r=   r>   container_ofX  s    rl  )r  r  rG   c                 C   s   | j tjkrtS dS )zReturn the priority of the `leaf` delimiter, given a line break after it.

    The delimiter priorities returned here are from those delimiters that would
    cause a line break after themselves.

    Higher numbers are higher priority.
    r   )r   r+   r  COMMA_PRIORITYr  r  r=   r=   r>   r  q  s    r  c                 C   s8  t | ttB drdS | jtjkrP| jrP| jjtjtj	hvrP|du sL|jt
v rPtS | jtv r~| jr~| jjtjtjhvr~t| j S | jtv rtS | jtjkr|dur|jtjkrtS | jtjtjhvrdS | jdkr| jr| jjtjtjhv s| jtjkrt| jtr| jjdkrtS | jdkrF| jrF| jjtjtjhv rFtS | jdv rn| jrn| jjtjkrnt S | jdkr~tS | jd	kr| jr| jjtj!tj"hv r|dur|jtjkr|jd
kstS | jd
kr| jr| jjtj!kr|dur|jtjkr|jdkstS | jt#v r4| jr4t$S dS )zReturn the priority of the `leaf` delimiter, given a line break before it.

    The delimiter priorities returned here are from those delimiters that would
    cause a line break before themselves.

    Higher numbers are higher priority.
    rK  r   Nr  asyncr?  >   r=  r?  isr  not)%rW  rX  rY  r   r+   r  r  r\  re  ra  r  DOT_PRIORITYr[  rZ  rd  MATH_PRIORITIESCOMPARATORSCOMPARATOR_PRIORITYr  STRING_PRIORITYr  r  rv   Zcomp_forZold_comp_forr   rN  r&   COMPREHENSION_PRIORITYZcomp_ifZold_comp_iftestTERNARY_PRIORITYZcomp_op
comparisonLOGIC_OPERATORSLOGIC_PRIORITYrn  r=   r=   r>   r    s    







$



r  >   z	# fmt:offz# yapf: disablez
# fmt: off>   z	# fmt: onz# yapf: enablez# fmt:onc                 c   s:   t | j| jtjkdD ]}t|j|jd|j dV  qdS )a  Clean the prefix of the `leaf` and generate comments from it, if any.

    Comments in lib2to3 are shoved into the whitespace prefix.  This happens
    in `pgen2/driver.py:Driver.parse_tokens()`.  This was a brilliant implementation
    move because it does away with modifying the grammar to include all the
    possible places in which comments can be placed.

    The sad consequence for us though is that comments don't "belong" anywhere.
    This is why this function generates simple parentless Leaf objects for
    comments.  We simply don't know what the correct parent should be.

    No matter though, we can live without this.  We really only need to
    differentiate between inline and standalone comments.  The latter don't
    share the line with any code.

    Inline comments are emitted as regular token.COMMENT leaves.  Standalone
    are emitted with a fake STANDALONE_COMMENT token identifier.
    is_endmarkerrN  rv  N)list_commentsrv  r   r+   	ENDMARKERr&   rv   r  )r  pcr=   r=   r>   r    s    r  c                   @   s2   e Zd ZU dZeed< eed< eed< eed< dS )ProtoCommenta  Describes a piece of syntax that is a comment.

    It's not a :class:`blib2to3.pytree.Leaf` so that:

    * it can be cached (`Leaf` objects should not be reused more than once as
      they store their lineno, column, prefix, and parent information);
    * `newlines` and `consumed` fields are kept separate from the `value`. This
      simplifies handling of special marker comments like ``# fmt: off/on``.
    r   rv   r  consumedN)r9   r:   r;   r<   r   r   ru   r=   r=   r=   r>   r    s
   

r  i   )r
  )rv  r~  rG   c          
   	   C   s   g }| rd| vr|S d}d}d}t | dD ]\}}|t|d 7 }| }|sZ|d7 }|dsx|dr.|d7 }q.||kr|stj}nt}t	|}	|
t||	||d d}q.|S )zNReturn a list of :class:`ProtoComment` objects parsed from the given `prefix`.#r   rN  rB   \)r   rv   r  r  )r  splitr   r>  r  endswithr+   r  r{  make_commentr	  r  )
rv  r~  r  r  ZnlinesZignored_linesr:  rM  Zcomment_typer  r=   r=   r>   r  	  s4    

r  )contentrG   c                 C   sH   |   } | sdS | d dkr(| dd } | r@| d dvr@d|  } d|  S )a  Return a consistently formatted comment from the given `content` string.

    All comments (except for "##", "#!", "#:", '#'", "#%%") should have a single
    space between the hash sign and the content.

    If `content` didn't start with a hash sign, one is provided.
    r  r   rB   Nz !:#'%rr  )rstrip)r  r=   r=   r>   r  1	  s    r  )rM  rq   innerr<  rG   c           
   
   #   s  | j r| V  dS t| d}|  sR| jsR| jsRt|  |dsH|  rR| V  dS | jr`t	g}n6t
tt tt
 d fdd}| jrtt|g}n|g}|D ]t}g }zD|| |D ]4}	t|	d|krtd|t|	 d|d	 qW n ty   Y qY q0 |E dH   qq| V  dS )
a  Split a `line` into potentially many lines.

    They should fit in the allotted `line_length` but might not be able to.
    `inner` signifies that there were a pair of brackets somewhere around the
    current `line`, possibly transitively. This means we can fallback to splitting
    by delimiters if the LHS/RHS don't yield any results.

    `features` are syntactical features that may be used in the output.
    NrN  )rq   line_strrM  r<  rG   c                 3   s\   t |  D ]8}tt|  ||d}t|d  dr
|E d H   d S q
t| d|dE d H  d S )N)omitr   rq   rB   r;  )generate_trailers_to_omitrx  right_hand_splitis_line_short_enough)rM  r<  r  rH  r  r=   r>   rhsj	  s    
zsplit_line.<locals>.rhsz+Split function returned an unchanged resultT)rq   r  r<  )r  ru   r4  r  r  r  r  r  r  left_hand_splitr1   r   r2   r   r  delimiter_splitstandalone_comment_splitr?   r  rG  )
rM  rq   r  r<  r  Zsplit_funcsr  
split_funcr  r  r=   r  r>   rG  D	  sL    	


rG  r  c                 c   s   g }g }g }|}d}| j D ]P}||u rF|jtv rF|j|u rF|rB|n|}|| ||u r|jtv r|}|}q|sxtdt|| |}t|| |dd}	t|| |}
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.
    NNo brackets foundTis_body)	r  r   r  r  r	  r  r?   bracket_split_build_line bracket_split_succeeded_or_raise)rM  r<  tail_leavesbody_leaveshead_leavescurrent_leavesZmatching_bracketr  headbodytailr  r=   r=   r>   r  	  s6    


r  )rM  rq   r<  r  rG   c                 c   s  g }g }g }|}d}d}	t | jD ]V}
||u rB|
|u rB|r>|n|}||
 ||u r"|
jtv r"t|
|vr"|
j}|
}	|}q"|r|	r|std|  |  |  t	|| |}t	|| |dd}t	|| |}t
||| |js|jtjkr|js|	jtjkr|	js| js|dst||rt|	h|}zt| |||dE dH  W dS  ty   t|st||dstdn| s| rtd	Y n0 t| t|	 |||fD ]}|r|V  qd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`.
    Nr  Tr  r   )r<  r  r  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  r  r	  r   r  r  r  r?   reverser  r  r  r+   r  rv   r  r  r  can_omit_invisible_parensr  can_be_splitr  r  ensure_visible)rM  rq   r<  r  r  r  r  r  r  closing_bracketr  r  r  r  r  r=   r=   r>   r  	  s|    




r  )r  r  r  rG   c                 C   sB   t t| }|s>|dkr&tdn|dk r>td| d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 linerD   z,Splitting brackets on an empty body to save z characters is not worth itN)r   ru   r4  r?   )r  r  r  Ztail_lenr=   r=   r>   r  
  s    
r  r  )r  originalr  r  rG   c          	      C   s  t |jd}|rd|_| jd7  _| rt| d dd |joZ|jdkoZtdd | D  }|jsf|rtt	| d d	d	D ]@}| | j
tkrqz| | j
tjkr| |d ttjd
  qqz| D ]0}|j|dd ||D ]}|j|dd qq|rt|||_|S )zReturn a new line with given `leaves` and respective comments from `original`.

    If `is_body` is True, 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  TrB   r   r  r  c                 s   s   | ]}|j tjkV  qd S rH   )r   r+   r  r  r=   r=   r>   ry   A
  r}   z+bracket_split_build_line.<locals>.<genexpr>r   rt   r  )r1   r  r  r  r  rv   r  r  rE  r   r   r{  r+   r  insertr&   r	  r  r  )	r  r  r  r  r  Z	no_commasir  comment_afterr=   r=   r>   r  -
  s2    
r  )r  rG   c                    s,   t  dttt tt d 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.
    r=   r  c                 3   s,    | |D ]}t |jd dd |V  q
d S )Nr   Tr  )r  r  )rM  r<  r  r  r=   r>   split_wrapper]
  s    z0dont_increase_indentation.<locals>.split_wrapper)r=   )r	   r1   r   r2   r   )r  r  r=   r  r>   dont_increase_indentationW
  s    "r  c                 #   s  zj d }W n ty(   tdY n0 j}z|jt|hd}W n ty`   tdY n0 |tkr||dkrtdt	j
jd tj}d}ttt	 d	 fd
d}j D ]}||E dH  |D ]}	||	E dH  qt||j}|j|krLt|tjhdr&|o"tj|v }n&t|tjtjhdrL|oJtj|v }|jt|}
|
|kr V  t	j
jd q r|r|tkrʈ j d jtj krʈ j d jt!krʈ "ttj d  V  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 emptyr  zNo delimiters foundrB   z7Splitting a single attribute from its owner looks wrongr  r  Tr  c                 3   sJ   z j | dd W n2 tyD    V  tjjd  |  Y n0 dS zEAppend `leaf` to current line or to new line if appending impossible.Tr  r  Nr  r  r1   r  r  r	  r  rK  rM  r=   r>   append_to_line
  s    z'delimiter_split.<locals>.append_to_lineNrK  rt   )#r  r[  r?   r  r  r  r  rr  r  r1   r  r  r   r
  r&   r   r  r   r  rW  r\  rU  r2   ri   rQ  rR  rh   r  r   rm  r   r+   r  r{  r	  )rM  r<  r  btZdelimiter_priorityZlowest_depthZtrailing_comma_safer  r  r  Zleaf_priorityr=   r  r>   r  f
  sV    
r  c                 #   s    dstdtjjd ttt d fdd}jD ]0}||E dH  |D ]}||E dH  q^qB r~ V  dS )z4Split standalone comments from the rest of the line.r   z*Line does not have any standalone commentsr  r  c                 3   sJ   z j | dd W n2 tyD    V  tjjd  |  Y n0 dS r  r  r  r  r=   r>   r  
  s    z0standalone_comment_split.<locals>.append_to_lineN)	r  r?   r1   r  r  r&   r   r  r  )rM  r<  r  r  r  r=   r  r>   r  
  s    

r  c                 C   sP   | j }| j}| j}t|tjkoL|dkr6|r6|jtjkpL|dkoL|oL|jtjkS )z9Return True if the given leaf starts an import statement.r  from)	r  r   rv   rP   r+   r  r\  Zimport_namere  )r  r   rf  r{   r=   r=   r>   r  
  s    
r  r   )r  r  rG   c                 C   s(   | j }| j}|tjthv o&|d| S )zdReturn True if the given leaf is a special comment.
    Only returns true for type comments for now.z# type:)r   rv   r+   r  r{  r  )r  r  rf  r{   r=   r=   r>   r  
  s    r  )r  r  rG   c                C   sV   |sL| j d}d|d vrL|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   rN  rB   Nr   )rv  r  r  r   )r  r  ZsplZnl_countr=   r=   r>   r  
  s    
r  )r  r7  rG   c                 C   sd   t d| jt j}|dus*J d| j|d}| }|rL|dd}| |d | _dS )zMake all string prefixes lowercase.

    If remove_u_prefix is given, also removes any u prefix from the string.

    Note: Mutates its argument.
    z^([furbFURB]*)(.*)$Nzfailed to match string rB   ur   rC   )r   matchrv   DOTALLgroupr   r   )r  r7  r  Zorig_prefixZ
new_prefixr=   r=   r>   r  
  s    
r  c                 C   s  | j d}|dd dkr dS |dd dkr:d}d}n|d dkrPd}d}nd}d}| j |}|d	krpdS | j d| }td
| }td| }td| }| j |t| t|  }	d| v r||	rdS |	}
nZt|d| |	}
|	|
kr |
}	| | |	 | | _ t|d| |
}
t|d| |
}
d| v rt	d|
tj
}|D ]}dt|v rf dS qf|dkr|
d	d dkr|
dd	 d }
|	d}|
d}||krdS ||kr|dkrdS | | |
 | | _ dS )zPrefer double quotes but only if it doesn't cause more escaping.

    Adds or removes backslashes as appropriate. Doesn't parse and fix
    strings nested in f-strings (yet).

    Note: Mutates its argument.
    furbFURBNrD   r  r  r   "'r   z(([^\\]|^)(\\\\)*)z([^\\]|^)\\((?:\\\\)*)rz\1\2z\1\\r.  z
            (?:[^{]|^)\{  # start of the string or a non-{ followed by a single {
                ([^{].*?)  # contents of the brackets except if begins with {{
            \}(?:[^}]|$)  # A } followed by end of the string or a non-}
            r  z\")rv   r>  findr   compiler   casefoldsearch	sub_twicefindallVERBOSEru   r  )r  rv   Z
orig_quoteZ	new_quoteZfirst_quote_posrv  Zunescaped_new_quoteZescaped_new_quoteZescaped_orig_quoter  Znew_bodymatchesmZorig_escape_countZnew_escape_countr=   r=   r>   r    s^    

	



r  c                 C   s  | j  }|drn|drL|dd |dd  }}| |  }nd|v r|d\}}d}|dr|dd }d}n|d	r|dd }t|}| d| | }nD|d
r|dd }|d }|dkrd}t| | }nt|}|| _ dS )zNormalizes numeric (float, int, and complex) literals.

    All letters used in the representation are normalized to lowercase (except
    in Python 2 long literals).
    )Z0oZ0b0xNrC   r   r   r   rB   +)jr  r   r  L)rv   r   r  r   r  format_float_or_int_stringr  )r  textrL  rJ  signZnumberr  r=   r=   r>   r  O  s0    





r  )r  rG   c                 C   s0   d| vr| S |  d\}}|p d d|p*d S )z"Formats a float string like "1.0".r   r   )r  )r  rL  rJ  r=   r=   r>   r  s  s    r  )rb  r$  rG   c                 C   s\  t | jddD ]}|jtv r dS qd}tt| jD ]\}}|dkrbt|trb|j	t
jkrbd}|r@t|rrq6|j	t
jkrt|| drt| |dd nt|rt| |dd n| j	t
jkr|j	tjkrd|_d| jd	 _n4|j	tjkr| |ttjd | ttjd  qXn$t|tr2t|s@t| |dd t|toT|j|v }q6d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.
    Fr}  Nr   Trj  visibler   r   )r  rv  rv   FMT_OFFr  rx  rl  r   r%   r   r\  testlist_star_expris_walrus_assignmentr5  #maybe_make_parens_invisible_in_atomwrap_in_parenthesesis_one_tuplere  r+   r  STARr4  r&   Zappend_childr  r  )rb  r$  r  Z
check_lparr:  rn  r=   r=   r>   r%  |  s>    	

r%  c                 C   s   d}|rt | }qdS )zJConvert content between `# fmt: off`/`# fmt: on` into standalone comments.TN)convert_one_fmt_off_pair)rb  Z	try_againr=   r=   r>   rA    s    rA  c                 C   s@  |   D ]0}d}t|jddD ]}|jtv r2|jtkrTt|}|rT|jtvrTq t	t
|}|sfq |d }|j}|j}||jd |_|jd ddd |D  }	|	dr|	dd	 }	d}
|D ]}| }|
du r|}
q|dusJ d
|
dusJ d||
tt|	|d| d|j  d   dS |j}q qdS )zConvert content of a single `# fmt: off`/`# fmt: on` into a standalone comment.

    Returns True if a pair was converted.
    r   Fr}  NrN  r   c                 s   s   | ]}t |V  qd S rH   rc  r  r=   r=   r>   ry     r}   z+convert_one_fmt_off_pair.<locals>.<genexpr>r   z(INTERNAL ERROR: fmt: on/off handling (1)z(INTERNAL ERROR: fmt: on/off handling (2)r  T)r  r  rv  rv   r  r   r{  rO  r  rx  generate_ignored_nodesr  r  r   r  r3  r4  r&   r  )rb  r  Zprevious_consumedr  rg  Zignored_nodesr  r  rv  Zhidden_valueZ	first_idxZignoredr:  r=   r=   r>   r    sJ    


r  c                 c   sl   t | }|durh|jtjkrhd}t|jddD ]"}|jtv rBd}q.|jtv r.d}q.|rZdS |V  |j	}qdS )zvStarting from the container of `leaf`, generate all leaves until `# fmt: on`.

    Stops at the end of the block.
    NFr}  T)
rl  r   r+   r  r  rv  rv   FMT_ONr  r  )r  rk  Z	is_fmt_onr  r=   r=   r>   r    s    

r  )rb  r  rG   c                 C   s   | j tjks<t| s<t| s<t| r0|j tjks<t| tkr@dS | j	d }| j	d }|j t
jkr|j t
jkr| j	d }d|_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   rB   r   rj  T)r   r\  r5  is_empty_tupler  is_yieldZ	expr_stmtmax_delimiter_priority_in_atomrm  rl  r+   r  r  rv   r  is_atom_with_invisible_parensr   )rb  r  r  lastZmiddler=   r=   r>   r    s0    	





r  c                 C   sp   t | ts| jtjkrdS | jd | jd  }}t |ton|jtjkon|jdkont |ton|jtj	kon|jdkS )zGiven a `LN`, determines whether it's an atom `node` with invisible
    parens. Useful in dedupe-ing and normalizing parens.
    Fr   r   r   )
r   r&   r   r\  r5  rl  r+   r  rv   r  )rb  r  r  r=   r=   r>   r  %  s    


r  c                 C   s>   | j tjko<t| jdko<| jd j tjko<| jd j tjkS )z+Return True if `node` holds an empty tuple.rC   r   rB   )r   r\  r5  r   rl  r+   r  r  rb  r=   r=   r>   r  7  s    r  c                 C   s>   t | jdkrdS | j\}}}|jtjkr6|jtjks:dS |S )zqReturns `wrapped` if `node` is of the shape ( wrapped ).

    Parenthesis can be optional. Returns None otherwiserD   N)r   rl  r   r+   r  r  )rb  r8  wrappedr9  r=   r=   r>   unwrap_singleton_parenthesisA  s    r  r  )r  rn  r  rG   c                C   sh   t tj|rdnd}t tj|r"dnd}|j}d|_| p>d}ttj|||g}||_| 	|| dS )zWrap `child` in parentheses.

    This replaces `child` with an atom holding the parentheses and the old
    child.  That requires moving the prefix.

    If `visible` is False, the leaves will be valueless (and thus invisible).
    r  r   r  r   N)
r&   r+   r  r  rv  r3  r%   r\  r5  r4  )r  rn  r  r8  r9  rv  r:  	new_childr=   r=   r>   r  O  s    r  c                 C   sv   | j tjkrLt| }|du s(|j tjkr,dS t|jdkoJ|jd j tjkS | j t	v ott| jdkot| jd j tjkS )zMReturn True if `node` holds a tuple with one element, with or without parens.NFrC   rB   )
r   r\  r5  r  testlist_gexpr   rl  r+   r  IMPLICIT_TUPLE)rb  Zgexpr=   r=   r>   r  a  s     
r  c                 C   s   t | }|duo|jtjkS )z7Return True iff `node` is of the shape ( test := test )N)r  r   r\  Znamedexpr_test)rb  r  r=   r=   r>   r  q  s    r  c                 C   s|   | j tjkrdS | j tjkr*| jdkr*dS | j tjkr:dS t| jdkrLdS | j\}}}|j tj	krx|j tj
krxt|S dS )zAReturn True if `node` holds a `yield` or `yield from` expression.TyieldFrD   )r   r\  Z
yield_exprr+   r  rv   r5  r   rl  r  r  r  )rb  r8  exprr9  r=   r=   r>   r  w  s    r  )r  rL  rG   c                 C   s@   | j tvs| jsdS | j}|j tjkr6|js0dS |j}|j |v S )aF  Return True if `leaf` is a star or double star in a vararg or kwarg.

    If `within` includes VARARGS_PARENTS, this applies to function signatures.
    If `within` includes UNPACKING_PARENTS, it applies to right hand-side
    extended iterable unpacking (PEP 3132) and additional unpacking
    generalizations (PEP 448).
    F)r   rV  r  r\  rd  )r  rL  r   r=   r=   r>   rW    s    rW  c                 C   s$   | j d}|dd dv o"d|v S )zKReturn True if `leaf` is a multiline string that actually spans many lines.r  NrD   >   r  r  rN  )rv   r>  )r  rv   r=   r=   r>   r    s    r  c                 C   sV   t | jdksD| jd jtjksD| jd jtjksD| jd jtjkrHdS t| jd S )z2Return True if `node` is a suite with a stub body.rT   r   rB   rD   FrC   )r   rl  r   r+   NEWLINEINDENTDEDENTr*  r  r=   r=   r>   r'    s    r'  c                 C   sd   t | tr| jtjkrdS t| jdkr,dS | jd }|jtjkobt|jdkobtdd |jD S )zCReturn True if `node` is a simple statement containing an ellipsis.FrC   r   rD   c                 s   s   | ]}|t tjd kV  qdS )r   Nr  )rx   r  r=   r=   r>   ry     r}   zis_stub_body.<locals>.<genexpr>)	r   r%   r   r\  simple_stmtr   rl  r5  r   )rb  rn  r=   r=   r>   r*    s    
r*  c                 C   s   | j tjkrdS | jd }| jd }|j tjkr<|j tjks@dS t }| jdd D ]2}t|t	rn|
| qT| D ]}|
| qvqTz
| W S  ty   Y dS 0 dS )zReturn maximum delimiter priority inside `node`.

    This is specific to atoms with contents contained in a pair of parentheses.
    If `node` isn't an atom or there are no enclosing parentheses, returns 0.
    r   r   rB   N)r   r\  r5  rl  r+   r  r  r  r   r&   r  r  r  r  )rb  r  r  r  r   r  r=   r=   r>   r    s     



r  c                 C   s*   | j tjkrd| _n| j tjkr&d| _dS )zMake sure parentheses are visible.

    They could be invisible as part of some statements (see
    :func:`normalize_invisible_parens` and :func:`visit_import_from`).
    r  r  N)r   r+   r  rv   r  r  r=   r=   r>   r    s    r  )rM  r  rG   c              	   C   s   |j r$|j jtjtjhv r$|jdv s(dS z8| jd }|jtjkrJt	|hnt
 }| jj|d}W n ttfyx   Y dS 0 |tkS )zFShould `line` immediately be split with `delimiter_split()` after RHS?z[{(Fr   r  )r  r   r\  r5  re  rv   r  r+   r  r  r   r  r  r[  r  rm  )rM  r  r  r   max_priorityr=   r=   r>   r    s    
r  c                 C   sV  t  }|  D ]@}|jtjkrD|jdd }|dv rB|tj q|jtj	krhd|jv rf|tj
 q|jtjkr|jr|jjtjtjhv r|tj q|jtjkr|tj q|jtjtjhv r|jr|jd jtjkr|jtjkrtj}ntj}|jD ]N}|jtv r|| |jtjkr |jD ]}|jtv r.|| q.q q|S )a&  Return a set of (relatively) new Python features used in this file.

    Currently looking for:
    - f-strings;
    - underscores in numeric literals;
    - trailing commas after * or ** in function signatures and calls;
    - positional only arguments in function signatures and lambdas;
    NrC   >   zf"ZRFzF'frzf'ZFRZrfzF"r   r   )r   r   r   r+   r  rv   r   r2   rf   r  rg   SLASHr  r\  rU  rQ  rm   
COLONEQUALrl   rl  r  ri   rh   STARSrR  )rb  r<  r  Z
value_headr   ZchZargchr=   r=   r>   get_features_used  s>    	



r  c                    s   t |   fddtD S )z5Detect the version to target based on the nodes used.c                    s   h | ]} t | kr|qS r=   r   rw   r<  r=   r>   r:  6  s   z)detect_target_versions.<locals>.<setcomp>)r  rS   r  r=   r  r>   r@  3  s    
r@  )rM  rq   rG   c                 c   s   t  }|V  d| j }d}d}t  }t| ddD ]\}}}	||	7 }||krP q|	t|jt|j k}
|jtksv|
r| q|r||u rd}n|jtv r|	t
| q0|jtv r0|dkr| j|d  jtv r|	t
| q0|r
|	t
| || |  |V  |jr0|j}|}q0d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.
    rT   NT)r  r   rB   )r   r  enumerate_with_lengthr   rv   rv  r   r{  r  r   r  r  r  r   clearr  )rM  rq   r  lengthr  r  Zinner_bracketsr:  r  leaf_lengthZhas_inline_commentr=   r=   r>   r  ;  s<    




r  c                    s   t  }tt ttddf d fdd | jD ]}|jtjkrB q|jd }t	|t
rt|jdkr|jtjkr|jd jtjkrq. qq.|jtjkr|jd }t	|t
r|jdkr q|t  |jd	d O }q. qq.|S )
z/Return a set of __future__ imports in the file.N)rl  rG   c                 3   s   | D ]}t |tr(|jtjkr|jV  q|jtjkrn|jd }t |tsPJ d|jtjksdJ d|jV  q|jtj	kr |jE d H  qt
dqd S )Nr   zInvalid syntax parsing imports)r   r&   r   r+   r  rv   r\  Zimport_as_namerl  Zimport_as_namesAssertionError)rl  rn  Z	orig_nameget_imports_from_childrenr=   r>   r  q  s    



z5get_future_imports.<locals>.get_imports_from_childrenr   rC   rB   Z
__future__rD   )r   r   ro  r   ru   rl  r   r\  r  r   r&   r   r+   r  r  re  rv   )rb  Zimportsrn  Zfirst_childZmodule_namer=   r  r>   r?  m  s,    "




r?  )r   rG   c                 C   sP   | d }g }|  rD| }| }W d   n1 s:0    Y  td|S )z9 Return a PathSpec matching gitignore content if present.z
.gitignoreNZgitwildmatch)r   r  	readlinesr$   Z
from_lines)r   	gitignorerH  Zgfr=   r=   r>   r     s    
&r   )r   r   r   r   r   r  rG   c                 c   sN  |  sJ d| |  D ](}|| r@||d qzd| |  }W nr ty } z*||d|  W Y d}~qW Y d}~n:d}~0  ty   |	 r||d|  Y q Y n0 |
 r|d7 }||}	|	r|	dr||d q|
 r,t||||||E dH  q| r||}
|
r|V  qdS )	a  Generate all files under `path` whose paths are not excluded by the
    `exclude` regex, but are included by the `include` regex.

    Symbolic links pointing outside of the `root` directory are ignored.

    `report` is where output about exclusions goes.
    z/INTERNAL ERROR: `root` must be absolute but is z#matches the .gitignore file contentrt  zcannot be read because Nz'is a symbolic link that points outside r   z(matches the --exclude regular expression)is_absoluteiterdirZ
match_fileas_posixpath_ignoredr   relative_tor   r  
is_symlinkr   r  r  r   r   )r   r   r   r   r   r  rn  Znormalized_pathr   Zexclude_matchZinclude_matchr=   r=   r>   r     s>     



r   )srcsrG   c                 C   s~   | st d S tdd | D }| r2|d }|jD ]@}|d  rP|  S |d  rd|  S |d  r8|  S q8|S )a)  Return a directory containing .git, .hg, or pyproject.toml.

    That directory can be one of the directories passed in `srcs` or their
    common parent.

    If no directory in the tree contains a marker that would specify it's the
    project root, the root of the file system is returned.
    rt  c                 s   s   | ]}t | V  qd S rH   )r   r   r   r=   r=   r>   ry     r}   z$find_project_root.<locals>.<genexpr>z	fake-filez.gitz.hgr   )r   r   r   r   parentsr   )r  Zcommon_baseZ	directoryr=   r=   r>   r     s    


r   c                   @   s   e Zd ZU dZdZeed< dZeed< dZeed< dZ	e
ed< dZe
ed< dZe
ed	< eed
dddZeed
dddZeed
dddZee
dddZedddZd
S )r   zDProvides a reformatting counter. Can be rendered with `str(report)`.FrE   r   r   r   change_count
same_countfailure_countN)r   r   rG   c                 C   s   |t ju rF| jrdnd}| js$| js6t| d|  |  jd7  _n@| jrx|t ju rb| d}n
| d}t|dd |  jd7  _d	S )
zGIncrement the counter for successful reformatting. Write out a message.zwould reformatreformattedrr  rB   z" already well formatted, good job.z( wasn't modified on disk since last run.Fr3   N)	rQ   rK   rE   r   r   r   r  rN   r  )r\   r   r   r	  msgr=   r=   r>   r     s    


zReport.done)r   messagerG   c                 C   s&   t d| d|  |  jd7  _dS )zCIncrement the counter for failed reformatting. Write out a message.zerror: cannot format rX  rB   N)r4   r  )r\   r   r  r=   r=   r>   r     s    zReport.failed)r   r  rG   c                 C   s    | j rt| d| dd d S )Nz
 ignored: Fr
  )r   r   )r\   r   r  r=   r=   r>   r  !  s    zReport.path_ignoredrY   c                 C   s   | j r
dS | jr| jrdS dS )a  Return the exit code that the app should use.

        This considers the current state of changed files and failures:
        - if there were any failures, return 123;
        - if any files were changed and --check is being used, return 1;
        - otherwise return 0.
        {   rB   r   )r  r  rE   r[   r=   r=   r>   r   %  s
    zReport.return_codec                 C   s   | j rd}d}d}nd}d}d}g }| jrb| jdkr8dnd	}|tj| j d
| d| dd | jr| jdkrvdnd	}|| j d
| d|  | jr| jdkrdnd	}|tj| j d
| d| dd d|d S )zcRender a color report of the current state.

        Use `click.unstyle` to remove colors.
        zwould be reformattedzwould be left unchangedzwould fail to reformatr	  zleft unchangedzfailed to reformatrB   r   r   z filerr  Tr
  r5   rs  z, r   )rE   r  r	  r   Zstyler  r  r   )r\   r	  Z	unchangedr   r   r   r=   r=   r>   r  8  s,    zReport.__str__)r9   r:   r;   r<   rE   rP   r   r   r   r  r   r  r  r   rQ   r   ru   r   r  r	  r   r  r=   r=   r=   r>   r     s   
c              	   C   s   d}t jdkrZtt jd ddD ]6}ztj| |d|fdW   S  tyT   Y q Y q 0 q n8dD ]2}ztj| ||dW   S  ty   Y q^Y q^0 q^t| S )	Nz	<unknown>rD   rX   rB   rT   r   rD   )feature_version)rW   rV   )r   version_inforE  astparseSyntaxErrorr"   r#   )r   r   minor_versionr  r=   r=   r>   	parse_astV  s    
r  c                 C   st   t | tjtjtjtjtjfr,tj| jdS t | tjtjtjfrPtj| j	dS t | tj
tj
frptj| jdS | S )z,Map ast nodes deprecated in 3.8 to Constant.rz   )r   r  ZStrr"   r#   ZBytesZConstantr   ZNumr  ZNameConstantrv   r  r=   r=   r>   _fixup_ast_constantsi  s    r  )r   r3  rG   c              
      s  dt tjtjtjf ttt d fdd zt| }W n2 t	yj } zt
d| W Y d}~n
d}~0 0 zt|}W nR t	y } z:tdt|j|}t
d| d	| dW Y d}~n
d}~0 0 d
 |}d
 |}||krtt||dd}t
d| ddS )z:Raise AssertionError if `src` and `dst` aren't equivalent.r   )rb  r  rG   c              	   3   s  t | } d|  | jj dV  t| jD ]`}tjtjf}tj	dkrR|t
jf7 }t| |rb qzt| |}W n ty   Y q*Y n0 d|d   | dV  t|tr>|D ]}|dkrt| t
jtjtjfrt|t
jtjtjfr|jD ]} ||d E dH  qqt|t
jtjtjfr ||d E dH  qq*t|t
jtjtjfrl ||d E dH  q*d|d   |d	|jj V  q*d|  d
| jj V  dS )z=Simple visitor generating strings to compare ASTs by content.rJ  r  r  rB   r~  targetsrC   Nz,  # z)  # /)r  r  r9   r   _fieldsr"   Z
TypeIgnorer#   r   r  r  r   ri  AttributeErrorrx  ZDeleter   eltsAST)rb  r  ZfieldZtype_ignore_classesrv   item_vr=   r>   r  |  s:    



"zassert_equivalent.<locals>._vzScannot use --safe with this file; failed to parse source file.  AST error message: Nr   z-INTERNAL ERROR: Black produced invalid code: ze. Please report a bug on https://github.com/psf/black/issues.  This invalid output might be helpful: rN  r   r3  zINTERNAL ERROR: Black produced code that is not equivalent to the source.  Please report a bug on https://github.com/psf/black/issues.  This diff might be helpful: )r   )r   r  r  r"   r#   r   r   ru   r  r   r  dump_to_filer   	traceback	format_tb__traceback__rF   )r   r3  Zsrc_astr   Zdst_astlogZsrc_ast_strZdst_ast_strr=   r  r>   r5  y  s>    ,-
r5  )r   r3  r   rG   c                 C   sF   t ||d}||krBtt| |ddt||dd}td| ddS )zDRaise AssertionError if `dst` reformats differently the second time.r   sourcez
first passzsecond passzINTERNAL ERROR: Black produced different code on the second pass of the formatter.  Please report a bug on https://github.com/psf/black/issues.  This diff might be helpful: N)r   r  rF   r  )r   r3  r   Znewdstr#  r=   r=   r>   r6    s    r6  )outputrG   c                  G   sh   t jdddddd>}| D ](}|| |r|d dkr|d qW d	   n1 sX0    Y  |jS )
z;Dump `output` to a temporary file. Return path to the file.r  Zblk_z.logFutf8)r   rv  r  deleter  r   rN  N)tempfileNamedTemporaryFiler"  r   )r%  r.  rH  r=   r=   r>   r    s    

*r  rY   c                   c   s
   dV  dS )zWReturn an empty context manager.

    To be used like `nullcontext` in Python 3.7.
    Nr=   r=   r=   r=   r>   r$    s    r$  )aba_nameb_namerG   c              	   C   sJ   ddl }dd | dD }dd |dD }d|j||||dd	S )
z9Return a unified diff string between strings `a` and `b`.r   Nc                 S   s   g | ]}|d  qS rN  r=   rx   rM  r=   r=   r>   r     r}   zdiff.<locals>.<listcomp>rN  c                 S   s   g | ]}|d  qS r.  r=   r/  r=   r=   r>   r     r}   r   rU   )ZfromfileZtofiler  )difflibr  r   Zunified_diff)r*  r+  r,  r-  r0  Za_linesZb_linesr=   r=   r>   rF     s    rF   )r  rG   c                 C   s   t d | D ]}|  qdS )zFasyncio signal handler that cancels all `tasks` and reports to stderr.zAborted!N)r4   r  )r  r  r=   r=   r>   r    s    r  )r   rG   c              	   C   s   zt jdd dkrtj}ntjj}dd || D }|s^W td}|tj | 	  dS |D ]}|
  qb| tj|| dd W td}|tj | 	  n td}|tj | 	  0 dS )	zFCancel all pending tasks on `loop`, wait for them, and close the loop.NrC   )rD   rW   c                 S   s   g | ]}|  s|qS r=   )r   )rx   r  r=   r=   r>   r     r}   zshutdown.<locals>.<listcomp>zconcurrent.futuresTr   )r   r  r   	all_tasksTaskloggingZ	getLoggerZsetLevelZCRITICALcloser  r   r  )r   r1  Z	to_cancelZ	cf_loggerr  r=   r=   r>   r     s,    




r   )regexreplacementr  rG   c                 C   s   |  ||  ||S )zReplace `regex` with `replacement` twice on `original`.

    This is used by string normalization to perform replaces on
    overlapping matches.
    )sub)r5  r6  r  r=   r=   r>   r    s    r  )r5  rG   c                 C   s   d| v rd|  } t | }|S )zdCompile a regular expression string in `regex`.

    If it contains newlines, use verbose mode.
    rN  z(?x))r   r  )r5  Zcompiledr=   r=   r>   r   !  s    
r   )sequencerG   c                 c   s0   t | d }t| D ]}||fV  |d8 }qdS )z;Like `reversed(enumerate(sequence))` if that were possible.rB   N)r   r  )r8  r:  elementr=   r=   r>   enumerate_reversed,  s    
r:  )rM  r  rG   c                 c   s   t ttt gttttf  f |r&tnt}|| j	D ]V\}}t
|jt
|j }d|jv rb dS | |D ]}|t
|j7 }ql|||fV  q6dS )z|Return an enumeration of leaves with their length.

    Stops prematurely on multiline strings and standalone comments.
    rN  N)r   r   r   r&   r   r   Indexr:  r  r  r   rv  rv   r  )rM  r  opr:  r  r  r  r=   r=   r>   r  4  s    

r  )r  )rM  rq   r  rG   c                C   s0   |st | d}t||ko.d|vo.|   S )zReturn True if `line` is no longer than `line_length`.

    Uses the provided `line_str` rendering, if any, otherwise computes a new one.
    rN  )ru   r4  r   r  )rM  rq   r  r=   r=   r>   r  J  s    r  )rM  rG   c                 C   s   | j }t|dk rdS |d jtjkr|d jtjkrd}d}|d }|ddd D ]}|jtv r||jtvrr dS |d7 }nP|jtjkr|d7 }n:|jtjkr|jtjks|jtv s dS n|jtvr dS |dkrT|dkrT dS qTd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).
    rC   Fr   rB   r   rO  NT)	r  r   r   r+   r  r  r  r  r  )rM  r  Z
call_count	dot_countr  r  r=   r=   r>   r  X  s,     




r  c                 C   s  | j }|jsdS | }||dkr*dS |tkr6dS t| jdksLJ d| jd }| jd }| jd }| jd }|jtv r|jt	vrd}d	| j
 }	t| D ]H\}
}}|jt	v r|j|u rd}|r|	|7 }	|	|kr q|jtv rd}qt| j|
d krdS |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 rPdS t|r^dS d	| j
 }	d}t| D ]H\}
}}|	|7 }	||ju r|s|	|kr dS n|jtv rtd}qtdS )
a  Does `line` 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.
    TrB   FrC   zStranded delimiterr   rO  r   rT   )r  r  r  r  rr  r   r  r   r  r  r  r  r  r+   r  RBRACEr  r  r\  r^  r  )rM  rq   r  r  r  secondZpenultimater  Z	remainderr  Z_indexr  r  Zseen_other_bracketsr=   r=   r>   r  |  sf    










r  )r   rG   c                 C   s   t d|   d S )Nzcache.z.pickle)	CACHE_DIRr   r   r=   r=   r>   get_cache_file  s    rA  c              
   C   s|   t | }| si S |dJ}zt|}W n* tjtfyX   i  Y W  d   S 0 W d   n1 sn0    Y  |S )zRead the cache if it exists and is well formed.

    If it is not well formed, the call to write_cache later should resolve the issue.
    r  N)rA  r   r  pickler   ZUnpicklingErrorr  )r   
cache_fileZfobjr   r=   r=   r>   r     s    6r   )r   rG   c                 C   s   |   }|j|jfS )zKReturn the information used to check if a file is already formatted or not.)r  r  st_size)r   r  r=   r=   r>   r     s    r   )r   r   rG   c                 C   sP   t  t   }}|D ]4}| }| |t|kr<|| q|| q||fS )zSplit an iterable of paths in `sources` into two sets.

    The first contains paths of files that modified on disk or are not in the
    cache. The other contains paths to non-modified files.
    )r   r   r   r   r   )r   r   Ztodor   r   r=   r=   r>   r     s    r   )r   r   r   rG   c                 C   s   t |}zztjddd i | dd |D }tjt|jdd }tj||dd W d	   n1 sh0    Y  t	
|j| W n ty   Y n0 d	S )
zUpdate the cache file.T)r  exist_okc                 S   s   i | ]}|  t|qS r=   )r   r   r   r=   r=   r>   r     r}   zwrite_cache.<locals>.<dictcomp>F)dirr'  rT   )ZprotocolN)rA  r@  mkdirr(  r)  ru   r  rB  dumpr   r   r   r   )r   r   r   rC  Z	new_cacher.  r=   r=   r>   r     s    .r   c                  C   sX   zddl m}  ddl m} W n ty0   Y dS 0 | |fD ]}t|dr:dd |_q:dS )a  Make Click not crash.

    On certain misconfigured environments, Python 3 selects the ASCII encoding as the
    default which restricts paths that it can access during the lifetime of the
    application.  Click refuses to work in this scenario by raising a RuntimeError.

    In case of Black the likelihood that non-ASCII characters are going to be used in
    file paths is minimal since it's Python source code.  Moreover, this crash was
    spurious on Python 3.7 thanks to PEP 538 and PEP 540.
    r   )core)_unicodefunN_verify_python3_envc                   S   s   d S rH   r=   r=   r=   r=   r>   r|   !  r}   zpatch_click.<locals>.<lambda>)r   rI  rJ  ModuleNotFoundErrorhasattrrK  )rI  rJ  moduler=   r=   r>   patch_click  s    
rO  c                   C   s   t   t  t  d S rH   )r   rO  r   r=   r=   r=   r>   patched_main$  s    rP  __main__)r=   )N)N)Fr=   )r=   )r=   r=   )r=   )r=   )r   )F)F(X  r  r   concurrent.futuresr   r   
contextlibr   r   enumr   	functoolsr   r   r	   r%  r  r3  Zmultiprocessingr
   r   r   pathlibr   rB  r5  r   r  r   r(  rQ  r   typingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zappdirsr   attrr   r    r!   r   r   Z	typed_astr"   r#   Zpathspecr$   Zblib2to3.pytreer%   r&   r'   Zblib2to3r(   r)   Zblib2to3.pgen2r*   r+   Zblib2to3.pgen2.grammarr,   Zblib2to3.pgen2.parser-   Z_black_versionr.   __version__r   ZDEFAULT_EXCLUDESZDEFAULT_INCLUDESr@  ru   ZFileContentZEncodingZNewLiner   r  r  r  r  r;  ro  Z	SplitFuncfloatZ	TimestampZFileSize	CacheInfoZCacher   r   r4   Z
initializeZpython_symbolsr\  UserWarningr7   r   r?   r  r@   rA   rQ   rS   ra   rb   rc   r   r2   rZ   rj   r^   re   r_   r`   rh   rf   rg   ri   rk   rl   rm   rn   r   ro   rP   r   ZContextZ	Parameterr   Zcommandr  optionZChoiceZversion_optionrR  Zpass_contextr   r   r   r   ZAbstractEventLoopr   rN   r   r   r!  r   bytesr  rU  r=  rd  re  rf  rp  r  r  r  r  Zif_stmtZ
while_stmtZfor_stmtZtry_stmtZexcept_clauseZ	with_stmtZfuncdefrb  r)  r{  rh  r{  LESSGREATEREQEQUALNOTEQUAL	LESSEQUALGREATEREQUALrt  VBAR
CIRCUMFLEXAMPER	LEFTSHIFTr\  PLUSMINUSr  r  DOUBLESLASHPERCENTr  TILDEr2  r[  r  rV  rQ  r^  rU  rT  rX  r5  rc  r  r  r  rY  rx  ZlambdefZor_testZand_testZnot_testrz  rd  r  Zxor_exprZand_exprr]  Z
arith_exprZtermr1  r  rF  rw  rm  ry  r|  rv  ru  rs  rr  r  r1   rC  rB  ZtestlistZexprlistr  r  r  r_  r  LBRACEr>  r  r   r  r  r  r  r  r  rM  r  rO  r  rl  r  r  r  r  r  r  r  r  rG  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%  rA  r  r  r  r  r  r  r  r  r  r  rW  r  r'  r*  r  r  r  r  r@  r  r?  r   r   r   r   r  r  r  r5  r6  r  r$  rF   r2  r  r   r  r   r:  r  r  r  r  rA  r   r   r   r   rO  rP  r9   r=   r=   r=   r>   <module>   s  
L

&$
			


	0a
" K/")'#

	    t H g`

$ R ' Y*"EL$	36$
$1"229T,N  	(	$$Y. 