o
    b                  	   @   s  d Z ddlZddlZddlmZmZmZmZmZm	Z	 ddl
mZm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mZ z
ddlmZmZ W n eyu   ej dk roe!dej"d e#d ne ZZY nw G dd de$Z%dee dee fddZ&d(de'dee defddZ(dede'fddZ)de'de	e*e*f deej+ej+ej+f fdd Z,de'deej+ej+ej+f fd!d"Z-	d)deej+ej+ej+f d#e*dee' fd$d%Z.deej+ej+ej+f deej+ej+ej+f fd&d'Z/dS )*z/
Parse Python code and perform AST validation.
    N)IterableIteratorListSetUnionTuple)NodeLeaf)pygrampytree)driver)Grammar)
ParseError)TargetVersionFeaturesupports_feature)syms)ast3ast27      zThe typed_ast package is required but not installed.
You can upgrade to Python 3.8+ or install typed_ast with
`python3 -m pip install typed-ast`.)file   c                   @   s   e Zd ZdZdS )InvalidInputz7Raised when input source code fails all parse attempts.N)__name__
__module____qualname____doc__ r   r   L/var/www/secure340b-portal/env/lib/python3.10/site-packages/black/parsing.pyr   !   s    r   target_versionsreturnc                 C   sn   | st jt jt jt jgS tdd | D rt jt jgS g }t| tjs)|	t j t| tj
s5|	t j |S )Nc                 s   s    | ]}|  V  qd S )N)Z
is_python2).0versionr   r   r    	<genexpr>3   s    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_grammarallr   r   ZASYNC_IDENTIFIERSappendZASYNC_KEYWORDS)r!   Zgrammarsr   r   r    get_grammars%   s$   r(   r   src_txtc                 C   s   |  ds	| d7 } tt|D ]P}t|tj}z	|| d}W  nA ty_ } z2|j	d \}}| 
 }z||d  }	W n tyG   d}	Y nw td| d| d|	 }
W Y d}~qd}~ww |
dt|trottj|g}|S )	z4Given a string with source, return the lib2to3 Node.
Tr   z<line number missing in source>zCannot parse: :z: N)endswithr(   setr   ZDriverr   convertparse_stringr   context
splitlines
IndexErrorr   
isinstancer	   r   r   Z
file_input)r)   r!   ZgrammardrvresultpelinenocolumnlinesZfaulty_lineexcr   r   r    lib2to3_parseL   s,   
&	
r;   nodec                 C   s   t | }|S )z7Given a lib2to3 node, return its string representation.)str)r<   coder   r   r    lib2to3_unparseg   s   r?   srcr$   c                 C   s\   d}t jdkr|dkrtj| ||dS |dkr!tj| ||d dS |dkr*t| S td)Nz	<unknown>r   r   )feature_versionr         z9INTERNAL ERROR: Tried parsing unsupported Python version!)sysversion_infoastparser   r   AssertionError)r@   r$   filenamer   r   r    parse_single_versionm   s   
rL   c                 C   s   dd t dtjd d D }tjdkr|d d}t|dd	D ]"}zt| |W   S  tyC } z|s9t	|}W Y d }~q!d }~ww t|)
Nc                 S   s   g | ]}d |fqS rA   r   )r#   minorr   r   r    
<listcomp>}       zparse_ast.<locals>.<listcomp>r   r   rH   rC    T)reverse)
rangerF   rG   r   r   r'   sortedrL   SyntaxErrorr=   )r@   versionsZfirst_errorr$   er   r   r    	parse_ast{   s   

rW   depthc           	   	   c   s   t | } d|  | jj dV  t| jD ]}tjtjf}tj	dkr)|t
jf7 }t| |r0 nzt| |}W n	 ty@   Y qw d|d   | dV  t|tr|D ]B}|dkrt| t
jtjtjfrt|t
jtjtjfr|jD ]}t||d E dH  qsqTt|t
jtjtjfrt||d E dH  qTqt|t
jtjtjfrt||d E dH  qt| t
jr|d	krt|ttfrt|trd
nd}dd | D }||}| }n|}d|d   |d|jj V  qd|  d| jj V  dS )z=Simple visitor generating strings to compare ASTs by content.z  (r   r   =targetsrD   Nvaluer*      
c                 S   s   g | ]}|  qS r   )strip)r#   liner   r   r    rN      rO   z!stringify_ast.<locals>.<listcomp>z,  # z)  # /)fixup_ast_constants	__class__r   rS   _fieldsr   
TypeIgnorer   rF   rG   rH   r3   getattrAttributeErrorlistDeleter   eltsstringify_astASTConstantr=   bytesr1   joinr^   )	r<   rX   fieldZtype_ignore_classesr\   itemZlineendstripped
normalizedr   r   r    ri      sZ   







"ri   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r(tj| j	dS t | tj
tj
fr8tj| jdS | S )z,Map ast nodes deprecated in 3.8 to Constant.)r\   )r3   rH   Strr   r   Bytesrk   sNumnNameConstantr\   )r<   r   r   r    r`      s   r`   )r   )r   )0r   rH   rF   typingr   r   r   r   r   r   Zblib2to3.pytreer   r	   Zblib2to3r
   r   Zblib2to3.pgen2r   Zblib2to3.pgen2.grammarr   Zblib2to3.pgen2.parser   Z
black.moder   r   r   Zblack.nodesr   Z	typed_astr   r   ImportErrorrG   printstderrexit
ValueErrorr   r(   r=   r;   r?   intrj   rL   rW   ri   r`   r   r   r   r    <module>   s`     
'

"
E