
    yIfC                        d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZmZ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 erd dlmZ  G d d          ZdS )    )annotationsN)defaultdict)TYPE_CHECKINGLiteral)
exceptions
interfaces)MSG_STATE_CONFIDENCEMSG_STATE_SCOPE_CONFIGMSG_STATE_SCOPE_MODULE	MSG_TYPESMSG_TYPES_LONG)HIGH)MessageDefinition)ManagedMessage)	OPTION_POInvalidPragmaErrorUnRecognizedOptionErrorparse_pragma)PyLinterc                      e Zd ZdZd,dZd-dZ	 d.d/dZ	 	 	 d0d1dZ	 d2d3dZ	 	 	 d0d4dZ		 	 	 d0d5dZ
	 	 	 d0d4dZd6d Zd6d!Z	 	 d7d8d%Zd9d&Z	 	 d7d:d(Zd;d+ZdS )<_MessageStateHandlerz[Class that handles message disabling & enabling and processing of inline
    pragma's.
    linterr   returnNonec                    || _         i | _        | j        | j        | j        d| _        | j        d         | j        d         d| _        i | _        t          t                    | _
        d S )N)enabledisabledisable-nextr   r   )zdisable-msgz
enable-msg)r   _msgs_stater   r   disable_next_options_methods_bw_options_methods_pragma_linenor   list_stashed_messages)selfr   s     U/var/www/piapp/venv/lib/python3.11/site-packages/pylint/lint/message_state_handler.py__init__z_MessageStateHandler.__init__&   s    ,.k| -!
 !
  0;/9$
 $
  /1  		 	    scopestrmsgr   line
int | Noner   boolc                   |dv rut          |t                    sJ | j        j                            ||||           |s6|j        dk    r-| j                            d||j        |j        f           dS dS dS | j        }|||j        <   dS )z(Set the status of an individual message.>   r-   modulezlocally-disabledr-   argsN)	
isinstanceintr   
file_stateset_msg_statussymboladd_messagemsgidr   )r&   r*   r,   r-   r   msgss         r'   _set_one_msg_statusz(_MessageStateHandler._set_one_msg_status=   s     &&&dC(((((K"11#tVUKKK cj,>>>''&TSY8O (      >>
 #D$DOOOr)   Fr:   ignore_unknownlist[MessageDefinition]c           	        g }|dk    r6t           D ],}|                    |                     |||                     -|S |                                }|t           vrt	          j        |          }n|}|F| j        j        j        |         D ],}|                    |                     |||                     -|S |	                                | j        j
        v r]| j        j
        |	                                         D ]6}|j        D ],}|                    |                     |||                     -7|S |	                                                    d          r9|r| j                            |           n| j                            |           |S 	 | j        j                            |          }n# t           j        $ r |s Y nw xY w|S )zMDo some tests and find the actual messages of which the status should be set.allNrp)r   extend_get_messages_to_setupperr   getr   
msgs_store_msgs_by_categorylower	_checkersr;   
startswithenable_reportdisable_reportget_message_definitionsr   UnknownMessageError)	r&   r:   r   r=   message_definitions_msgidcategory_idcategory_id_formattedcheckers	            r'   rC   z)_MessageStateHandler._get_messages_to_setM   s6    8:E>>#  #**--ffnMM    '& kkmmi''$2$6{$C$C!!$/! ,+0B%   $**--ffnMM    '& ;;==DK111;0?  %l  F'..11&&.QQ    '& ;;==##D)) 	' 2))%0000**5111&&	"&+"8"P"PQV"W"W- 	 	 	!  	 #"s   F9 9GGpackageNc                   |dv sJ |                      |||          }|D ]}|                     ||||           g | j        j        _        g | j        j        _        | j                                        D ]e\  }}	d | j        j        	                    |          D             }
|	r| j        j        xj        |
z  c_        K| j        j        xj        |
z  c_        fdS )zEDo some tests and then iterate over message definitions to set state.>   r-   r1   rT   c                    g | ]	}|j         
S  )r8   ).0ms     r'   
<listcomp>z8_MessageStateHandler._set_msg_status.<locals>.<listcomp>   s*          r)   N)
rC   r<   r   configr   r   r   itemsrF   rM   )r&   r:   r   r*   r-   r=   rO   message_definitionmsgid_or_symbol
is_enabledsymbolss              r'   _set_msg_statusz$_MessageStateHandler._set_msg_status   s    55555"77v~VV"5 	N 	N$$U,>fMMMM %'!%'"+/+;+A+A+C+C 	6 	6'OZ /GGXX  G  6"))W4)))"**g5***	6 	6r)   Tr^   is_disabledc                4   |dd                                          r{	 | j        j        j                            |          }n# t
          j        $ r Y dS w xY wt          | j        j        ||||          }| j        j	        
                    |           dS dS )z~If the msgid is a numeric one, then register it to inform the user
        it could furnish instead a symbolic msgid.
           N)r:   )isdigitr   rF   message_id_store
get_symbolr   rN   r   current_name_by_id_managed_msgsappend)r&   r^   r-   rb   r8   manageds         r'   _register_by_id_managed_msgz0_MessageStateHandler._register_by_id_managed_msg   s     122&&(( 
	</@KK) L   1   $(/64 G K+227;;;;;
	< 
	<s   %A AAc                f    |                      |d|||           |                     ||           dS )zDisable a message for a scope.Fr   r*   r-   r=   Nra   rl   r&   r:   r*   r-   r=   s        r'   r   z_MessageStateHandler.disable   sJ     	%u4 	 	
 	
 	
 	((55555r)   _c                    |st           j        |                     |dd|dz   |           |                     ||dz              dS )z$Disable a message for the next line.Fr-   rd   rn   N)r   NoLineSuppliedErrorra   rl   )r&   r:   rq   r-   r=   s        r'   r    z!_MessageStateHandler.disable_next   sg      	100) 	 	
 	
 	
 	((q99999r)   c                j    |                      |d|||           |                     ||d           dS )zEnable a message for a scope.Trn   F)rb   Nro   rp   s        r'   r   z_MessageStateHandler.enable   sO     	$e$~ 	 	
 	
 	
 	((%(HHHHHr)   c                b    | j         j        j        D ]}|dv r|                     |           dS )z:Disable message categories other than `error` and `fatal`.>   EFN)r   rF   rG   r   )r&   msgcats     r'   disable_noerror_messagesz-_MessageStateHandler.disable_noerror_messages   sF    k,> 	! 	!F##LL    	! 	!r)   c                :   | j         j                                        \  }}g }g }|D ]i}|                     |j                  r'|                    d|j         d|j         d           C|                    d|j         d|j         d           jt          d           |D ]}t          |           t          d           |D ]}t          |           t          d           |D ]"}t          d|j         d|j         d           #t          d           d S )Nz  z ()zEnabled messages:z
Disabled messages:z1
Non-emittable messages with current interpreter: )r   rF   find_emittable_messagesis_message_enabledr:   rj   r8   print)r&   	emittablenon_emittableenableddisabledmessager,   msg_defs           r'   list_messages_enabledz*_MessageStateHandler.list_messages_enabled   sW   #';#9#Q#Q#S#S 	=   	I 	IG&&w}55 IFGNFFgmFFFGGGG GW^ G Gw} G G GHHHH!""" 	 	C#JJJJ$%%% 	 	C#JJJJBCCC$ 	; 	;G9w~99999::::b					r)   
confidenceinterfaces.Confidence | NoneLiteral[0, 1, 2] | Nonec                    |t           j        }|j        | j        j        j        vrt          S 	 || j        j        j        |         v rt          S n# t          t          f$ r
 t          cY S w xY wdS )z:Returns the scope at which a message was enabled/disabled.N)r   	UNDEFINEDnamer   r[   r   r	   r6   _module_msgs_stater   KeyError	TypeErrorr
   )r&   r:   r-   r   s       r'   _get_message_state_scopez-_MessageStateHandler._get_message_state_scope   s     #-J?$+"4"???''	*t{-@GGG-- H)$ 	* 	* 	*))))	*ts   A A+*A+c                ,   | j                             |d          S 	 | j        j        j        |                  S # t
          $ r | j        j                                        }|r|k    rd}| j        j        j                            |i           }t          fd|	                                D                       }t          |d          \  }}||}| j                             ||          cY S | j                             |d          cY S w xY w)zChecks state of a single message for the current file.

        This function can't be cached as it depends on self.file_state which can
        change.
        NTc                *    g | ]\  }}|k    ||fS rW   rW   )rX   message_liner   r-   s      r'   rZ   z@_MessageStateHandler._is_one_message_enabled.<locals>.<listcomp>!  s7       0L&'4// &v.///r)   NN)r   rE   r   r6   r   r   get_effective_max_line_number_raw_module_msgs_statereversedr\   next)	r&   r:   r-   max_line_numberfallbacklinesclosest_linesrq   fallback_iters	     `      r'   _is_one_message_enabledz,_MessageStateHandler._is_one_message_enabled
  sF    <#''t444	5;)<UCDII 	5 	5 	5
 #k4RRTTO =4/#9#9.EII%QSTT !)   49KKMM  ! ! $(|#D#D = ,,H'++E8<<<<<#''t444441	5s   = B6D5DD	msg_descrc                     |r|j          j        j        j        vrdS 	  j        j        j                            |          }n# t          j        $ r |g}Y nw xY wt           fd|D                       S )a  Return whether this message is enabled for the current file, line and
        confidence level.

        This function can't be cached right now as the line is the line of
        the currently analysed file (self.file_state), if it changes, then the
        result for the same msg_descr/line might need to change.

        :param msg_descr: Either the msgid or the symbol for a MessageDefinition
        :param line: The line of the currently analysed file
        :param confidence: The confidence of the message
        Fc              3  D   K   | ]}                     |          V  d S )N)r   )rX   r:   r-   r&   s     r'   	<genexpr>z:_MessageStateHandler.is_message_enabled.<locals>.<genexpr>J  s3      QQ4//t<<QQQQQQr)   )
r   r   r[   r   rF   rf   get_active_msgidsr   rN   any)r&   r   r-   r   msgidss   ` `  r'   r~   z'_MessageStateHandler.is_message_enabled.  s    "  	*/1C1NNN5	![+<NN FF - 	! 	! 	!  [FFF		!
 QQQQQ&QQQQQQs   $A AAtokenslist[tokenize.TokenInfo]c                `   h d}d}d}d}|D ]\  }}}}	}	|r||d         k    r|}d}|d         }|t           j        t           j        fv rd}|t           j        k    rPt	          j        |          }
|
g	 t          |
                    d                    D ]}|j        dv r[|j        dk    r#| j	        
                    d	|d         d
           | j	        
                    d|d                    d| _          dS 	 | j        |j                 }ne# t          $ rX | j        |j                 }| j	        
                    d	|d         |j        |j                            dd          f           Y nw xY w|j        D ]/}|j        |v r|d         | j        |<   |j        |fdk    rQ| j	        
                    d	|d         d           | j	        
                    d|d                    d| _           dS |d         }|s|dz  }	  ||d|           # t$          j        t$          j        f$ r:}| j	        
                    d|j        |f|d         t*                     Y d}~d}~wt$          j        $ r4 | j	        
                    d|j        |f|d         t*                     Y -w xY w# t.          $ r3}| j	        
                    d|j        |d                    Y d}~d}~wt2          $ r3}| j	        
                    d|j        |d                    Y d}~d}~ww xY wdS )zProcess tokens from the current module to search for module/block level
        options.

        See func_block_disable_msg.py test case for expected behaviour.
        >   r   r   r   NTr   F   >   	skip-filedisable-allr   zdeprecated-pragma)r   r   r2   zfile-ignored)r-   z-msgr|   )r   r@   )zdisable=allr   rd   r1   zuseless-option-value)r3   r-   r   zunknown-option-valuezunrecognized-inline-option)r3   r-   zbad-inline-option)tokenizeNLNEWLINECOMMENTr   searchr   groupactionr   r9   _ignore_filer!   r   r"   replacemessagesr#   r   DeletedMessageErrorMessageBecameExtensionErrorr   rN   r   tokenr   )r&   r   control_pragmas	prev_linesaw_newlineseen_newlinetok_typecontentstartrq   matchpragma_reprmethr:   l_starteerrs                    r'   process_tokensz#_MessageStateHandler.process_tokensL  sV    @??	.4 W	 W	*Hgua %Y%(22*$aIHK)9:::#8+++$W--E}I#/A#?#? = =K")-III&->> K33 3%*1X%A 4   
 //U1X/NNN,0)#4[5GH# 
 
 
#78JK///!&q + 2 + 2 : :62 F F" 0     
 "-!5 % %&-@@9>qD/6'.6:LLL K33 3%*1X%A 4   
 !K33Nq3RRR04D-"FFFF #((* )#qLG D'::::&:&B  	 	 	 !K33 6&1&8!%<%*1X+/	 4          *=    K33 6&1&8%%@%*1X+/	 4     ?%1=~ +   ''0syuQx (    %   '''cieAh (    	gW	 W	s   5BJ3?DJ3AE41J33E44BJ38J3HJ3J,	10I&	!J3&AJ,	(J3+J,	,J33
L+=(K++L+8(L&&L+)r   r   r   r   )
r*   r+   r,   r   r-   r.   r   r/   r   r   )F)r:   r+   r   r/   r=   r/   r   r>   )rT   NF)r:   r+   r   r/   r*   r+   r-   r.   r=   r/   r   r   )T)r^   r+   r-   r.   rb   r/   r   r   )
r:   r+   r*   r+   r-   r.   r=   r/   r   r   )
r:   r+   rq   r+   r-   r.   r=   r/   r   r   )r   r   r   )r:   r+   r-   r.   r   r   r   r   )r:   r+   r-   r.   r   r/   )r   r+   r-   r.   r   r   r   r/   )r   r   r   r   )__name__
__module____qualname____doc__r(   r<   rC   ra   rl   r   r    r   ry   r   r   r   r~   r   rW   r)   r'   r   r   !   s           .% % % %" @E2# 2# 2# 2# 2#p $6 6 6 6 6< KO< < < < <* $6 6 6 6 6  $: : : : :, $I I I I I! ! ! !   .  37	    $"5 "5 "5 "5N  37	R R R R R<a a a a a ar)   r   )
__future__r   r   collectionsr   typingr   r   pylintr   r   pylint.constantsr	   r
   r   r   r   pylint.interfacesr   pylint.messager   pylint.typingr   pylint.utils.pragma_parserr   r   r   r   pylint.lint.pylinterr   r   rW   r)   r'   <module>r      sv  
 # " " " " "  # # # # # # ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )              # " " " " " , , , , , , ( ( ( ( ( (             .------L L L L L L L L L Lr)   