B
    A!p\2                 @   sl   d Z ddlZddlZddlmZmZ ddlmZ ddlm	Z	m
Z
 G dd deZG dd	 d	eZd
d ZdS )zHCheck source code is ascii only or has an encoding declaration (PEP 263)    N)IRawCheckerITokenChecker)BaseChecker)
OPTION_RGXMessagesHandlerMixInc               @   s,   e Zd ZdZeZdZddiZdZdd Z	dS )	ByIdManagedMessagesCheckerzIchecks for messages that are enabled or disabled by id instead of symbol.miscellaneousZI0023)z%szuse-symbolic-message-insteadz1Used when a message is enabled or disabled by id. c       	      C   sh   t  }xR|D ]J\}}}}}||jkr|r:dj||d}ndj||d}| jd||d qW t   dS )zHinspect the source file to find messages activated or deactivated by id.z;Id '{ident}' is used to disable '{symbol}' message emission)ZidentZsymbolz:Id '{ident}' is used to enable '{symbol}' message emissionzuse-symbolic-message-instead)lineargsN)r   Zget_by_id_managed_msgsnameformatadd_messageZclear_by_id_managed_msgs)	selfmoduleZmanaged_msgsmod_nameZmsg_idZ
msg_symbollinenoZis_disabledZtxtr	   r	   3lib/python3.7/site-packages/pylint/checkers/misc.pyprocess_module2   s    

z)ByIdManagedMessagesChecker.process_moduleN)
__name__
__module____qualname____doc__r   __implements__r   msgsoptionsr   r	   r	   r	   r   r       s   r   c                   sn   e Zd ZdZeefZdZddddddifd	Zd
dddddffZ	 fddZ
dd Zdd Zdd Z  ZS )EncodingCheckerzWchecks for:
    * warning notes in the code like FIXME, XXX
    * encoding issues.
    r   )z%sfixmez5Used when a warning note as FIXME or XXX is detected.zACannot decode using encoding "%s", unexpected byte at position %dzinvalid-encoded-datazSUsed when a source line cannot be decoded using the specified source file encoding.Z
maxversion)   r   )ZW0511ZW0512notesZcsvz<comma separated values>)ZFIXMEZXXXZTODOzAList of note tags to take in consideration, separated by a comma.)typemetavardefaulthelpc                s4   t    tddttj| jj tj	| _
d S )Nz
#\s*(%s)\b|)superopenrecompilejoinmapescapeconfigr   I_fixme_pattern)r   )	__class__r	   r   r&   l   s    
zEncodingChecker.openc          
   C   s   y
| |S  tk
rF } z| jd|||jd fd W d d }~X Y nR tk
r } z4|drd|kr||kr| jd|d|d W d d }~X Y nX d S )Nzinvalid-encoded-data   )r
   r   #Zcodingzsyntax-errorz/Cannot decode using encoding "{}", bad encoding)decodeUnicodeDecodeErrorr   r   LookupError
startswithr   )r   r   r
   file_encodingexr	   r	   r   _check_encodingr   s    
&zEncodingChecker._check_encodingc          	   C   sR   |j r|j }nd}| .}x&t|D ]\}}| |d || q&W W dQ R X dS )z0inspect the source file to find encoding problemascii   N)r6   stream	enumerater8   )r   r   encodingr;   r   r
   r	   r	   r   r      s    
zEncodingChecker.process_modulec          	   C   s  | j jsdS dd |D }x|D ]}|jdd  }t|}|ryD|ddd\}}dd |dD }t|t| j j@ rw W n2 t	k
r   | j
d	|d |jd
 w Y nX | jd|  }	|	r |	d}
| j
d|j |
 ||jd d q W dS )z)inspect the source to find fixme problemsNc             s   s   | ]}|j tjkr|V  qd S )N)r    tokenizeCOMMENT).0Z
token_infor	   r	   r   	<genexpr>   s    z1EncodingChecker.process_tokens.<locals>.<genexpr>r:   =c             S   s   g | ]}|   qS r	   )stripupper)r@   Z_valr	   r	   r   
<listcomp>   s    z2EncodingChecker.process_tokens.<locals>.<listcomp>,zbad-inline-option)r   r
   r1   r   r   )
col_offsetr   r
   )r,   r   stringlstripr   searchgroupsplitset
ValueErrorr   rC   r.   lowerindexstart)r   tokensZcommentscommentZcomment_textZdisable_option_match_valuevaluesmatchZnoter	   r	   r   process_tokens   s4    



zEncodingChecker.process_tokens)r   r   r   r   r   r   r   r   r   r   r&   r8   r   rX   __classcell__r	   r	   )r/   r   r   C   s"   r   c             C   s    |  t|  |  t|  dS )z-required method to auto register this checkerN)Zregister_checkerr   r   )Zlinterr	   r	   r   register   s    rZ   )r   r>   r'   Zpylint.interfacesr   r   Zpylint.checkersr   Zpylint.utilsr   r   r   r   rZ   r	   r	   r	   r   <module>   s   #p