
    e                        d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
mZ ddlmZ erddlmZ  G d	 d
e
      Z G d dee
      ZddZy)zICheck source code is ascii only or has an encoding declaration (PEP 263).    )annotationsN)TYPE_CHECKING)nodes)BaseRawFileCheckerBaseTokenChecker)ManagedMessage)PyLinterc                  D    e Zd ZdZdZddddddifiZd	Zdd
ZddZddZ	y)ByIdManagedMessagesCheckerzIChecks for messages that are enabled or disabled by id instead of symbol.miscellaneousI0023%suse-symbolic-message-insteadz1Used when a message is enabled or disabled by id.default_enabledF c                L    | j                   j                  j                          y N)linter_by_id_managed_msgsclearselfs    6/usr/lib/python3/dist-packages/pylint/checkers/misc.py_clear_by_id_managed_msgsz4ByIdManagedMessagesChecker._clear_by_id_managed_msgs%   s    ''--/    c                .    | j                   j                  S r   )r   r   r   s    r   _get_by_id_managed_msgsz2ByIdManagedMessagesChecker._get_by_id_managed_msgs(   s    {{...r   c                    | j                         }|D ]>  \  }}}}}||j                  k(  s|rdnd}d| d| d| d}	| j                  d||	       @ | j                          y	)
zHInspect the source file to find messages activated or deactivated by id.disableenable'z' is cryptic: use '# pylint: =z	' insteadr   lineargsN)r   nameadd_messager   )
r   nodemanaged_msgsmod_namemsgidsymbollinenois_disabledverbtxts
             r   process_modulez)ByIdManagedMessagesChecker.process_module+   s    335<H 	X8HeVV[499$$/yX% =dV1VHIV  !?fSV W		X
 	&&(r   NreturnNone)r3   zlist[ManagedMessage]r(   znodes.Moduler3   r4   )
__name__
__module____qualname____doc__r&   msgsoptionsr   r   r1   r   r   r   r   r      s@    SD*?&	
D G0/)r   r   c                  |     e Zd ZdZdZddiZddddd	d
fddddddffZd fdZ	 	 	 	 	 	 	 	 ddZddZ	ddZ
 xZS )EncodingCheckerz}BaseChecker for encoding issues.

    Checks for:
    * warning notes in the code like FIXME, XXX
    * encoding issues.
    r   W0511)r   fixmez5Used when a warning note as FIXME or XXX is detected.notescsvz<comma separated values>)FIXMEXXXTODOzAList of note tags to take in consideration, separated by a comma.)typemetavardefaulthelpz	notes-rgxstringz<regexp>z9Regular expression of note tags to take in consideration. )rE   rF   rH   rG   c                |   t         |           dj                  d | j                  j                  j
                  D              }| j                  j                  j                  r(d| d| j                  j                  j                   d}nd| d}t        j                  |t        j                        | _
        y )N|c              3  F   K   | ]  }t        j                  |        y wr   )reescape).0notes     r   	<genexpr>z'EncodingChecker.open.<locals>.<genexpr>d   s     NT4Ns   !z#\s*(z)(?=(:|\s|\Z)))superopenjoinr   configr@   	notes_rgxrN   compileI_fixme_pattern)r   r@   regex_string	__class__s      r   rT   zEncodingChecker.opena   s    NT[[5G5G5M5MNN;;''#E7!DKK,>,>,H,H+IXL#E7.9L jjrtt<r   c                    	 |j                  |      S # t        $ r Y y t        $ rH |j                  d      r4dt	        |      v r'|t	        |      v rd| d}| j                  d||       Y y w xY w)N   #codingzCannot decode using encoding 'z', bad encodingzsyntax-errorr#   )decodeUnicodeDecodeErrorLookupError
startswithstrr'   )r   r-   r$   file_encodingmsgs        r   _check_encodingzEncodingChecker._check_encodingl   s    	H;;}--! 	   	H%D	)!SY.6}o_U  f3 G	Hs    	A.AA.-A.c                    |j                   r|j                   nd}|j                         5 }t        |      D ]  \  }}| j                  |dz   ||        	 ddd       y# 1 sw Y   yxY w)z1Inspect the source file to find encoding problem.ascii   N)re   stream	enumeraterg   )r   r(   encodingrk   r-   r$   s         r   r1   zEncodingChecker.process_module}   sk    )-););4%%[[] 	Af )& 1 A$$VaZx@A	A 	A 	As   *AA(c                   | j                   j                  j                  sy|D ]  }|j                  t        j
                  k7  r!|j                  dd j                         }| j                  j                  d|j                         z         sk| j                  d|j                  d   dz   ||j                  d           y)z*Inspect the source to find fixme problems.Nrj   #r?   r   )
col_offsetr%   r$   )r   rV   r@   rE   tokenizeCOMMENTrI   lstriprZ   searchlowerr'   start)r   tokens
token_infocomment_texts       r   process_tokenszEncodingChecker.process_tokens   s    {{!!''  
	J("2"22%,,QR0779L""))#0B0B0D*DE  )//2Q6%#))!,	 ! 
	r   r2   )r-   intr$   bytesre   rd   r3   z
str | Noner5   )rw   zlist[tokenize.TokenInfo]r3   r4   )r6   r7   r8   r9   r&   r:   r;   rT   rg   r1   rz   __classcell__)r\   s   @r   r=   r=   6   s     D 
D 53,	
  %S		
G0	=!&7:	"Ar   r=   c                l    | j                  t        |              | j                  t        |              y r   )register_checkerr=   r   )r   s    r   registerr      s)    
OF34
6v>?r   )r   r	   r3   r4   )r9   
__future__r   rN   rq   typingr   astroidr   pylint.checkersr   r   pylint.typingr   pylint.lintr	   r   r=   r   r   r   r   <module>r      sM   
 P " 	     @ ($)!3 )@]&(: ]@@r   