o
    gt                     @   s   d dl Z d dlmZ d dlmZ d dlmZ d dlmZm	Z	 d dl
mZ d dlmZmZmZmZ d dlmZ d d	lmZ d d
lmZmZ e jG dd deZG dd deZdS )    N)cleandoc)Any)OptionsProviderMixIn)
_MSG_ORDERWarningScope)InvalidMessageError)	UNDEFINEDIRawCheckerITokenChecker
implements)MessageDefinition)CheckerStats)get_rst_sectionget_rst_titlec                   @   s   e Zd ZU dZeed< dZdZeed< i Z	eed< dZ
eed< dZeed	< d$ddZdd Zdd Zdd Zd%ddZ	
d&ddZdd Zdd ZedefddZdd Zd d! Zd"d# Zd
S )'BaseChecker name    optionsmsgsreportsTenabledNc                 C   s0   | j dur| j  | _ t|  || _i | _dS )zwchecker instances should have the linter as argument

        :param ILinter linter: is an object implementing ILinter.N)r   lowerr   __init__linterstats)selfr   r   r   Z/home/ubuntu/cloudmapper/venv/lib/python3.10/site-packages/pylint/checkers/base_checker.pyr   0   s
   


zBaseChecker.__init__c                 C   s"   | j  | j |j  |j S )z)Permit to sort a list of Checker by name.)r   r   __gt__)r   otherr   r   r   r   :   s   "zBaseChecker.__gt__c                 C   s6   | j rdnd}d| j }| d| j d| dS )NCheckerzDisabled checkerz', 'z 'z' (responsible for 'z'))r   joinr   keysr   )r   statusr   r   r   r   __repr__>   s   zBaseChecker.__repr__c                 C   s   | j | j|  | jdS )zThis might be incomplete because multiple class inheriting BaseChecker
        can have the same name. Cf MessageHandlerMixIn.get_full_documentation())r   r   r   )get_full_documentationr   options_and_valuesr   r   r   r   r   __str__C   s   zBaseChecker.__str__c                 C   sr  d}| j dd  d}|r|d| d7 }|t|d d7 }|r,|d	| d
7 }|d| j  d7 }|rJ|t| dd7 }|t| d7 }t|}|rd|t| dd7 }|td | d7 }|r|t| dd7 }t| dd dD ]\}}	| 	||	}	||	j
dd d7 }qz|d7 }|r|t| dd7 }|D ]}
|d|
d d  7 }q|d7 }|d7 }|S )Nr   _ z checkerz.. _z:

~
zThis checker is provided by ``z``.
z"Verbatim name of the checker is ``z``.

z Documentation^z

z Optionsz	 Messagesc                 S   s   t | d d | d fS )Nr   r   )r   index)kvr   r   r   <lambda>`   s    z4BaseChecker.get_full_documentation.<locals>.<lambda>)keyF)
checkerrefz Reportsz:%s: %s
   )r   replacetitler   r   listr   sorteditems$create_message_definition_from_tupleformat_help)r   r   r   r   docmoduleresultchecker_titlemsgidmsgreportr   r   r   r&   J   s@   z"BaseChecker.get_full_documentationc                 C   s"   |st }| j|||||| d S N)r   r   add_message)r   r@   linenodeargs
confidence
col_offsetr   r   r   rD   o   s   zBaseChecker.add_messagec                 C   s   d}g }| j D ]6}|dur0||jdd kr0d}|d|j d| d7 }|d| d	7 }t||jdd }||j qdS )
a3  Check the consistency of msgid.

        msg ids for a checker should be a string of len 4, where the two first
        characters are the checker id and the two last the msg id in this
        checker.

        :raises InvalidMessageError: If the checker id in the messages are not
        always the same.Nr      z(Inconsistent checker part in message id 'z' (expected 'xzxx' zbecause we already had z).)messagesr@   r   append)r   
checker_idexisting_idsmessage	error_msgr   r   r   check_consistencyv   s   	
zBaseChecker.check_consistencyc           	      C   s   t | ttfrtj}ntj}i }t|dkr|\}}}}nt|dkr)|\}}}nd}t||d| t	| ||||fi |S )NrJ   r4   zMessages should have a msgid and a symbol. Something like this :

"W1234": (
    "message",
    "message-symbol",
    "Message description with detail.",
    ...
),
scope)
r   r	   r
   r   LINENODElenr   
setdefaultr   )	r   r@   	msg_tupledefault_scoper   rA   symboldescrrQ   r   r   r   r:      s   	z0BaseChecker.create_message_definition_from_tuplereturnc                    s    fddt  j D S )Nc                    s   g | ]
\}}  ||qS r   )r:   ).0r@   rX   r(   r   r   
<listcomp>   s    
z(BaseChecker.messages.<locals>.<listcomp>)r8   r   r9   r(   r   r(   r   rL      s   
zBaseChecker.messagesc                 C   sN   | j D ]}|j|kr|  S qd| d}|ddd | j D  d7 }t|)NzMessageDefinition for 'z' does not exists. zChoose from c                 S   s   g | ]}|j qS r   )r@   )r]   mr   r   r   r^      s    z6BaseChecker.get_message_definition.<locals>.<listcomp>.)rL   r@   r   )r   r@   message_definitionrQ   r   r   r   get_message_definition   s   

z"BaseChecker.get_message_definitionc                 C      dS )z3called before visiting project (i.e set of modules)Nr   r(   r   r   r   open       zBaseChecker.openc                 C   rc   )z2called after visiting project (i.e set of modules)Nr   r(   r   r   r   close   re   zBaseChecker.closerC   )NN)NNNNN)__name__
__module____qualname__r   str__annotations__levelr   r   r   r   r   boolr   r   r%   r)   r&   rD   rR   r:   propertyr7   rL   rb   rd   rf   r   r   r   r   r       s*   
 


&
r   c                   @   s   e Zd ZdZdd ZdS )BaseTokenCheckerzEBase class for checkers that want to have access to the token stream.c                 C   s   t  )z#Should be overridden by subclasses.)NotImplementedError)r   tokensr   r   r   process_tokens   s   zBaseTokenChecker.process_tokensN)rg   rh   ri   __doc__rr   r   r   r   r   ro      s    ro   )	functoolsinspectr   typingr   pylint.configr   pylint.constantsr   r   pylint.exceptionsr   pylint.interfacesr   r	   r
   r   !pylint.message.message_definitionr   pylint.typingr   pylint.utilsr   r   total_orderingr   ro   r   r   r   r   <module>   s    