
    e^                        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e      Zdee   dee   fdZ d!de!dee   defdZ"de!dede#fdZ$dede!fdZ%de!de	e&e&f   de#dejN                  fdZ(de!dejN                  fdZ)de!de!de!fdZ*d"dejN                  de&dee!   fd Z+y)#z/
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y)InvalidInputz7Raised when input source code fails all parse attempts.N)__name__
__module____qualname____doc__     //usr/lib/python3/dist-packages/black/parsing.pyr   r      s    Ar   r   target_versionsreturnc                    | s/t         j                  t         j                  t         j                  gS g }t	        | t
        j                        s9t	        | t
        j                        s|j                  t         j                         t	        | t
        j                        s|j                  t         j                         t        d | D              r|j                  t         j                         |S )Nc              3   N   K   | ]  }t         j                  t        |   v   y wN)r	   PATTERN_MATCHINGr   ).0vs     r   	<genexpr>zget_grammars.<locals>.<genexpr>.   s!     
W!7##':1'==
Ws   #%)r   python_grammar_async_keywordspython_grammarpython_grammar_soft_keywordsr   r	   ASYNC_IDENTIFIERSr"   appendASYNC_KEYWORDSany)r   grammarss     r   get_grammarsr.      s     00!!//
 	
 H220H0HI<<=OW-C-CD--.

W
WW;;< Or   src_txtc                    | j                  d      s| dz  } t        t        |            }i }|D ]+  }t        j                  |      }	 |j                  | d      } n" t        |      dk\  sJ |t        |         }|dt!        |t"              rt%        t&        j(                  |g      }|S # t        $ rh}|j                  d   \  }}	| j                         }
	 |
|dz
     }n# t        $ r d}Y nw xY wt        d| d|	 d|       ||j                  <   Y d}~d}~wt        $ rK}|j                  d   \  }}	t        d| d|	 d|j                  d	          ||j                  <   Y d}~:d}~ww xY w)
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excs                 r   lib2to3_parserL   7   s   D!4C01HF mmG$	%%gt4F	4 6{aS[!t&$doox0M5  		ZZ]NFF&&(E@#FQJ/ @?@&2 &K=A'F7??#  	WWQZNFF&2 &BGGAJ<@'F7??#	sI   B++	E.4"DC D C.+D-C..$DE.#A E))E.rB   c                     t        j                  |      }	 |j                  | d       y# t        t        t
        f$ r Y yw xY w)NTF)r   r6   r7   r   r   IndentationError)r/   rB   rC   s      r   matches_grammarrO   a   sF    
--
 C$'  
$45 s   * A Anodec                     t        |       }|S )z7Given a lib2to3 node, return its string representation.)str)rP   codes     r   lib2to3_unparserT   k   s    t9DKr   srcr;   type_commentsc                    d}t        j                         5  t        j                  dt               t        j                  dt               t        j                  | |||      cd d d        S # 1 sw Y   y xY w)Nz	<unknown>ignore)feature_versionrV   )warningscatch_warningssimplefilterSyntaxWarningDeprecationWarningastparse)rU   r;   rV   filenames       r   _parse_single_versionrb   q   s`     H		 	 	" 
h6h(:;yy7-

 
 
s   AA..A7c                 p   t        dt        j                  d   dz         D cg c]  }d|f }}d}t        |d      D ]  }	 t	        | |d      c S  t        |d      D ]  }	 t	        | |d      c S  t        |      c c}w # t
        $ r}|st        |      }Y d }~bd }~ww xY w# t
        $ r Y Sw xY w)N   r2    T)reverse)rV   F)rangesysversion_infosortedrb   SyntaxErrorrR   )rU   minorversionsfirst_errorr;   es         r   	parse_astrp   }   s    (-a1A1A!1Dq1H(IJuE
JHJK(D1 %	%(gTJJ% (D1 	(gUKK k
""# K  	%!!f	%  		s/   BB%B)	B&B!!B&)	B54B5lineendvaluec                     |j                         D cg c]  }|j                          }}| j                  |      }|j                         S c c}w r!   )r9   stripjoin)rq   rr   istripped
normalizeds        r   
_normalizery      sK     /4.>.>.@A1779AHAh'J 	 Bs   Adepthc              #     K   t        | t        j                        r0t        | j                  t              r| j
                  dk(  rd| _        d|z   | j                  j                   d t        | j                        D ]  }t        | t        j                        r n	 t        | |      }d|dz   z   | d t        |t              r|D ]  }|dk(  r]t        | t        j                        rCt        |t        j                        r)|j                   D ]  }t#        ||dz         E d{     et        |t        j$                        st#        ||dz         E d{     t        |t        j$                        rt#        ||dz         E d{    t        | t        j                        r"|d	k(  rt        |t              rt'        d
|      }n(|dk(  r!t        |t              r|j)                         }n|}d|dz   z   |d|j                  j                     d|z   d| j                  j                    y# t        $ r Y w xY w7 -7 7 ȭw)z=Simple visitor generating strings to compare ASTs by content.uNz  (r2   =targets   rr   r1   type_commentz,  # z)  # /)r?   r_   Constantrr   rR   kind	__class__r   rj   _fields
TypeIgnoregetattrAttributeErrorlistDeleter   eltsstringify_astASTry   rstrip)rP   rz   fieldrr   itemeltrx   s          r   r   r      s(     	4&tzz3'II
 	E\N4>>2231
55% .WdCNN+	#D%0E #$UG1--eT" > Y&"44"43#yy A#0eai#@@@A  cgg.,T519===> sww'$UEAI666
 4.W$uc*
 (e4
.(Zs-C"\\^
"
UQY'(eEOO<T<T;UVV].W` E\N&!8!8 9
::S  		 A > 7sb   B!I"$I0A>I".I
/!I"I"#I$3I"I B3I"	II"II"I" I")r   )r   ),r   r_   rh   rZ   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.   rR   rL   boolrO   rT   intr   rb   rp   ry   r   r   r   r   <module>r      s2    
  7 7 T T   ! * + . &B: B#m"4 g >'3 '-1H 'RV 'TS 7 t $ 3 	
		
S#X	
:>	
WW	
#3 #377 #, C C ?; ?; ?;HSM ?;r   