
    c*                    h   d dl mZ d dl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 d dlmZmZ d dlmZ d dlmZ d d	lmZ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!m"Z"m#Z#m$Z$m%Z% d dl&m'Z'm(Z( erd dl)m*Z* ej+         G d de                      Z, G d de,          Z- G d de,          Z.dS )    )annotationsN)IterableSequence)cleandoc)	TokenInfo)TYPE_CHECKINGAny)nodes)_ArgumentsProvider)
_MSG_ORDERMAIN_CHECKER_NAMEWarningScope)InvalidMessageError)
ConfidenceIRawCheckerITokenChecker
implements)MessageDefinition)ExtraMessageOptionsMessageDefinitionTuple
OptionDictOptionsReportsCallable)get_rst_sectionget_rst_title)PyLinterc                      e Zd ZU dZded<   dZded<   i Zded<   dZd	ed
<   dZded<   d=dZ	d>dZ
d>dZd?dZd@dZd@dZ	 	 	 dAdBd"Z	 	 	 	 	 	 	 dCdDd.ZdEd/ZdFd3ZedGd5            ZdHd6ZdEd7ZdEd8ZdId9ZdJd<ZdS )KBaseChecker strname r   options!dict[str, MessageDefinitionTuple]msgsz,tuple[tuple[str, str, ReportsCallable], ...]reportsTboolenabledlinterr   returnNonec                    t          | dd          rt          j        dt          d           | j        | j                                        | _        || _        t          j        | |           dS )z5Checker instances should have the linter as argument.__implements__NzUsing the __implements__ inheritance pattern for BaseChecker is no longer supported. Child classes should only inherit BaseChecker or any of the other checker types from pylint.checkers.   
stacklevel)	getattrwarningswarnDeprecationWarningr!   lowerr)   r   __init__)selfr)   s     <lib/python3.11/site-packages/pylint/checkers/base_checker.pyr6   zBaseChecker.__init__0   s}    4)400 	MC #    9 	*	))DI#D&11111    otherr	   c                8   t          |t                    sdS | j        t          k    rdS |j        t          k    rdS t	          |           j                            d          r)t	          |          j                            d          sdS | j        |j        k    S )zSorting of checkers.FTzpylint.checkers)
isinstancer   r!   r   type
__module__
startswithr7   r:   s     r8   __gt__zBaseChecker.__gt__@   s    %-- 	59)) 	5:** 	4:: ++,=>> 	tH
 H

ZZ 122	 5y5:%%r9   c                t    t          |t                    sdS | j         | j         |j         |j         k    S )z$Permit to assert Checkers are equal.F)r<   r   r!   r%   r@   s     r8   __eq__zBaseChecker.__eq__N   sB    %-- 	5)(TY((uz,G5:,G,GGGr9   intc                <    t          | j         | j                   S )zMake Checker hashable.)hashr!   r%   r7   s    r8   __hash__zBaseChecker.__hash__T   s    ty-$)--...r9   c                    | j         rdnd}d                    | j                                                  }| d| j         d| dS )NCheckerzDisabled checkerz', 'z 'z' (responsible for 'z'))r(   joinr%   keysr!   )r7   statusr%   s      r8   __repr__zBaseChecker.__repr__X   sQ    "lB0B{{49>>++,,CCDICC4CCCCr9   c                    t          j                    5  t          j        dt                     |                     | j        |                                 | j                  cddd           S # 1 swxY w Y   dS )zThis might be incomplete because multiple classes inheriting BaseChecker
        can have the same name.

        See: MessageHandlerMixIn.get_full_documentation()
        ignorecategory)r%   r#   r&   N)r2   catch_warningsfilterwarningsr4   get_full_documentationr%   options_and_valuesr&   rG   s    r8   __str__zBaseChecker.__str__]   s     $&& 	 	#H7IJJJJ..Y(?(?(A(A4< /  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   AA00A47A4N%Iterable[tuple[str, OptionDict, Any]]*Sequence[tuple[str, str, ReportsCallable]]doc
str | Nonemoduleshow_optionsc                D   d}| j                             dd                                           d}|r	|d| dz  }|t          |d           dz  }|r	|d	| d
z  }|d| j          dz  }|r+|t          | dd          z  }|t	          |           dz  }t          |          }	|	rE|r-|t          | dd          z  }|t          d |	           dz  }n|d| j          d| j          dz  }|rw|t          | dd          z  }t          |                                d           D ]7\  }
}| 	                    |
|          }||
                    d           dz  }8|dz  }|r0|t          | dd          z  }|D ]}|d|d d         z  z  }|dz  }|dz  }|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See also :ref:`z# checker's options' documentation <z-options>`

z	 Messagesc                R    t          j        | d         d                   | d         fS )Nr      )r   index)kvs    r8   <lambda>z4BaseChecker.get_full_documentation.<locals>.<lambda>   s"    j.>r!uQx.H.H"Q%-P r9   )keyF)
checkerrefz Reportsz:%s: %s
r.   )r!   replacetitler   r   listr   sorteditems$create_message_definition_from_tupleformat_help)r7   r%   r#   r&   rZ   r\   r]   resultchecker_titleoptions_listmsgidmsgmsg_defreports                 r8   rU   z"BaseChecker.get_full_documentationi   sk    9,,S#66<<>>HHH 	+*V****F]=#66:::: 	EDvDDDDFItyIIII 	-m}$D$D$DcJJJF#,,,,FG}} 	t t-=(B(B(BCHHH_T<@@DDDDsDIssZ^Zcssss 	m}$?$?$?EEEF$

"P"P   G G
s CCE3OOW00E0BBFFFFdNF 	m}$>$>$>DDDF!  &!*, dNF$r9   ru   line
int | Nonenodenodes.NodeNG | Noneargs
confidenceConfidence | None
col_offset
end_linenoend_col_offsetc	           
     H    | j                             ||||||||           d S N)r)   add_message)	r7   ru   ry   r{   r}   r~   r   r   r   s	            r8   r   zBaseChecker.add_message   s9     	4tZZ	
 	
 	
 	
 	
r9   c                   d}g }| j         D ]s}|j        r
|>||j        dd         k    r+d}|d|j         d| dz  }|d| d	z  }t          |          |j        dd         }|                    |j                   tdS )
a<  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.
        Nre      z(Inconsistent checker part in message id 'z' (expected 'xzxx' zbecause we already had z).)messagessharedru   r   append)r7   
checker_idexisting_idsmessage	error_msgs        r8   check_consistencyzBaseChecker.check_consistency   s     
} 	/ 	/G ~  5*ac8J*J 5F	NNNjNNNN	G|GGGG	))444 qs+J....	/ 	/r9   	msg_tupler   r   c                \   t          j                    5  t          j        dt                     t	          | t
          t          f          rt          j        }nOt          | t          t          f          r't          j        dt                     t          j        }nt          j        }d d d            n# 1 swxY w Y   i }t          |          dk    r|\  }}}}n+t          |          dk    r|\  }}}nd}t          |          |                    d|           t#          | ||||fi |S )NrP   rQ   zCheckers should subclass BaseTokenChecker or BaseRawFileChecker instead of using the __implements__ mechanism. Use of __implements__ will no longer be supported in pylint 3.0   r   zMessages should have a msgid, a symbol and a description. Something like this :

"W1234": (
    "message",
    "message-symbol",
    "Message description with detail.",
    ...
),
scope)r2   rS   rT   r4   r<   BaseTokenCheckerBaseRawFileCheckerr   LINEr   r   r   r3   NODElenr   
setdefaultr   )	r7   ru   r   default_scoper#   rv   symboldescrr   s	            r8   rp   z0BaseChecker.create_message_definition_from_tuple   s    $&& 	2 	2#H7IJJJJ$!13E FGG 2 , 1D;">?? 	2@ '	   !- 1 , 1	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 (*y>>Q 	1,5)S&%^^q  	1#, S&%%I &i0007M222 uc5&LLGLLLs   BB44B8;B8list[MessageDefinition]c                h      fdt           j                                                  D             S )Nc                B    g | ]\  }}                     ||          S r"   )rp   ).0ru   r   r7   s      r8   
<listcomp>z(BaseChecker.messages.<locals>.<listcomp>   s=     
 
 
 y 55eYGG
 
 
r9   )rn   r%   ro   rG   s   `r8   r   zBaseChecker.messages   sB    
 
 
 
$*49??+<+<$=$=
 
 
 	
r9   c                    t          j        dt          d           | j        D ]}|j        |k    r|c S d| d}|dd | j        D              dz  }t          |          )	NzB'get_message_definition' is deprecated and will be removed in 3.0.r.   r/   zMessageDefinition for 'z' does not exists. zChoose from c                    g | ]	}|j         
S r"   )ru   )r   ms     r8   r   z6BaseChecker.get_message_definition.<locals>.<listcomp>   s    $D$D$DQW$D$D$Dr9   .)r2   r3   r4   r   ru   r   )r7   ru   message_definitionr   s       r8   get_message_definitionz"BaseChecker.get_message_definition   s    P	
 	
 	
 	

 #'- 	* 	*!'50 *))))*HeHHH	G$D$Ddm$D$D$DGGGG	!),,,r9   c                    dS )z5Called before visiting project (i.e. set of modules).Nr"   rG   s    r8   openzBaseChecker.open         r9   c                    dS )z3Called after visiting project (i.e set of modules).Nr"   rG   s    r8   closezBaseChecker.close   r   r9   c                    d S r   r"   rG   s    r8   get_map_datazBaseChecker.get_map_data      tr9   data	list[Any]c                    d S r   r"   )r7   r)   r   s      r8   reduce_map_datazBaseChecker.reduce_map_data  r   r9   )r)   r   r*   r+   )r:   r	   r*   r'   )r*   rD   )r*   r    )NNT)r%   r$   r#   rX   r&   rY   rZ   r[   r\   r[   r]   r'   r*   r    )NNNNNNN)ru   r    ry   rz   r{   r|   r}   r	   r~   r   r   rz   r   rz   r   rz   r*   r+   )r*   r+   )ru   r    r   r   r*   r   )r*   r   )ru   r    r*   r   )r*   r	   )r)   r   r   r   r*   r+   )__name__r>   __qualname__r!   __annotations__r#   r%   r&   r(   r6   rA   rC   rH   rN   rW   rU   r   r   rp   propertyr   r   r   r   r   r   r"   r9   r8   r   r   #   s         DNNNNG.0D0000<>G>>>>G2 2 2 2 & & & &H H H H/ / / /D D D D

 
 
 
" !!. . . . .f  $((,!%!%%)
 
 
 
 
/ / / /2#M #M #M #MJ 
 
 
 X
- - - -D D D DB B B B        r9   r   c                  4    e Zd ZdZej        dd            ZdS )	r   zEBase class for checkers that want to have access to the token stream.tokenslist[TokenInfo]r*   r+   c                    t                      )z#Should be overridden by subclasses.NotImplementedError)r7   r   s     r8   process_tokenszBaseTokenChecker.process_tokens  s     "###r9   N)r   r   r*   r+   )r   r>   r   __doc__abcabstractmethodr   r"   r9   r8   r   r   	  s<        OO$ $ $ $ $ $r9   r   c                  4    e Zd ZdZej        dd            ZdS )	r   z9Base class for checkers which need to parse the raw file.r{   nodes.Moduler*   r+   c                    t                      )z]Process a module.

        The module's content is accessible via ``astroid.stream``
        r   )r7   r{   s     r8   process_modulez!BaseRawFileChecker.process_module  s     "###r9   N)r{   r   r*   r+   )r   r>   r   r   r   r   r   r"   r9   r8   r   r     s<        CC$ $ $ $ $ $r9   r   )/
__future__r   r   	functoolsr2   collections.abcr   r   inspectr   tokenizer   typingr   r	   astroidr
    pylint.config.arguments_providerr   pylint.constantsr   r   r   pylint.exceptionsr   pylint.interfacesr   r   r   r   !pylint.message.message_definitionr   pylint.typingr   r   r   r   r   pylint.utilsr   r   pylint.lintr   total_orderingr   r   r   r"   r9   r8   <module>r      s1  
 # " " " " " 



      . . . . . . . .             % % % % % % % %       ? ? ? ? ? ? H H H H H H H H H H 1 1 1 1 1 1 P P P P P P P P P P P P ? ? ? ? ? ?              8 7 7 7 7 7 7 7 %$$$$$$ b b b b b$ b b bJ$ $ $ $ ${ $ $ $	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$r9   