o
    8f&!                  	   @   s  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	 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 G dd deZdee dee fddZ d1de!dee defddZ"de!dede#fddZ$dede!fddZ%G dd de&Z'de!de	e(e(f d e#dej)fd!d"Z*de!dej)fd#d$Z+d%e!d&e!de!fd'd(Z,dej)dee! fd)d*Z-dej)d+eej) d,ej)dee! fd-d.Z.dej)d+eej) dee! fd/d0Z/dS )2z/
Parse Python code and perform AST validation.
    N)IterableIteratorListSetTuple)VERSION_TO_FEATURESFeatureTargetVersionsupports_feature)syms)pygram)driver)Grammar)
ParseError)
TokenError)LeafNodec                   @      e Zd ZdZdS )InvalidInputz7Raised when input source code fails all parse attempts.N__name__
__module____qualname____doc__ r   r   F/home/ertert/spirit/venv/lib/python3.10/site-packages/black/parsing.pyr          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	s*|t j t
dd | D r9|t j |S )Nc                 s   s    | ]
}t jt| v V  qd S N)r   PATTERN_MATCHINGr   ).0vr   r   r   	<genexpr>.   s    zget_grammars.<locals>.<genexpr>)r   python_grammar_async_keywordspython_grammarpython_grammar_soft_keywordsr
   r   ASYNC_IDENTIFIERSr    appendASYNC_KEYWORDSany)r   grammarsr   r   r   get_grammars   s"   	
r,   r   src_txtc                 C   s^  |  ds	| d7 } tt|}i }|D ]|}t|}z	|| d}W  n} tyd } z5|jd \}}	|  }
z|
|d  }W n t	yI   d}Y nw t
d| d|	 d| ||j< W Y d}~qd}~w ty } z |jd \}}	t
d| d|	 d|jd	  ||j< W Y d}~qd}~ww t|dksJ |t| }|dt|trttj|g}|S )
z4Given a string with source, return the lib2to3 Node.
T   z<line number missing in source>zCannot parse: :z: Nr   )endswithr,   setr   Driverparse_stringr   context
splitlines
IndexErrorr   versionr   argslenmax
isinstancer   r   r   
file_input)r-   r   r+   errorsgrammardrvresultpelinenocolumnlinesfaulty_lineteexcr   r   r   lib2to3_parse7   sD   

	
rI   r?   c              
   C   s8   t |}z	|| d W dS  tttfy   Y dS w )NTF)r   r3   r4   r   r   IndentationError)r-   r?   r@   r   r   r   matches_grammara   s   
rK   nodec                 C   s   t | }|S )z7Given a lib2to3 node, return its string representation.)str)rL   coder   r   r   lib2to3_unparsek   s   rO   c                   @   r   )ASTSafetyErrorzDRaised when Black's generated code is not equivalent to the old AST.Nr   r   r   r   r   rP   q   r   rP   srcr8   type_commentsc                C   sZ   d}t   t dt t dt tj| |||dW  d    S 1 s&w   Y  d S )Nz	<unknown>ignore)feature_versionrR   )warningscatch_warningssimplefilterSyntaxWarningDeprecationWarningastparse)rQ   r8   rR   filenamer   r   r   _parse_single_versionu   s   
$r]   c                 C   s   dd t dtjd d D }d}t|ddD ]$}z
t| |ddW   S  ty; } z|s1t|}W Y d }~qd }~ww t|ddD ]}z
t| |d	dW   S  tyW   Y qBw t|)
Nc                 S   s   g | ]}d |fqS )   r   )r!   minorr   r   r   
<listcomp>       zparse_ast.<locals>.<listcomp>r^   r/    T)reverse)rR   F)rangesysversion_infosortedr]   SyntaxErrorrM   )rQ   versionsfirst_errorr8   er   r   r   	parse_ast   s"   rl   lineendvaluec                 C   s$   dd |  D }| |}| S )Nc                 S   s   g | ]}|  qS r   )strip)r!   ir   r   r   r`      ra   z_normalize.<locals>.<listcomp>)r6   joinro   )rm   rn   stripped
normalizedr   r   r   
_normalize   s   
rt   c                 C   s
   t | g S )z=Simple visitor generating strings to compare ASTs by content.)_stringify_ast)rL   r   r   r   stringify_ast   s   
rv   parent_stack
new_parentc                 c   s(    | | t| |E d H  |  d S r   )r(   ru   pop)rL   rw   rx   r   r   r   _stringify_ast_with_new_parent   s   
rz   c              	   c   s    t | tjrt | jtr| jdkrd | _dt|  | jj dV  t	| j
D ]}t | tjr2 nzt| |}W n	 tyB   Y q(w dt|d   | dV  t |tr|D ]1}|dkrzt | tjrzt |tjrz|jD ]}t||| E d H  qmqXt |tjrt||| E d H  qXq(t |tjrt||| E d H  q(t | tjr|dkrt |trt|dkrt |d	 tjrt |d
 tjtjtjtjfrtd|}n|dkrt |tr| }n|}dt|d   |d|jj V  q(dt|  d| jj V  d S )Nuz    (r/   =targetsrn      r.   type_commentz,  # z)  # /)r<   rZ   Constantrn   rM   kindr:   	__class__r   rg   _fields
TypeIgnoregetattrAttributeErrorlistDeleter   eltsrz   ASTExprFunctionDefAsyncFunctionDefModuleClassDefrt   rstrip)rL   rw   fieldrn   itemeltrs   r   r   r   ru      sr   









 ru   )r   )0r   rZ   re   rU   typingr   r   r   r   r   
black.moder   r   r	   r
   black.nodesr   blib2to3r   blib2to3.pgen2r   blib2to3.pgen2.grammarr   blib2to3.pgen2.parser   blib2to3.pgen2.tokenizer   blib2to3.pytreer   r   
ValueErrorr   r,   rM   rI   boolrK   rO   	ExceptionrP   intr   r]   rl   rt   rv   rz   ru   r   r   r   r   <module>   sR    *




&