
    e.$                    D   d dl m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 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jN                   G d de             Z( G d de(      Z) G d de(      Z*y)    )annotationsN)IterableSequence)cleandoc)	TokenInfo)TYPE_CHECKINGAny)nodes)_ArgumentsProvider)
_MSG_ORDERMAIN_CHECKER_NAMEWarningScope)InvalidMessageError)
Confidence)MessageDefinition)ExtraMessageOptionsMessageDefinitionTuple
OptionDictOptionsReportsCallable)get_rst_sectionget_rst_title)PyLinterc                  6   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	 	 	 d"	 	 	 	 	 	 	 	 	 	 	 	 	 d#dZ	 	 	 	 	 	 	 d$	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 d%dZd&dZ	 	 	 	 	 	 d'dZed(d       Zd&dZd&dZd)dZd*dZy)+BaseChecker strname r   options!dict[str, MessageDefinitionTuple]msgsz,tuple[tuple[str, str, ReportsCallable], ...]reportsTboolenabledc                    | j                   | j                   j                         | _         || _        t        j                  | |       y)z5Checker instances should have the linter as argument.N)r   lowerlinterr   __init__)selfr(   s     >/usr/lib/python3/dist-packages/pylint/checkers/base_checker.pyr)   zBaseChecker.__init__/   s5    99 		)DI##D&1    c                B   t        |t              sy| j                  t        k(  ry|j                  t        k(  ryt	        |       j
                  j                  d      }|t	        |      j
                  j                  d      z  r| S | j                  |j                  kD  S )zPermits sorting checkers for stable doc and tests.

        The main checker is always the first one, then builtin checkers in alphabetical
        order, then extension checkers in alphabetical order.
        FTzpylint.checkers)
isinstancer   r   r   type
__module__
startswith)r*   otherself_is_builtins      r+   __gt__zBaseChecker.__gt__6   s     %-99))::**t*//::;LMT%[33>>?PQQ&&&yy5::%%r,   c                    t        |t              sy| j                   | j                   |j                   |j                   k(  S )z$Permit to assert Checkers are equal.F)r.   r   r   r"   )r*   r2   s     r+   __eq__zBaseChecker.__eq__G   s<    %-))TYYK(uzzl5::,,GGGr,   c                H    t        | j                   | j                         S )zMake Checker hashable.)hashr   r"   r*   s    r+   __hash__zBaseChecker.__hash__M   s    tyyk$))-..r,   c                    | j                   rdnd}dj                  | j                  j                               }| d| j                   d| dS )NCheckerzDisabled checkerz', 'z 'z' (responsible for 'z'))r%   joinr"   keysr   )r*   statusr"   s      r+   __repr__zBaseChecker.__repr__Q   sG    "ll0B{{499>>+,DII;&:4&CCr,   c                n    | j                  | j                  | j                         | j                        S )zThis might be incomplete because multiple classes inheriting BaseChecker
        can have the same name.

        See: MessageHandlerMixIn.get_full_documentation()
        )r"   r    r#   )get_full_documentationr"   _options_and_valuesr#   r9   s    r+   __str__zBaseChecker.__str__V   s4     **D$<$<$> + 
 	
r,   Nc                   d}| j                   j                  dd      j                          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        |      }	|	rG|r%|t        | dd      z  }|t        d |	       dz  }n |d| j                    d| j                    dz  }|re|t        | dd      z  }t        |j                         d       D ]/  \  }
}| j                  |
|      }||j                  d       dz  }1 |dz  }|r0|t        | dd      z  }|D ]  }|d|d    d|d    d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                B    t        j                  | d   d         | d   fS )Nr      )r   index)kvs    r+   <lambda>z4BaseChecker.get_full_documentation.<locals>.<lambda>   s"    j.>.>r!uQx.H"Q%-P r,   )keyF)
checkerrefz Reports:r   z: rL   )r   replacetitler   r   listr   sorteditems$create_message_definition_from_tupleformat_help)r*   r"   r    r#   docmoduleshow_optionsresultchecker_titleoptions_listmsgidmsgmsg_defreports                 r+   rB   z"BaseChecker.get_full_documentation`   s    99,,S#6<<>?xHVHE**F]=#67r::6vheDDF6tyykIIm}o^$DcJJF#t,,FG}-=/(BCHH_T<@ADDODII;6YZ^ZcZcYddrssm}oY$?EEF$

"P G
s CCE3OW00E0BC2FF	G
 dNFm}oX$>DDF! 9AfQi[6!9+R889dNF$r,   c	           
     H    | j                   j                  ||||||||       y N)r(   add_message)	r*   r`   linenodeargs
confidence
col_offset
end_linenoend_col_offsets	            r+   rf   zBaseChecker.add_message   s'     	4tZZ	
r,   c                   d}g }| j                   D ]y  }|j                  r|>||j                  dd k7  r,d}|d|j                   d| dz  }|d| d	z  }t        |      |j                  dd }|j	                  |j                         { y)
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.
        NrL      z(Inconsistent checker part in message id 'z' (expected 'xzxx' zbecause we already had z).)messagessharedr`   r   append)r*   
checker_idexisting_idsmessage	error_msgs        r+   check_consistencyzBaseChecker.check_consistency   s     
}} 	/G ~~%*a8J*JF	q~j\NN	6|nBGG	))44 q+J.	/r,   c                >   t        | t        t        f      rt        j                  }nt        j
                  }i }t        |      dk(  r|\  }}}}t        di |}n"t        |      dk(  r|\  }}}nd}	t        |	      |j                  d|       t        | ||||fi |S )N   ro   zMessages should have a msgid, a symbol and a description. Something like this :

"W1234": (
    "message",
    "message-symbol",
    "Message description with detail.",
    ...
),
scoper   )r.   BaseTokenCheckerBaseRawFileCheckerr   LINENODElenr   r   
setdefaultr   )
r*   r`   	msg_tupledefault_scoper    ra   symboldescrmsg_optionsrw   s
             r+   rX   z0BaseChecker.create_message_definition_from_tuple   s     d-/ABC(--M(--M')y>Q09-S&%)8K8G^q #, S&%I &i007M2 uc5&LGLLr,   c                    t        | j                  j                               D cg c]  \  }}| j                  ||       c}}S c c}}w re   )rV   r"   rW   rX   )r*   r`   r   s      r+   rq   zBaseChecker.messages   sE     %+499??+<$=
 y 55eYG
 	
 
s   Ac                     y)z5Called before visiting project (i.e. set of modules).Nr   r9   s    r+   openzBaseChecker.open       r,   c                     y)z3Called after visiting project (i.e set of modules).Nr   r9   s    r+   closezBaseChecker.close   r   r,   c                     y re   r   r9   s    r+   get_map_datazBaseChecker.get_map_data       r,   c                     y re   r   )r*   r(   datas      r+   reduce_map_datazBaseChecker.reduce_map_data   r   r,   )r(   r   returnNone)r2   r	   r   r$   )r   int)r   r   )NNT)r"   r!   r    z%Iterable[tuple[str, OptionDict, Any]]r#   z*Sequence[tuple[str, str, ReportsCallable]]rZ   
str | Noner[   r   r\   r$   r   r   )NNNNNNN)r`   r   rg   
int | Nonerh   znodes.NodeNG | Noneri   r	   rj   zConfidence | Nonerk   r   rl   r   rm   r   r   r   )r   r   )r`   r   r   r   r   r   )r   zlist[MessageDefinition])r   r	   )r(   r   r   z	list[Any]r   r   )__name__r0   __qualname__r   __annotations__r    r"   r#   r%   r)   r4   r6   r:   r@   rD   rB   rf   rx   rX   propertyrq   r   r   r   r   r   r,   r+   r   r   "   sp    D#NGW.0D
+0<>G9>GT2&"H/D

 !!,/, 7, <	,
 , , , 
,b  $((,!%!%%)

 
 "	

 
 &
 
 
 #
 

/2MM%;M	M6 
 
DBr,   r   c                  6    e Zd ZdZej
                  dd       Zy)r|   zEBase class for checkers that want to have access to the token stream.c                    t               )z#Should be overridden by subclasses.NotImplementedError)r*   tokenss     r+   process_tokenszBaseTokenChecker.process_tokens   s     "##r,   N)r   zlist[TokenInfo]r   r   )r   r0   r   __doc__abcabstractmethodr   r   r,   r+   r|   r|      s    O$ $r,   r|   c                  6    e Zd ZdZej
                  dd       Zy)r}   z9Base class for checkers which need to parse the raw file.c                    t               )z]Process a module.

        The module's content is accessible via ``astroid.stream``
        r   )r*   rh   s     r+   process_modulez!BaseRawFileChecker.process_module   s     "##r,   N)rh   znodes.Moduler   r   )r   r0   r   r   r   r   r   r   r,   r+   r}   r}      s    C$ $r,   r}   )+
__future__r   r   	functoolscollections.abcr   r   inspectr   tokenizer   typingr   r	   astroidr
    pylint.config.arguments_providerr   pylint.constantsr   r   r   pylint.exceptionsr   pylint.interfacesr   !pylint.message.message_definitionr   pylint.typingr   r   r   r   r   pylint.utilsr   r   pylint.lintr   total_orderingr   r|   r}   r   r,   r+   <module>r      s   
 # 
  .   %  ? H H 1 ( ?  8$ @$ @ @F${ $	$ 	$r,   