
    Ben                         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)y)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y)r   z+An error parsing contents of a Python file.c                      y)NzCannot parse file. selfs    1lib/python3.12/site-packages/pydocstyle/parser.py__str__zParseError.__str__!   s    #    N)__name__
__module____qualname____doc__r   r   r   r   r   r      s
    5$r   r   c                       e Zd Zd Zd Zy)UnexpectedTokenErrorc                      || _         || _        y Ntokenexpected_kind)r   r'   r(   s      r   __init__zUnexpectedTokenError.__init__&   s    
*r   c                 N    dj                  | j                  | j                        S )Nz Unexpected token {}, expected {})formatr'   r(   r   s    r   r   zUnexpectedTokenError.__str__*   s$    188JJ**
 	
r   N)r   r   r    r)   r   r   r   r   r#   r#   %   s    +
r   r#   c                 T    t        d      j                  d|       j                         S )Nz(.)([A-Z]+)z\1 \2)resublower)strings    r   humanizer1   0   s#    n!!(F399;;r   c                   (    e Zd ZdZd Zd Zd Zd Zy)Valuez.A generic object with a list of preset fields.c                 P   t        | j                        t        |      k7  rWt        dj                  t        |      t        | j                        | j                  j
                  | j                              t        |       j                  t        | j                  |             y )Nz)got {} arguments for {} fields for {}: {})	len_fields
ValueErrorr+   	__class__r   varsupdatezip)r   argss     r   r)   zValue.__init__7   sx    t||D	);BBI%NN++LL	  	T
#dllD12r   c                 *    t        t        |             S r%   )hashreprr   s    r   __hash__zValue.__hash__C   s    DJr   c                 8    |xr t        |       t        |      k(  S r%   )r9   )r   others     r   __eq__zValue.__eq__F   s    2dtE{22r   c                      dj                   fd j                  D              } j                  j                   d| dS )Nz, c              3   V   K   | ]   }d j                  |t        |             " yw)z{}={!r}N)r+   getattr).0fieldr   s     r   	<genexpr>z!Value.__repr__.<locals>.<genexpr>J   s-      
 UGD%$89
s   &)())joinr6   r8   r   )r   kwargss   ` r   __repr__zValue.__repr__I   sB     

 
 ..))*!F8155r   N)r   r   r    r!   r)   r@   rC   rN   r   r   r   r3   r3   4   s    8
3 36r   r3   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y)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                 >    t        t        |       j                        S r%   )r1   typer   r   s    r   <lambda>zDefinition.<lambda>a   s    8DJ,?,?#@ r   c                 <    | j                   j                         d   S )N)_humansplitr   s    r   r\   zDefinition.<lambda>b   s    !2!2!4R!8 r   c                 .    | j                   j                  S r%   )rX   moduler   s    r   r\   zDefinition.<lambda>c   s    4;;#5#5 r   c                 .    | j                   j                  S r%   )rb   
dunder_allr   s    r   r\   zDefinition.<lambda>d   s    t{{'='= r   c                 H    t        | j                  dz
  | j                        S )Nr	   )slicerR   rS   r   s    r   r\   zDefinition.<lambda>e   s    5a#B r   Fc                 0    t        | gg| j                   S r%   )r   rV   r   s    r   __iter__zDefinition.__iter__h   s    dV,dmm,,r   c                 z    t        | j                  t              r| j                  j                  S | j                  S )z4Get the line number with which to report violations.)
isinstancerU   	DocstringrR   r   s    r   error_linenozDefinition.error_linenok   s,     dnni0>>'''zzr   c                 &    ddd| j                      S )Npublicprivate)TF)	is_publicr   s    r   
_publicityzDefinition._publicityr   s    y1$..AAr   c                     | j                   | j                     }d }t        |t        |            }dj	                  t        t        |                  S )z*Return the source code for the definition.c                 j    | j                         dk(  xs | j                         j                  d      S )N #)strip
startswith)lines    r   is_empty_or_commentz.Definition.source.<locals>.is_empty_or_comment{   s)    ::<2%E)@)@)EEr   rt   )rQ   _slicer   reversedrL   list)r   full_srcry   filtered_srcs       r   sourcezDefinition.sourcev   sI     <<,	F !!4hx6HIwwx\ 2344r   c                     d| j                    d| j                   d| j                   d}| j                  r|d| j                   dz  }|S )Nzin  z ``z (skipping rK   )rq   r_   rP   rY   )r   outs     r   r   zDefinition.__str__   sQ    DOO$Adkk]"TYYKqA##[!9!9 :!<<C
r   N)r   r   r    r!   r6   propertyr_   kindrb   rd   rz   is_classrh   rl   rq   r   r   r   r   r   r   r   Q   s    JG @AF89D56F=>JBCFH-   B B 5 5r   r   c                   r    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y)r   zA Python source code module.)rP   rQ   rR   rS   rT   rU   rV   rX   _dunder_alldunder_all_errorfuture_importsrY   c                 "    t         t        d|    S Ndefclass)r   r   ss    r   r\   zModule.<lambda>   s    8e#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'7 r   c                     t        | j                        j                  }| j                          xr | j	                  |      S )zsReturn True iff the module is considered public.

        This helps determine if it requires a docstring.
        )r   rP   stem_is_inside_private_package_is_public_namer   module_names     r   rp   zModule.is_public   s@     499o**2244 
9M9M:
 	
r   c                 6   t        | j                        j                  }t        j                  D cg c]  }t        |       }}||j                  k7  r@||vr<| j                  |j                        ry|j                  }||j                  k7  r||vr<yc c}w )z6Return True if the module is inside a private package.TF)r   rP   rX   syspath_is_private_name)r   r   psyspaths       r   r   z!Module._is_inside_private_package   s    DII%%$'HH-q47-- dkk!d'&9$$TYY/;;D dkk!d'&9
  .s   Bc                 r    |j                  d       xs$ |j                  d      xr |j                  d      S )zJDetermine whether a "module name" (i.e. module or package name) is public.___)rw   endswithr   s     r   r   zModule._is_public_name   s;    ))#.. 
""4(G[-A-A$-G	
r   c                 &    | j                  |       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4r   c                      y)Nzat module levelr   r   s    r   r   zModule.__str__   s     r   N)r   r   r    r!   r6   staticmethod_nestr   rb   rd   rp   r   r   r   r   r   r   r   r   r      sU    &G GHE'(F78J
 

5!r   r   c                       e Zd ZdZy)r   z"A package is a __init__.py module.N)r   r   r    r!   r   r   r   r   r      s    ,r   r   c                   h    e Zd ZdZ ed       Zed        Zed        Zd Z	ed        Z
ed        Zy)	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                     | j                   | j                  | j                   v S | j                  j                  d       S )z:Return True iff this function should be considered public.r   )rd   rP   rw   r   s    r   rp   zFunction.is_public   s9     ??&99//yy++C000r   c                 :    t        d | j                  D              S )z3Return True iff the method decorated with overload.c              3   :   K   | ]  }|j                   d k(    yw)overloadNrP   )rG   	decorators     r   rI   z'Function.is_overload.<locals>.<genexpr>   s      
-6INNj(
s   anyrT   r   s    r   is_overloadzFunction.is_overload   s"      
:>//
 
 	
r   c                 @    t        fd| j                  D              S )zCReturn True if the method is decorated with any property decorator.c              3   :   K   | ]  }|j                   v   y wr%   r   )rG   r   property_decorator_namess     r   rI   z'Function.is_property.<locals>.<genexpr>   s#      
 NN66
s   r   )r   r   s    `r   is_propertyzFunction.is_property   s!     
!__
 
 	
r   c                 Z    | j                   j                  d      xs | 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)rP   rw   r   s    r   is_testzFunction.is_test   s'     yy##F+EtyyI/EEr   c                     | j                   S )zReturn the parameter names.)rW   r   s    r   param_nameszFunction.param_names   s     !!!r   N)r   r   r    r!   r   r   r   rp   r   r   r   r   r   r   r   r   r      si    (BE 1 1 
 

 F F " "r   r   c                       e Zd ZdZdZy)r   z%A Python source code nested function.FN)r   r   r    r!   rp   r   r   r   r   r      s
    /Ir   r   c                   P    e Zd ZdZed        Zed        Zed        Zed        Zy)r   zA Python source code method.c                     | j                   j                  d      xr/ | j                   j                  d      xr | j                   t        vS )z@Return True iff this method is a magic method (e.g., `__str__`).r   )rP   rw   r   VARIADIC_MAGIC_METHODSr   s    r   is_magiczMethod.is_magic   sD     II  & 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     yyJ&&r   c                 <   | j                   D ]6  }t        d| j                   d      j                  |j                        s6 y | j                  j	                  d       xs  | j                  t
        v xs | j                  }| j                  j                  xr |S )z8Return True iff this method should be considered public.^z\.Fr   )	rT   r-   rP   matchrw   r   r   rX   rp   )r   r   name_is_publics      r   rp   zMethod.is_public  s      	IQtyyk$%++INN;	
 		$$S)) yy22}} 	
 {{$$77r   c                 H    | j                   D ]  }|j                  dk(  s y y)z%Return True iff the method is static.r   TF)rT   rP   )r   r   s     r   	is_staticzMethod.is_static  s+      	I~~/	 r   N)	r   r   r    r!   r   r   r   rp   r   r   r   r   r   r      sS    &
 
 ' ' 8 8  r   r   c                   >    e Zd ZdZ ed       Zej                  ZdZy)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#K r   TN)	r   r   r    r!   r   r   r   rp   r   r   r   r   r   r   $  s     %KLE""IHr   r   c                        e Zd ZdZed        Zy)r   z"A Python source code nested class.c                     | j                   j                  d       xr. | j                  j                  xr | j                  j                  S )z7Return True iff this class should be considered public.r   )rP   rw   rX   r   rp   r   s    r   rp   zNestedClass.is_public/  sB     		$$S)) &$$&%%	
r   N)r   r   r    r!   r   rp   r   r   r   r   r   ,  s    ,
 
r   r   c                   0    e Zd ZdZdj	                         Zy)	Decoratorz*A decorator for function, method or class.zname argumentsN)r   r   r    r!   r`   r6   r   r   r   r   r   9  s    4$$&Gr   r   c                       e Zd ZdZd Zd Zy)rk   zRepresent a docstring.

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

    c                 .    t         j                  | |      S r%   )str__new__)clsvrR   rS   s       r   r   zDocstring.__new__G  s    {{3""r   c                      || _         || _        y r%   )rR   rS   )r   r   rR   rS   s       r   r)   zDocstring.__init__J  s    
r   N)r   r   r    r!   r   r)   r   r   r   rk   rk   ?  s    #r   rk   )r)   __call__r   c                       e Zd ZdZd Zy)r   z9Raised when there is a problem with __all__ when parsing.c                 \    t         j                  | |t        j                  d      z          y)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  s,    oo		
r   N)r   r   r    r!   r)   r   r   r   r   r   R  s
    C
r   r   c                   j    e Zd Zej                  ej
                  ej                  hZd Zd Z	d Z
d Zy)TokenStreamc                     t        j                  |j                        | _        t	        t        | j                  d        | _        | j                  j                  d   | _        t        | _	        d| _
        y )Nr   T)tkgenerate_tokensreadline
_generatorTokennextcurrentrR   rx   r
   got_logical_newline)r   filelikes     r   r)   zTokenStream.__init__n  sV    ,,X->->?d4??D9:LL&&q)	#' r   c                    | j                   }| j                         }|d nt        | | _         | j                   r| j                   j                  d   n| j                  | _        |j
                  t        j                  t        j                  fv }|j
                  | j                  v xs | j                  xr || _
        |S )Nr   )r   _next_from_generatorr   rR   rx   r   r   NLCOMMENTLOGICAL_NEWLINESr   )r   previousr   is_logical_blanks       r   movezTokenStream.moveu  s    <<++-&tE7O-1\\DLL&&q)tyy	#==RUUBJJ,??MMT222 ?((=-= 	 
 r   c                     	 t        | j                  d       S # t        t        j                  f$ r  | j
                  j                  dd       Y y w xY w)Nzerror generating tokensT)exc_info)r   r   SyntaxErrorr   
TokenErrorr
   warningr   s    r   r   z TokenStream._next_from_generator  sK    	..R]]+ 	HH6F	s    6AAc              #   f   K   	 | j                   | j                    ny | j                          -wr%   )r   r   r   s    r   rh   zTokenStream.__iter__  s.     ||'ll"IIK s   /1N)r   r   r    r   NEWLINEINDENTDEDENTr   r)   r   r   rh   r   r   r   r   r   f  s1     

BIIryy9(r   r   c                       e Zd Zd Zy)	TokenKindc                 F    dj                  t        j                  |          S )Nztk.{})r+   r   tok_namer   s    r   rN   zTokenKind.__repr__  s    ~~bkk$/00r   N)r   r   r    rN   r   r   r   r   r     s    1r   r   c                   D     e Zd Zdj                         Z fdZd Z xZS )r   zkind value start end sourcec                 R    t        |   |  t        | j                        | _        y r%   )superr)   r   r   )r   r<   r8   s     r   r)   zToken.__init__  s     $dii(	r   c                 :    | j                   d| j                   dS )Nz (rK   )r   valuer   s    r   r   zToken.__str__  s    ))bA..r   )r   r   r    r`   r6   r)   r   __classcell__)r8   s   @r   r   r     s    +11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y)r   zA Python source code parser.c                 t   t         | _         |j                         | _        dj                  | j                        }	 t	        ||d       t        t        |            | _	        || _
        d| _        d| _        t               | _        g | _        | j!                         S # t
        $ r}t               |d}~ww xY w)z>Parse the given file-like object and return its Module object.rt   execN)r
   	readlinesr   rL   r   r   r   r   r   streamfilenamerd   r   setr   _accumulated_decoratorsparse_module)r   r   r  srcerrors        r   parsezParser.parse  s    ((*ggdkk"	*C6* "(3-0  $!e')$  ""  	*,E)	*s   B 	B7'B22B7c                 &     | j                   |i |S )zCall the parse method.)r  )r   r<   rM   s      r   r   zParser.__call__  s    tzz4*6**r   c                 .    | j                   j                  S r%   )r
  r   r   s    r   r\   zParser.<lambda>  s    DKK$7$7 r   c                 .    | j                   j                  S r%   )r
  rx   r   s    r   r\   zParser.<lambda>  s    !1!1 r   c                 p    | j                   j                         }|j                  |k7  rt        ||      y)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  s2    [[%%'
??d"&ZtLL #r   Nc                     | j                   n| j                   j                  |k(  r-|| j                   j                  |k(  r| j                  |       y| j                  j                          | j                   myy)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  sa     ll&||  D(!3!3u!<T"KK ll&r   c                 H   | j                   j                  d| j                         | j                  j                  t        j
                  t        j                  t        j                  fv r| j                  j                          | j                   j                  d| j                  j                  | j                  j                         | j                  j                  t        j
                  t        j                  t        j                  fv r| j                  j                  t        j                  k(  rkt        | j                  j                  | j                  j                  d   | j                  j                  d         }| j                  j                          |S y)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  STRINGrk   rR   rS   )r   rU   s     r   parse_docstringzParser.parse_docstring  s   7FllBJJ

BEE#BBKKHHNN5!!"" llBJJ

BEE#BB <<		)!""DLL$6$6q$94<<;K;KA;NI KKr   c                 b   g }g }d}| j                   Y| j                  j                  d| j                   j                  | j                   j                         | j                   j                  t
        j                  k(  r| j                   j                  dv rn| j                   j                  t
        j                  k(  rd| j                   j                  dk(  rK| j                  j                  t        dj                  |      dj                  |                   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n| j                   j                  t
        j                  k(  s'| j                   j                  t
        j                  k(  rnM|s&|j                  | j                   j                         n%|j                  | j                   j                         | j                  j                          | j                   Y| j                  j                  t        dj                  |      dj                  |                   y)
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   @rt   rJ   TrK   )r   r
   r  r   r  r   NAMEOPr  appendr   rL   r   r   r
  r   )r   rP   	argumentsat_argumentss       r   parse_decoratorszParser.parse_decorators  s    	ll&HHNN>!!""
 ||  BGG+0B0B G 1 ""bee+0B0Bc0I,,33bggdmRWWY-?@ 	$""bee+0B0Bc0I#""bee+0B0Bc0I""bjj0DLL4E4E4N $KK 2 23$$T\\%7%78KKI ll&N 	$$++bggdmRWWY%78	
r   c              #     K   | j                   r| j                  j                  d| j                   j                  | j                   j                         | j                  j                  d| j
                  j                         |r+| j                   j                  dk(  r| j                          n| j                   j                  t        j                  k(  r`| j                   j                  dk(  rG| j
                  j                  r1| j                  t        j                         | j                          n:| j                   j                  dv r7| j                  |j                  | j                   j                               n| j                   j                  t        j                  k(  r9| j                  t        j                         | j                  |      E d{    n| j                   j                  t        j                   k(  r | j                  t        j                          y| j                   j                  dk(  r| j#                          n| j
                  j%                          | j                   qyy7 w)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_rd   s      r   r,  zParser.parse_definitions  s    ll&HHNNC!!""
 HHNN,dkk.M.MNdll00I=%%'!!RUU*LL&&#-KK33RUU#%%'##'77++FLL9K9K,LMM""bii/RYY'11&999""bii/RYY'##v-002  "7 ll&( :s   G J"J#BJJc                    | j                   j                  dk(  sJ | j                  t        j                         | j
                  | j                  d| _        d| _        y| j                   j                  dk7  rd| _        y| j                  t        j                         d}| j                   j                  dv r!d}| j                  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nb| j                   j                  t        j                  k(  s| j                   j                  d
k(  r|| j                   j                  z  }nd| _        y| j                  j                          |r| j                  t        j                         |s/d
|vr+dj!                  | j                   j                        | _        y|dz  }	 t#        |i       | _        | j                   j                  | j                  j&                  vr| j                   j                  t        j                  k7  r| j                   j                  t        j                  k7  rd| _        d| _        y| j                  j                          | j                   j                  | j                  j&                  vr)| j                   j                  t        j                  k7  ryyyy# t$        $ r"}dj!                  ||      | _        Y d}~!d}~ww xY w)z)Parse the __all__ definition in a module.r(  Nz(Could not evaluate contents of __all__. =Fz([TrJ   z)],z'Could not evaluate contents of __all__.z(Unexpected token kind in __all__: {!r}. rK   zOCould not evaluate contents of __all__.The value was {}. The exception was:
{})r   r  r  r   r!  rd   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..RWW??&$*?*?*K"DO$ND!<<$$ND!RUU<<% MLL !3!3t!;||  RZZ$>>||  RUUBJJ$77""bii/4<<3E3E3L"dll&8&88" > % KK  LL,>!>:AALL%% !
 c!	"#5r:DO LLT[[%A%AA!!R\\1||  BJJ."&> % KK LLT[[%A%AA!!R\\1 B1 B  	==CV&> !!	s   ?M 	M6M11M6c                 r   | j                   j                  d       | j                  }| j                         }| j	                         }t        | j                  t        d            }| j                  J | j                         | j                  }t        }| j                  j                  d      rt        } || j                  | j                  ||g ||d| j                  | j                  d|      }|j                  D ]	  }||_         | j"                  |_        | j                   j                  d       |S )z=Parse a module (and its children) and return a Module object.zparsing module.T)rd   Nz__init__.pyzfinished parsing module.)r
   r  rx   parse_skip_commentr  r|   r,  r   r   r  r   r   r   rd   r   rV   rX   r   )	r   rR   rY   rU   rV   rS   r   rb   childs	            r   r  zParser.parse_module|  s   ()		"557((*	..v$.GH||#1T\\1ii==!!-0CMMKKOO!!
 __ 	"E!EL	" $ 3 312r   c                    | j                   }| j                  t        j                         | j                  j
                  }| j                  j                  d|j                  |       | j                  j                          g }| j                  j                  t        j                  k(  r| j                  j
                  dk(  rd}d}	 | j                  j                  t        j                  k(  r_| j                  j
                  dk(  r|dz  }n| j                  j
                  dk(  r|dz  }|dk(  rrn| j                  j
                  dk(  rXd}nU|dk(  rP| j                  j                  t        j                  k(  r)|s'|j                  | j                  j
                         d}| j                  j                          | j                  j                  t        j                  k7  s| j                  j
                  d	k7  r"| j                  t        j                  d	
       n| j                  t        j                         | j                  j                  t        j                  t        j                   fv r| j#                         }| j                  t        j$                         | j                  j                  t        j$                  k7  sJ | j'                         }| j(                  }	| j                  j                  d|	       g | _        | j                  j                  d       t+        | j-                  |            }
| j                  j                  d|       | j                   dz
  }nnd}| j'                         }| j(                  }	| j                  j                  d|	       g | _        g }
| j                   }| j                  t        j                          ||| j.                  |||	||
|d|
      }|j0                  D ]	  }||_         | j                  j                  d|j                  || j                         |S )z=Parse a definition and return its value in a `class_` object.zparsing %s '%s'rJ   r   FTr	   rK   r1  :r  z"current accumulated decorators: %szparsing nested definitions.z,finished parsing nested definitions for '%s'rt   Nz*finished parsing %s '%s'. Next token is %r)rx   r  r   r!  r   r  r
   r  r   r
  r   r   r"  r#  r  r   r   r9  r   r  r  r|   r,  r   rV   rX   )r   r.  rR   rP   rW   parenthesis_levelin_default_argrY   rU   rT   rV   rS   
definitionr:  s                 r   r+  zParser.parse_definition  sB   		RWW||!!(&//4@<<%$,,*<*<*C !"N<<$$-||))S0)Q.)++s2)Q.),1!++s2).%*))RWW4*!((););<%)N  "# $ <<%););s)BMM"%%sM+LL<<RZZ 88"&"9"9";MM"))$<<$$		11,,.I55JHHNN?L+-D(HHNN89D226:;HHHNN> ))a-C"$,,.I55JHHNN?L+-D(H))CMM"**%KK

  (( 	&E%EL	&8OOLL		
 r   c                 (   d}| j                   j                  t        j                  t        j                  t        j
                  fv rI| j                   j                  t        j                  k(  rwd| j                   j                  v r8dj                  | j                   j                  j                  d      dd       }n'| j                   j                  j                  d      rd}| j                  j                          | j                  j                  d| j                   j                  | j                   j                         |r	 |S | j                   j                  t        j                  t        j                  t        j
                  fv rI|S )z*Parse a definition comment for noqa skips.rt   znoqa: r	   Nz# noqaallz3parsing comments before docstring, token is %r (%s))r   r   r   r   r   r   r  rL   r`   rw   r
  r   r
   r  )r   rY   s     r   r9  zParser.parse_skip_comment  s    llBJJ

BEE#BB||  BJJ.t||111*,''**00:12>+' \\''228<*/'KKHHNNE!!"" #""% llBJJ

BEE#BB$ #"r   c                     t        j                  dj                  |             }|r| j                  j                  |k(  nd}|r| j                  j
                  |k(  nd}|r|sJ |       y)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  sj    oo F  
 37T\\&&$.D
5:dll((E1k.3.kr   c                 |    | j                   j                  d       | j                         }| j                  |       y)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   r-  z"Parser.parse_from_import_statement  s3     	7899;%%&67r   c                    | j                   j                  dk(  sJ | j                   j                         | j                  j                          | j                   j                  dk(  }| j                  j                          | j                   | j                   j                  t
        j                  t
        j                  t
        j                  fv r| j                   j                  dk7  r| j                  j                          | j                   _| j                   j                  t
        j                  t
        j                  t
        j                  fv r| j                   j                  dk7  r| j                   | j                   j                  dk7  ry| j                  d       | j                   j                  dk(  sJ | 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__importFr=  )
r   r  r
  r   r   r   DOTr!  r"  rG  rK  s     r   rI  z Parser._parse_from_import_source  s\   
 ||!!V+?T\\-?-??<<--=LL$!!bffbggruu%==""h.KK	 LL$!!bffbggruu%==""h. <<4<<#5#5#A*||!!X-At||/A/AAr   c                 &   | j                   j                  dk(  r1| j                  t        j                         t        j                  f}n t        j
                  t        j                  f}| j                   j                  |vr| j                   j                  t        j                  k(  r| j                   j                  dk(  s| j                   j                  t        j                  k7  r| j                  j                          | j                  j                  d| j                   j                  | j                   j                         |r_| j                  j                  d| j                   j                         | j                  j                  | j                   j                         | j                  t        j                         | j                  j                  d| j                   j                  | j                   j                         | j                   j                  t        j                  k(  r~| j                   j                  dk(  re| j                  t        j                         | j                   j                  t        j                  k(  r| j                  t        j                         | j                   j                  dk(  r| j                  t        j                         | j                  j                  d| j                   j                  | j                   j                         | j                   j                  |vrE| j                   j                  t        j                  k(  s| j                   j                  dk(  syyyy)z4Parse the 'y' part in a 'from x import y' statement.rJ   ;z parsing import, token is %r (%s)zfound future import: %sasr1  N)r   r  r  r   r"  r   r2  r   r!  r
  r   r
   r  r   add)r   rL  expected_end_kindss      r   rJ  zParser._parse_from_import_names3  sG   <<$LL"$%%"$**bll!;ll'99LL&4<<+=+=+D||  BGG+  "HHNN2!!""
  8$,,:L:LM##''(:(:;LL!HHNN2!!""
 ||  BGG+0B0Bd0JRWW%<<$$/LL)||!!S(RUU#HHNN2!!""5 ll'99LL&4<<+=+=+D :+D :r   r%   )F)NN)r   r   r    r!   r  r   r   r   rx   r  r  r  r&  r,  r*  r  r+  r9  rG  r-  rI  rJ  r   r   r   r   r     so    &#$+ 78G12DM$3
j#>BH@L\#./$8 ,%r   r   )*r!   r   r   tokenizer   ior   	itertoolsr   r   pathlibr   r-   r   typingr   utilsr
   r(  r   r   r#   r1   r3   r   r   r   r   r   r   r   r   r   r   rk   r   r   r   intr   r   r   r   r   r   <module>r]     s    
    &     $ $
: 
<6 6:4 4n8!Z 8!v-f -+"z +"\X &X &RJ 

% 

' '   = 
y 
() )X1 1
/E /v vr   