B
    Khh'                 @   sr  U d 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 ejdk r^ddlmZ nddlmZ ddlmZmZmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlm Z  ddl!m"Z"m#Z# ee$d< e% dkZ&yddl'm(Z( W nF e)k
rD   ejdk r<e&s<e*dej+d e,d neZ(Y nX dZ-ee$d< G dd de.Z/e	e ee dddZ0d4e1ee e#dddZ2e1ee3dd d!Z4e#e1d"d#d$Z5e1e
e6e6f e3eej7e(j7f d%d&d'Z8e1eej7e(j7f d(d)d*Z9e(j7Z:eee(j7  e$d+< e1e1e1d,d-d.Z;d5eej7e(j7f e6ee1 d/d0d1Z<eej7e(j7f eej7e(j7f d"d2d3Z=dS )6z/
Parse Python code and perform AST validation.
    N)AnyIterableIteratorListSetTupleTypeUnion)      )Final)VERSION_TO_FEATURESFeatureTargetVersionsupports_feature)syms)pygram)driver)Grammar)
ParseError)
TokenError)LeafNodeast3PyPy)r   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   z-Python 2 support was removed in version 22.0.PY2_HINTc               @   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#   0/tmp/pip-install-vv81h98y/black/black/parsing.pyr   /   s   r   )target_versionsreturnc             C   sv   | st jt jt jgS g }t| tjs<t| tjs<|t j t| tj	sT|t j t
dd | D rr|t j |S )Nc             s   s   | ]}t jt| kV  qd S )N)r   PATTERN_MATCHINGr   ).0vr#   r#   r$   	<genexpr>K   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_soft_keywordsr   r   ZASYNC_IDENTIFIERSr'   appendZASYNC_KEYWORDSany)r%   grammarsr#   r#   r$   get_grammars3   s    
r.   r#   )src_txtr%   r&   c             C   s  |  ds| d7 } tt|}i }xd|D ]}t|}y|| d}P W q* tk
r } zd|jd \}}	|  }
y|
|d  }W n t	k
r   d}Y nX t
d| d|	 d| ||j< W dd}~X Y q* tk
r" } z8|jd \}}	t
d| d|	 d|jd	  ||j< W dd}~X Y q*X q*W t|dks:t|t| }t| tjsbt| tjr|jd	 }| dt }t
|d|dt|trttj|g}|S )
z4Given a string with source, return the lib2to3 Node.
Tr   z<line number missing in source>zCannot parse: :z: Nr   )endswithr.   setr   Driverparse_stringr   context
splitlines
IndexErrorr   versionr   argslenAssertionErrormaxmatches_grammarr   Zpython_grammarZ!python_grammar_no_print_statementr   
isinstancer   r   r   Z
file_input)r/   r%   r-   errorsgrammardrvresultpelinenocolumnlinesZfaulty_lineteexcZoriginal_msgmsgr#   r#   r$   lib2to3_parseT   sB    


.:

rK   )r/   rA   r&   c          
   C   s>   t |}y|| d W n tttfk
r4   dS X dS d S )NTF)r   r4   r5   r   r   IndentationError)r/   rA   rB   r#   r#   r$   r>      s    
r>   )noder&   c             C   s   t | }|S )z7Given a lib2to3 node, return its string representation.)str)rM   coder#   r#   r$   lib2to3_unparse   s    rP   )srcr9   type_commentsr&   c            C   s|   d}t jdkr(|dkr(tj| |||dS trTt jdkrFtj| ||dS t| |S n$|rltj| ||d dS t| |S d S )Nz	<unknown>)r
   r   )r
   )feature_versionrR   )rR   r   )rS   )sysversion_infoastparse_IS_PYPYr   )rQ   r9   rR   filenamer#   r#   r$   parse_single_version   s    
rZ   )rQ   r&   c             C   s   dd t dtjd d D }d}xRt|ddD ]B}yt| |ddS  tk
rp } z|s`t|}W d d }~X Y q0X q0W x8t|ddD ](}yt| |d	dS  tk
r   Y qX qW t|d S )
Nc             S   s   g | ]}d |fqS )r
   r#   )r(   minorr#   r#   r$   
<listcomp>   s    zparse_ast.<locals>.<listcomp>r
   r    T)reverse)rR   F)rangerT   rU   sortedrZ   SyntaxErrorrN   )rQ   versionsZfirst_errorr9   er#   r#   r$   	parse_ast   s    
rd   ast3_AST)lineendvaluer&   c             C   s$   dd |  D }| |}| S )Nc             S   s   g | ]}|  qS r#   )strip)r(   ir#   r#   r$   r\      s    z_normalize.<locals>.<listcomp>)r7   joinrh   )rf   rg   stripped
normalizedr#   r#   r$   
_normalize   s    
rm   )rM   depthr&   c          	   c   s  t | } d|  | jj dV  xt| jD ]}trBtjdk sltj	f}tjdkr`|t
j	f7 }t| |rlP yt| |}W n tk
r   w.Y nX d|d   | dV  t|trDx|D ]}|dkrt| t
jtjfrt|t
jtjfrxJ|jD ]}t||d E dH  qW qt|t
jtjfrt||d E dH  qW q.t|t
jtfrlt||d E dH  q.t| t
jr|d	krt|trtd
|}n|}d|d   |d|jj V  q.W d|  d| jj V  dS )z=Simple visitor generating strings to compare ASTs by content.z  ()r
   r   r   =targets   Nrg   r0   z,  # z)  # /)fixup_ast_constants	__class__r   r`   _fieldsrX   rT   rU   r   Z
TypeIgnorerV   r?   getattrAttributeErrorlistZDeleter   Zeltsstringify_astASTre   ConstantrN   rm   )rM   rn   fieldZtype_ignore_classesrg   itemeltrl   r#   r#   r$   ry      s@    




$ry   c             C   sl   t | tjtjtjtjfr(tj| jdS t | tjtjfrHtj| jdS t | tj	tj	frhtj| j
dS | S )z,Map ast nodes deprecated in 3.8 to Constant.)rg   )r?   rV   Strr   Bytesr{   sNumnNameConstantrg   )rM   r#   r#   r$   rs     s    rs   )r#   )r   )>r"   rV   platformrT   typingr   r   r   r   r   r   r   r	   rU   Ztyping_extensionsr   Z
black.moder   r   r   r   Zblack.nodesr   Zblib2to3r   Zblib2to3.pgen2r   Zblib2to3.pgen2.grammarr   Zblib2to3.pgen2.parser   Zblib2to3.pgen2.tokenizer   Zblib2to3.pytreer   r   __annotations__python_implementationrX   Z	typed_astr   ImportErrorprintstderrexitr   
ValueErrorr   r.   rN   rK   boolr>   rP   intrz   rZ   rd   re   rm   ry   rs   r#   r#   r#   r$   <module>   sN   (


!2

$C