
    cn                     n   d Z ddlZddlZddlZddl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 d
Z G d de          Z G d de          Zd Z G d d          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d  d!e          Z G d" d#e          Z  G d$ d%e!          Z"d&Z# G d' d(e          Z$ G d) d*          Z% G d+ d,e&          Z' G d- d.e          Z( G d/ d0          Z)dS )1zPython code parser.    N)StringIO)chain	dropwhilePath)compile)Tuple   )log)Parser
DefinitionModulePackageFunctionNestedFunctionMethodClassNestedClassAllErrorr   
ParseErrorc                       e Zd ZdZd ZdS )r   z+An error parsing contents of a Python file.c                     dS )NzCannot parse file. selfs    1lib/python3.11/site-packages/pydocstyle/parser.py__str__zParseError.__str__!   s    ##    N)__name__
__module____qualname____doc__r   r   r   r   r   r      s)        55$ $ $ $ $r   r   c                       e Zd Zd Zd ZdS )UnexpectedTokenErrorc                 "    || _         || _        d S Ntokenexpected_kind)r   r(   r)   s      r   __init__zUnexpectedTokenError.__init__&   s    
*r   c                 B    d                     | j        | j                  S )Nz Unexpected token {}, expected {})formatr(   r)   r   s    r   r   zUnexpectedTokenError.__str__*   s$    188J*
 
 	
r   N)r   r    r!   r*   r   r   r   r   r$   r$   %   s2        + + +
 
 
 
 
r   r$   c                 l    t          d                              d|                                           S )Nz(.)([A-Z]+)z\1 \2)resublower)strings    r   humanizer2   0   s,    n!!(F3399;;;r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )Valuez.A generic object with a list of preset fields.c                 `   t          | j                  t          |          k    rSt          d                    t          |          t          | j                  | j        j        | j                            t          |                               t          | j        |                     d S )Nz)got {} arguments for {} fields for {}: {})	len_fields
ValueErrorr,   	__class__r   varsupdatezip)r   argss     r   r*   zValue.__init__7   s    t|D		) 	;BBII%%N+L	    	T

#dlD1122222r   c                 :    t          t          |                     S r&   )hashreprr   s    r   __hash__zValue.__hash__C   s    DJJr   c                 F    |ot          |           t          |          k    S r&   )r:   )r   others     r   __eq__zValue.__eq__F   s    2dtE{{22r   c                 t     d                      fd j        D                       } j        j         d| dS )Nz, c              3   `   K   | ](}d                      |t          |                    V  )dS )z{}={!r}N)r,   getattr).0fieldr   s     r   	<genexpr>z!Value.__repr__.<locals>.<genexpr>J   sQ       
 
 UGD%$8$899
 
 
 
 
 
r   ())joinr7   r9   r   )r   kwargss   ` r   __repr__zValue.__repr__I   s\     
 
 
 

 
 
 
 
 .)55F5555r   N)r   r    r!   r"   r*   rA   rD   rO   r   r   r   r4   r4   4   sV        88
3 
3 
3     3 3 36 6 6 6 6r   r4   c                       e Zd ZdZdZ ed           Z ed           Z ed           Z ed           Z	 ed           Z
dZd	 Zed
             Zed             Zed             Zd ZdS )r   z@A Python source code definition (could be class, function, etc).)
name_sourcestartend
decorators	docstringchildrencallable_argsparentskipped_error_codesc                 D    t          t          |           j                  S r&   )r2   typer   r   s    r   <lambda>zDefinition.<lambda>a   s    8DJJ,?#@#@ r   c                 @    | j                                         d         S )N)_humansplitr   s    r   r]   zDefinition.<lambda>b   s    !2!2!4!4R!8 r   c                     | j         j        S r&   )rY   moduler   s    r   r]   zDefinition.<lambda>c   s    4;#5 r   c                     | j         j        S r&   )rc   
dunder_allr   s    r   r]   zDefinition.<lambda>d   s    t{'= r   c                 <    t          | j        dz
  | j                  S )Nr
   )slicerS   rT   r   s    r   r]   zDefinition.<lambda>e   s    5a#B#B r   Fc                 (    t          | gg| j        R  S r&   )r   rW   r   s    r   __iter__zDefinition.__iter__h   s    dV,dm,,,,r   c                 \    t          | j        t                    r| j        j        S | j        S )z4Get the line number with which to report violations.)
isinstancerV   	DocstringrS   r   s    r   error_linenozDefinition.error_linenok   s+     dni00 	(>''zr   c                 "    ddd| j                  S )Npublicprivate)TF)	is_publicr   s    r   
_publicityzDefinition._publicityr   s    y11$.AAr   c                     | j         | j                 }d }t          |t          |                    }d                    t          t          |                              S )z*Return the source code for the definition.c                     |                                  dk    p&|                                                      d          S )N #)strip
startswith)lines    r   is_empty_or_commentz.Definition.source.<locals>.is_empty_or_comment{   s0    ::<<2%E)@)@)E)EEr   ru   )rR   _slicer   reversedrM   list)r   full_srcrz   filtered_srcs       r   sourcezDefinition.sourcev   s`     <,	F 	F 	F !!4hx6H6HIIwwx\ 2 233444r   c                 f    d| j          d| j         d| j         d}| j        r|d| j         dz  }|S )Nzin  z ``z (skipping rL   )rr   r`   rQ   rZ   )r   outs     r   r   zDefinition.__str__   sQ    ADOAAdkAATYAAA# 	=<!9<<<<C
r   N)r   r    r!   r"   r7   propertyr`   kindrc   re   r{   is_classri   rm   rr   r   r   r   r   r   r   r   Q   s        JJG X@@AAF88899DX5566F==>>JXBBCCFH- - -   X B B XB 5 5 X5    r   r   c                       e Zd ZdZdZ ed           Z ed           Z ed           Z	ed             Z
d Zd Zd	 Zd
 ZdS )r   zA Python source code module.)rQ   rR   rS   rT   rU   rV   rW   rY   _dunder_alldunder_all_errorfuture_importsrZ   c                 ,    t           t          d|          S Ndefclass)r   r   ss    r   r]   zModule.<lambda>   s    8e#D#DQ#G r   c                     | S r&   r   r   s    r   r]   zModule.<lambda>   s    4 r   c                     | j         S r&   )r   r   s    r   r]   zModule.<lambda>   s	    t'7 r   c                     t          | j                  j        }|                                  o|                     |          S )zsReturn True iff the module is considered public.

        This helps determine if it requires a docstring.
        )r   rQ   stem_is_inside_private_package_is_public_namer   module_names     r   rq   zModule.is_public   sE     49oo*22444 
9M9M:
 :
 	
r   c                     t          | j                  j        }d t          j        D             }||j        k    r6||vr2|                     |j                  rdS |j        }||j        k    r||v2dS )z6Return True if the module is inside a private package.c                 ,    g | ]}t          |          S r   r   )rH   ps     r   
<listcomp>z5Module._is_inside_private_package.<locals>.<listcomp>   s    ---q477---r   TF)r   rQ   rY   syspath_is_private_name)r   r   syspaths      r   r   z!Module._is_inside_private_package   s    DI%--CH--- dk! 	d'&9 	$$TY// t;D dk! 	d'&9 	
 ur   c                     |                     d           p)|                     d          o|                    d          S )zJDetermine whether a "module name" (i.e. module or package name) is public.___)rx   endswithr   s     r   r   zModule._is_public_name   sD    ))#... 
""4((G[-A-A$-G-G	
r   c                 .    |                      |           S )zKDetermine whether a "module name" (i.e. module or package name) is private.)r   r   s     r   r   zModule._is_private_name   s    ''4444r   c                     dS )Nzat module levelr   r   s    r   r   zModule.__str__   s      r   N)r   r    r!   r"   r7   staticmethod_nestr   rc   re   rq   r   r   r   r   r   r   r   r   r      s        &&G LGGHHEX''((F7788J
 
 X
  
 
 
5 5 5! ! ! ! !r   r   c                       e Zd ZdZdS )r   z"A package is a __init__.py module.N)r   r    r!   r"   r   r   r   r   r      s        ,,,,r   r   c                       e Zd ZdZ ed           Zed             Zed             Zd Z	ed             Z
ed             ZdS )	r   zA Python source code function.c                 ,    t           t          d|          S r   )r   r   r   s    r   r]   zFunction.<lambda>   s    .;??B r   c                 b    | j         | j        | j         v S | j                            d           S )z:Return True iff this function should be considered public.Nr   )re   rQ   rx   r   s    r   rq   zFunction.is_public   s6     ? 	19//y++C0000r   c                 >    t          d | j        D                       S )z3Return True iff the method decorated with overload.c              3   ,   K   | ]}|j         d k    V  dS )overloadNrQ   )rH   	decorators     r   rJ   z'Function.is_overload.<locals>.<genexpr>   s:       
 
-6INj(
 
 
 
 
 
r   anyrU   r   s    r   is_overloadzFunction.is_overload   s4      
 
:>/
 
 
 
 
 	
r   c                 D    t          fd| j        D                       S )zCReturn True if the method is decorated with any property decorator.c              3   *   K   | ]}|j         v V  d S r&   r   )rH   r   property_decorator_namess     r   rJ   z'Function.is_property.<locals>.<genexpr>   s?       
 
 N66
 
 
 
 
 
r   r   )r   r   s    `r   is_propertyzFunction.is_property   s=     
 
 
 
!_
 
 
 
 
 	
r   c                 L    | j                             d          p
| j         dk    S )a  Return True if this function is a test function/method.

        We exclude tests from the imperative mood check, because to phrase
        their docstring in the imperative mood, they would have to start with
        a highly redundant "Test that ...".

        testrunTest)rQ   rx   r   s    r   is_testzFunction.is_test   s&     y##F++EtyI/EEr   c                     | j         S )zReturn the parameter names.)rX   r   s    r   param_nameszFunction.param_names   s     !!r   N)r   r    r!   r"   r   r   r   rq   r   r   r   r   r   r   r   r   r      s        ((LBB E 1 1 X1 
 
 X

 
 
 F F XF " " X" " "r   r   c                       e Zd ZdZdZdS )r   z%A Python source code nested function.FN)r   r    r!   r"   rq   r   r   r   r   r      s        //IIIr   r   c                   j    e Zd ZdZed             Zed             Zed             Zed             ZdS )r   zA Python source code method.c                     | j                             d          o'| j                             d          o| j         t          vS )z@Return True iff this method is a magic method (e.g., `__str__`).r   )rQ   rx   r   VARIADIC_MAGIC_METHODSr   s    r   is_magiczMethod.is_magic   sD     I  && 8	""4((8	!77	
r   c                     | j         dk    S )z*Return True iff this method is `__init__`.r*   r   r   s    r   is_initzMethod.is_init  s     yJ&&r   c                     | j         D ]5}t          d| j         d                              |j                  r dS 6| j                            d           p| j        t
          v p| j        }| j        j        o|S )z8Return True iff this method should be considered public.^z\.Fr   )	rU   r.   rQ   matchrx   r   r   rY   rq   )r   r   name_is_publics      r   rq   zMethod.is_public  s      	 	I$ty$$$%%++IN;; uu 	$$S))) y22} 	
 {$77r   c                 6    | j         D ]}|j        dk    r dS dS )z%Return True iff the method is static.r   TF)rU   rQ   )r   r   s     r   	is_staticzMethod.is_static  s5      	 	I~/ ttur   N)	r   r    r!   r"   r   r   r   rq   r   r   r   r   r   r      s        &&
 
 X
 ' ' X' 8 8 X8   X  r   r   c                   <    e Zd ZdZ ed           Zej        ZdZdS )r   zA Python source code class.c                 ,    t           t          d|          S r   )r   r   r   s    r   r]   zClass.<lambda>'  s    6K#H#H#K r   TN)	r   r    r!   r"   r   r   r   rq   r   r   r   r   r   r   $  s4        %%LKKLLE"IHHHr   r   c                   (    e Zd ZdZed             ZdS )r   z"A Python source code nested class.c                 h    | j                             d           o| j        j        o| j        j        S )z7Return True iff this class should be considered public.r   )rQ   rx   rY   r   rq   r   s    r   rq   zNestedClass.is_public/  s9     	$$S))) &$&%	
r   N)r   r    r!   r"   r   rq   r   r   r   r   r   ,  s3        ,,
 
 X
 
 
r   r   c                   :    e Zd ZdZd                                ZdS )	Decoratorz*A decorator for function, method or class.zname argumentsN)r   r    r!   r"   ra   r7   r   r   r   r   r   9  s%        44$$&&GGGr   r   c                       e Zd ZdZd Zd ZdS )rl   zRepresent a docstring.

    This is a string, but has additional start/end attributes representing
    the start and end of the token.

    c                 8    t                               | |          S r&   )str__new__)clsvrS   rT   s       r   r   zDocstring.__new__G  s    {{3"""r   c                 "    || _         || _        d S r&   )rS   rT   )r   r   rS   rT   s       r   r*   zDocstring.__init__J  s    
r   N)r   r    r!   r"   r   r*   r   r   r   rl   rl   ?  s<         # # #    r   rl   )r*   __call__r   c                       e Zd ZdZd ZdS )r   z9Raised when there is a problem with __all__ when parsing.c                 f    t                               | |t          j        d          z              dS )z2Initialize the error with a more specific message.a]  
                That means pydocstyle cannot decide which definitions are
                public. Variable __all__ should be present at most once in
                each file, in form
                `__all__ = ('a_public_function', 'APublicClass', ...)`.
                More info on __all__: http://stackoverflow.com/q/44834/. ')
                N)	Exceptionr*   textwrapdedent)r   messages     r   r*   zAllError.__init__U  sC    o 		
 	
 	
 	
 	
r   N)r   r    r!   r"   r*   r   r   r   r   r   R  s)        CC
 
 
 
 
r   r   c                   N    e Zd Zej        ej        ej        hZd Zd Z	d Z
d ZdS )TokenStreamc                     t          j        |j                  | _        t	          t          | j        d            | _        | j        j        d         | _        t          | _	        d| _
        d S )Nr   T)tkgenerate_tokensreadline
_generatorTokennextcurrentrS   ry   r   got_logical_newline)r   filelikes     r   r*   zTokenStream.__init__n  sU    ,X->??d4?D99:L&q)	#'   r   c                     | j         }|                                 }|d nt          | | _         | j         r| j         j        d         n| j        | _        |j        t          j        t          j        fv }|j        | j	        v p| j
        o|| _
        |S )Nr   )r   _next_from_generatorr   rS   ry   r   r   NLCOMMENTLOGICAL_NEWLINESr   )r   previousr   is_logical_blanks       r   movezTokenStream.moveu  s    <++--&CttE7O-1\HDL&q))ty	#=RUBJ,??MT22 ?(=-= 	 
 r   c                     	 t          | j        d           S # t          t          j        f$ r  | j                            dd           Y d S w xY w)Nzerror generating tokensT)exc_info)r   r   SyntaxErrorr   
TokenErrorr   warningr   s    r   r   z TokenStream._next_from_generator  s^    	...R]+ 	 	 	H6FFF44	s    2AAc              #   X   K   	 | j         
| j         V  nd S |                                  (r&   )r   r   r   s    r   ri   zTokenStream.__iter__  s=      	| l""""IIKKK	r   N)r   r    r!   r   NEWLINEINDENTDEDENTr   r*   r   r   ri   r   r   r   r   r   f  se         
BIry9( ( (        r   r   c                       e Zd Zd ZdS )	TokenKindc                 L    d                     t          j        |                    S )Nztk.{})r,   r   tok_namer   s    r   rO   zTokenKind.__repr__  s    ~~bk$/000r   N)r   r    r!   rO   r   r   r   r   r     s#        1 1 1 1 1r   r   c                   L     e Zd Zd                                Z fdZd Z xZS )r   zkind value start end sourcec                 f     t                      j        |  t          | j                  | _        d S r&   )superr*   r   r   )r   r=   r9   s     r   r*   zToken.__init__  s,    $di((			r   c                 &    | j         d| j         dS )Nz (rL   )r   valuer   s    r   r   zToken.__str__  s    )......r   )r   r    r!   ra   r7   r*   r   __classcell__)r9   s   @r   r   r     sX        +1133G) ) ) ) )/ / / / / / /r   r   c                       e Zd ZdZd Zd Z ed           Z ed           Zd Z	ddZ
d	 Zd
 ZddZd Zd Zd Zd ZddZd Zd Zd ZdS )r   zA Python source code parser.c                    t           | _         |                                | _        d                    | j                  }	 t	          ||d           n!# t
          $ r}t                      |d}~ww xY wt          t          |                    | _	        || _
        d| _        d| _        t                      | _        g | _        |                                 S )z>Parse the given file-like object and return its Module object.ru   execN)r   	readlinesr   rM   r   r   r   r   r   streamfilenamere   r   setr   _accumulated_decoratorsparse_module)r   r   r  srcerrors        r   parsezParser.parse  s    ((**ggdk""	*C6**** 	* 	* 	*,,E)	*!(3--00  $!ee')$  """s   A 
A1A,,A1c                      | j         |i |S )zCall the parse method.)r  )r   r=   rN   s      r   r   zParser.__call__  s    tz4*6***r   c                     | j         j        S r&   )r  r   r   s    r   r]   zParser.<lambda>  s    DK$7 r   c                     | j         j        S r&   )r  ry   r   s    r   r]   zParser.<lambda>  s    !1 r   c                 p    | j                                         }|j        |k    rt          ||          dS )z8Consume one token and verify it is of the expected kind.r'   N)r  r   r   r$   )r   r   
next_tokens      r   consumezParser.consume  sD    [%%''
?d" 	M&ZtLLLL	M 	Mr   Nc                     | j         [| j         j        |k    r)|| j         j        |k    r|                     |           dS | j                                         | j         YdS dS )zSkip tokens in the stream until a certain token kind is reached.

        If `value` is specified, tokens whose values are different will also
        be skipped.
        N)r   r   r  r  r  r   )r   r   r  s      r   leapfrogzParser.leapfrog  s     l 	| D( !%!3u!< T"""K l 	 	 	 	 	r   c                 t   | j                             d| j                   | j        j        t          j        t          j        t          j        fv rx| j        	                                 | j                             d| j        j        | j        j
                   | j        j        t          j        t          j        t          j        fv x| j        j        t          j        k    rVt          | j        j
        | j        j        d         | j        j        d                   }| j        	                                 |S dS )z.Parse a single docstring and return its value.zparsing docstring, token is %sz#parsing docstring, token is %r (%s)r   N)r   debugr   r   r   r   r   r   r  r   r  STRINGrl   rS   rT   )r   rV   s     r   parse_docstringzParser.parse_docstring  s    7FFFlBJ
BE#BB 	KHNN5!"   lBJ
BE#BB 	 <	) 	!"DL$6q$94<;KA;N I Ktr   c                 N   g }g }d}| j         | j                            d| j         j        | j         j                   | j         j        t
          j        k    r| j         j        dv rnn| j         j        t
          j        k    re| j         j        dk    rU| j        	                    t          d                    |          d                    |                               g }g }d}n| j         j        t
          j        k    r| j         j        dk    rd}n| j         j        t
          j        k    r| j         j        d	k    rnv| j         j        t
          j        k    s| j         j        t
          j        k    rnA|s |	                    | j         j                   n|	                    | j         j                   | j                                         | j         | j        	                    t          d                    |          d                    |                               dS )
zParse decorators into self._accumulated_decorators.

        Called after first @ is found.
        Continue to do so until encountering the 'def' or 'class' start token.
        FNz,parsing decorators, current token is %r (%s))asyncr   r   @ru   rK   TrL   )r   r   r  r   r  r   NAMEOPr  appendr   rM   r   r   r  r   )r   rQ   	argumentsat_argumentss       r   parse_decoratorszParser.parse_decorators  s    	l $	HNN>!"  
 | BG+ 90B G 1 9 "be+ 90Bc0I 9,33bggdmmRWWY-?-?@@   	$"be+ 90Bc0I 9#"be+ 90Bc0I 9"bj0 9DL4E4N 9 $ 9KK 23333$$T\%7888KI l $	N 	$++bggdmmRWWY%7%788	
 	
 	
 	
 	
r   Fc              #      K   | j         | j                            d| j         j        | j         j                   | j                            d| j        j                   |r&| j         j        dk    r|                                  n|| j         j        t          j	        k    rQ| j         j        dk    rA| j        j        r5| 
                    t          j	                   |                                  n| j         j        dv r5|                     |                    | j         j                            V  n| j         j        t          j        k    r;| 
                    t          j                   |                     |          E d{V  ny| j         j        t          j        k    r!| 
                    t          j                   dS | j         j        dk    r|                                  n| j                                         | j         dS dS )z*Parse multiple definitions and yield them.Nz1parsing definition list, current token is %r (%s)zgot_newline: %s__all__r#  r   from)r   r   r  r   r  r  r   parse_dunder_allr   r%  r  r)  parse_definitionr   r   parse_definitionsr   parse_from_import_statementr   )r   class_re   s      r   r/  zParser.parse_definitions  s     l 	#HNNC!"  
 HNN,dk.MNNN #dl0I= #%%''''!RU*#L&#-# K3#
 RU###%%''''#'77 #++FLL9K,L,LMMMMMM"bi/ 	#RY'''11&9999999999"bi/ #RY'''#v- #002222  """7 l 	# 	# 	# 	# 	#r   c                 |   | j         j        dk    sJ |                     t          j                   | j        | j        d| _        d| _        dS | j         j        dk    r	d| _        dS |                     t          j                   d}| j         j        dv r!d}|                     t          j                   d}	 |r| j         j        d	v rn| j         j        t          j	        t          j
        fv rn| j         j        t          j        t          j        fv rnC| j         j        t          j        k    s| j         j        d
k    r|| j         j        z  }n	d| _        dS | j                                         |r|                     t          j                   |s*d
|vr&d                    | j         j                  | _        dS |dz  }	 t#          |i           | _        n2# t$          $ r%}d                    ||          | _        Y d}~nd}~ww xY w| j         j        | j        j        vr| j         j        t          j
        k    ry| j         j        t          j        k    rd| _        d| _        dS | j                                         | j         j        | j        j        vr | j         j        t          j
        k    udS dS dS dS )z)Parse the __all__ definition in a module.r+  Nz(Could not evaluate contents of __all__. =Fz([TrK   z)],z'Could not evaluate contents of __all__.z(Unexpected token kind in __all__: {!r}. rL   zOCould not evaluate contents of __all__.The value was {}. The exception was:
{})r   r  r  r   r$  re   r   r%  r   r   	ENDMARKERr   r   r  r  r   r,   evalBaseExceptionr   )r   is_surroundeddunder_all_contentes       r   r-  zParser.parse_dunder_all8  s   |!Y....RW? 	$*? 	"DO$ND!F<$ 	$ND!FRU<% 	  MLL 	 !3t!; | RZ$>> | RUBJ$77 "bi/ 4<3E3L "dl&88"" > % K	  	 LL 	,>!> 	:AAL%  !
 Fc!	"#5r::DOO 	 	 	==CV&> > !!!!!!	 LT[%AA
	!R\1
	 | BJ. "&> % K LT[%AA
	!R\1
	 
	 
	 
	 
	 
	 
	 
	 
	s   G 
H'HHc                 6   | j                             d           | j        }|                                 }|                                 }t          |                     t          d                    }| j        J | j                    | j        }t          }| j	        
                    d          rt          } || j	        | j        ||g ||d| j        | j        d|          }|j        D ]	}||_        
| j        |_        | j                             d           |S )z=Parse a module (and its children) and return a Module object.zparsing module.T)re   Nz__init__.pyzfinished parsing module.)r   r  ry   parse_skip_commentr   r}   r/  r   r   r  r   r   r   re   r   rW   rY   r   )	r   rS   rZ   rV   rW   rT   r   rc   childs	            r   r  zParser.parse_module|  s!   ()))	"5577((**	..v$.GGHH|11T\111i=!!-00 	CMKO!
 
 _ 	" 	"E!ELL $ 31222r   c                 $   | j         }|                     t          j                   | j        j        }| j                            d|j        |           | j	        
                                 g }| j        j        t          j        k    r| j        j        dk    rd}d}	 | j        j        t          j        k    rF| j        j        dk    r|dz  }ns| j        j        dk    r|dz  }|dk    rnqnV| j        j        dk    rd}nC|dk    r=| j        j        t          j        k    r#|s!|                    | j        j                   d}| j	        
                                 | j        j        t          j        k    s| j        j        d	k    r"|                     t          j        d	
           n|                     t          j                   | j        j        t          j        t          j        fv r|                                 }|                     t          j                   | j        j        t          j        k    sJ |                                 }| j        }	| j                            d|	           g | _        | j                            d           t+          |                     |                    }
| j                            d|           | j         dz
  }ngd}|                                 }| j        }	| j                            d|	           g | _        g }
| j         }|                     t          j                    ||| j        |||	||
|d|
  
        }|j        D ]	}||_        
| j                            d|j        || j                   |S )z=Parse a definition and return its value in a `class_` object.zparsing %s '%s'rK   r   FTr
   rL   r4  :r  z"current accumulated decorators: %szparsing nested definitions.z,finished parsing nested definitions for '%s'ru   Nz*finished parsing %s '%s'. Next token is %r)ry   r  r   r$  r   r  r   r  r   r  r   r   r%  r&  r  r   r   r<  r   r   r  r}   r/  r   rW   rY   )r   r1  rS   rQ   rX   parenthesis_levelin_default_argrZ   rV   rU   rW   rT   
definitionr=  s                 r   r.  zParser.parse_definition  s   	RW|!(&/4@@@<% 	#$,*<*C 	# !"N#<$- *|)S0 /)Q.))+s2 /)Q.),1 "!"+s2 /).%**)RW4* +*
 "(();<<<%)N  """##$ <% 	 );s)B 	 MM"%sM++++LL<RZ 88 	&"&"9"9";";MM")$$$<$	1111,,..I5JHNN?LLL+-D(HNN8999D226::;;HHNN>   )a-CC"$,,..I5JHNN?LLL+-D(H)CMM"*%%%VK
 

  ( 	& 	&E%ELL8OL		
 	
 	
 r   c                 f   d}| j         j        t          j        t          j        t          j        fv r| j         j        t          j        k    rjd| j         j        v r;d                    | j         j                            d          dd                   }n!| j         j        	                    d          rd}| j
                                         | j                            d| j         j        | j         j                   |rn/| j         j        t          j        t          j        t          j        fv |S )z*Parse a definition comment for noqa skips.ru   znoqa: r
   Nz# noqaallz3parsing comments before docstring, token is %r (%s))r   r   r   r   r   r   r  rM   ra   rx   r  r   r   r  )r   rZ   s     r   r<  zParser.parse_skip_comment  s    lBJ
BE#BB 	| BJ. 0t|11 0*,''*00::122>+ +'' \'228<< 0*/'KHNNE!"   # ! lBJ
BE#BB 	$ #"r   c                     t          j        d                    |                     }|r| j        j        |k    nd}|r| j        j        |k    nd}|r|s
J |            dS )z>Verify the current token is of type `kind` and equals `value`.z
        Unexpected token at line {self.line}:

        In file: {self.filename}

        Got kind {self.current.kind!r}
        Got value {self.current.value}
        r   TN)r   r   r,   r   r   r  )r   r   r  msg
kind_validvalue_valids         r   check_currentzParser.check_current  s    o F   
 
 37@T\&$..D
5:Ddl(E11.k..3.....r   c                     | j                             d           |                                 }|                     |           dS )zeParse a 'from x import y' statement.

        The purpose is to find __future__ statements.

        zparsing from/import statement.N)r   r  _parse_from_import_source_parse_from_import_namesr   is_future_imports     r   r0  z"Parser.parse_from_import_statement  sF     	788899;;%%&677777r   c                    | j         j        dk    sJ | j         j                    | j                                         | j         j        dk    }| j                                         | j         | j         j        t
          j        t
          j        t
          j        fv ro| j         j        dk    r_| j                                         | j         ?| j         j        t
          j        t
          j        t
          j        fv r| j         j        dk    _| j         | j         j        dk    rdS | 	                    d           | j         j        dk    sJ | j         j                    | j                                         |S )zuParse the 'from x import' part in a 'from x import y' statement.

        Return true iff `x` is __future__.
        r,  
__future__NimportFr@  )
r   r  r  r   r   r   DOTr$  r%  rJ  rN  s     r   rL  z Parser._parse_from_import_source  sg   
 |!V+??T\-????<-=L	!bfbgru%==	 "h.	
 K	 L	!bfbgru%==	 "h.	 < 	4<#5#A 	5***|!X-AAt|/AAAAr   c                 b   | j         j        dk    r-|                     t          j                   t          j        f}nt          j        t          j        f}| j         j        |vrF| j         j        t          j        k    r| j         j        dk    s| j         j        t          j        k    r| j	        
                                 n| j                            d| j         j        | j         j                   |rI| j                            d| j         j                   | j                            | j         j                   |                     t          j                   | j                            d| j         j        | j         j                   | j         j        t          j        k    rh| j         j        dk    rX|                     t          j                   | j         j        t          j        k    r|                     t          j                   | j         j        dk    r|                     t          j                   | j                            d| j         j        | j         j                   | j         j        |vr2| j         j        t          j        k    | j         j        dk    dS dS dS dS )z4Parse the 'y' part in a 'from x import y' statement.rK   ;z parsing import, token is %r (%s)zfound future import: %sasr4  N)r   r  r  r   r%  r   r5  r   r$  r  r   r   r  r   add)r   rO  expected_end_kindss      r   rM  zParser._parse_from_import_names3  sm   <$ 	<LL"$%"$*bl!;l'99 	L&	+/<+=+D	 | BG+   """HNN2!"  
   <8$,:LMMM#''(:;;;LL!!!HNN2!"  
 | BG+ *0Bd0J *RW%%%<$/ *LL)))|!S( $RU###HNN2!"  5 l'99 	L&	+/<+=+D	 	 	 	 	 	 	 	 	r   r&   )F)NN)r   r    r!   r"   r  r   r   r   ry   r  r  r   r)  r/  r-  r  r.  r<  rJ  r0  rL  rM  r   r   r   r   r     s?       &&# # #$+ + + h7788G81122DM M M     $3
 3
 3
j# # # #>B B BH  @L L L\# # #./ / / /$8 8 8     ,% % % % %r   r   )*r"   r   r   tokenizer   ior   	itertoolsr   r   pathlibr   r.   r   typingr	   utilsr   r+  r   r   r$   r2   r4   r   r   r   r   r   r   r   r   r   r   rl   r   r   r   intr   r   r   r   r   r   <module>r`     s     



            & & & & & & & &                         $ $ $ $ $ $ $ $
 
 
 
 
: 
 
 
< < <6 6 6 6 6 6 6 6:4 4 4 4 4 4 4 4n8! 8! 8! 8! 8!Z 8! 8! 8!v- - - - -f - - -+" +" +" +" +"z +" +" +"\    X   & & & & &X & & &R    J   

 

 

 

 

% 

 

 

' ' ' ' ' ' ' '         = 
 
 
 
 
y 
 
 
() ) ) ) ) ) ) )X1 1 1 1 1 1 1 1
/ / / / /E / / /v v v v v v v v v vr   