
    cB,                        d dl mZ d dlZd dlZd dl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 ej        dk    rd d	lmZ nd d	lmZ e	rd d
lmZmZ e
ee
eef         f         Z G d d          ZdS )    )annotationsN)defaultdict)Iterator)TYPE_CHECKINGDict)nodes)%INCOMPATIBLE_WITH_USELESS_SUPPRESSIONMSG_STATE_SCOPE_MODULEWarningScope)      )Literal)MessageDefinitionMessageDefinitionStorec                  l    e Zd ZdZ	 	 	 d0ddd1dZd2dZd3dZd4dZd5d"Z	 d6d7d'Z	d8d,Z
d9d.Zd:d/ZdS );	FileStatez<Hold internal state specific to the currently analyzed file.NF)is_base_filestatemodname
str | None	msg_storeMessageDefinitionStore | Nonenodenodes.Module | Noner   boolreturnNonec               H   |t          j        dt          d           |t          j        dt          d           || _        i | _        i | _        t          j        t                    | _	        i | _
        || _        |r|j        | _        nd | _        || _        || _        d S )NzZFileState needs a string as modname argument. This argument will be required in pylint 3.0   
stacklevelznFileState needs a 'MessageDefinitionStore' as msg_store argument. This argument will be required in pylint 3.0)warningswarnDeprecationWarning	base_name_module_msgs_state_raw_module_msgs_statecollectionsr   set_ignored_msgs_suppression_mapping_moduletolineno_effective_max_line_number_msgs_store_is_base_filestate)selfr   r   r   r   s        7lib/python3.11/site-packages/pylint/utils/file_state.py__init__zFileState.__init__%   s      	M?"	     	M?"	    !468:# #C(( 	 AC! 	3.2mD++.2D+$"3	 	    
msgs_storer   module_nodenodes.Modulec                   t          j        dt          d           | j                                        D ]!\  }}|                                | j        |<   "| j                                        }i | _        i | _        |j        | _	        |                                D ]5\  }}|
                    |          D ]}|                     ||||           6dS )z9Walk the AST to collect block level options line numbers.zL'collect_block_lines' has been deprecated and will be removed in pylint 3.0.r   r   N)r!   r"   r#   r%   itemscopyr&   r*   r,   r-   get_message_definitions_set_state_on_block_lines)r0   r4   r5   msglines
orig_statemsgidmsgdefs           r1   collect_block_lineszFileState.collect_block_linesM   s    	Z	
 	
 	
 	

 17799 	< 	<JC/4zz||D',,,1133
"$$&!*5*>'&,,.. 	W 	WLE5$<<UCC W W..z;PUVVVVW	W 	Wr3   nodes.NodeNGr<   r   	msg_statedict[int, bool]c                8   |                                 D ]}|                     ||||           t          |t          j        t          j        t          j        f          r|j        r|j        d         j        }n|j	        }| 
                    ||||           dS )z|Recursively walk (depth first) AST to collect block level options
        line numbers and set the state correctly.
        r   N)get_childrenr;   
isinstancer   ModuleClassDefFunctionDefbody
fromlinenor,   _set_message_state_in_block)r0   r4   r   r<   rC   childfirstchildlinenos          r1   r;   z#FileState._set_state_on_block_lines`   s     &&(( 	N 	NE**:uc9MMMM" telENE<MNOO	-		-  $y|6#}((i?OPPPPPr3   r=   rO   intc                   |j         }|j        }t          |                                          D ]H\  }}|}	||k    s||k     r|j        t
          j        k    r[||k    rd}|                    |          \  }
}|
|j         k    r/|
|k    r)|j         | j        	                    |j
        d          v r|}
n|}
|}t          |
|dz             D ]}t          |t          j                  r|j         |cxk    r|k     s1n t          |t          j                  s8|j         |cxk     r|k     r&n n#|| j        	                    |j
        d          v r||v r
||         }|}	|                     ||||	           ||= JdS )z/Set the state of a message in a block of lines.T    N)rL   r,   listr8   scoper   NODEblock_ranger%   getr?   rangerG   r   rH   _set_message_state_on_line)r0   r<   r=   r   rO   firstlastlinenostateoriginal_linenofirst_last_lines                r1   rM   z%FileState._set_message_state_in_block   s    }!%++--00 <	 <	MFE$Ov~   yL--  ,, ! E $ 0 0 8 8* do-$"22$ 4+B+F+FsyRT+U+UU$
 $F  feai00 S S #466
 !Ot
 
 
 
 7=
 
 
 
 'tU\::
 !Od
 
 
 
 6<
 
 
 
 
 d599#)RHHH
 5= +!$KE&*O//T5/RRRRfy<	 <	r3   rb   r^   r_   c                    |s|| j         |j        |f<   n"| j                             |j        |fd           	 || j        |j                 |<   dS # t          $ r ||i| j        |j        <   Y dS w xY w)z%Set the state of a message on a line.N)r*   r?   popr%   KeyError)r0   r<   rb   r^   r_   s        r1   rZ   z$FileState._set_message_state_on_line   s      	C;JD%sy$&788%))39d*;TBBB	?7<D#CI.t444 	? 	? 	?26D#CI....	?s   A A.-A.packagestatusrU   strc                0   |dk    sJ | j         sJ | j        sJ |dk    r%|                     | j        | j         |||i           n|                     ||||           	 || j        |j                 |<   dS # t          $ r ||i| j        |j        <   Y dS w xY w)zASet status (enabled/disable) for a given message at a given line.r   rb   N)r+   r.   r;   rZ   r&   r?   re   )r0   r<   rb   rg   rU   s        r1   set_msg_statuszFileState.set_msg_status   s     ax|F? 	E** $,dF^    ++CvtDDD	D;AD'	24888 	D 	D 	D6:F^D'	2222	Ds   A6 6BBstate_scopeLiteral[0, 1, 2] | Noner?   
int | Nonec                    |t           k    r\t          |t                    sJ 	 | j        ||f         }| j        ||f                             |           dS # t          $ r Y dS w xY wdS )zReport an ignored message.

        state_scope is either MSG_STATE_SCOPE_MODULE or MSG_STATE_SCOPE_CONFIG,
        depending on whether the message was disabled locally in the module,
        or globally.
        N)r
   rG   rP   r*   r)   addre   )r0   rk   r?   rb   	orig_lines        r1   handle_ignored_messagez FileState.handle_ignored_message   s     00 	dC((((( 5udmD	"E9#56::4@@@@@   	 	s   1A 
A%$A%hIterator[tuple[Literal['useless-suppression', 'suppressed-message'], int, tuple[str] | tuple[str, int]]]c              #  ~  K   | j                                         D ]P\  }}|                                D ]6\  }}|s/||f| j        vr$|t          vrd||                    |          ffV  7Qt          | j                                                  D ])\  \  }}}|D ]}d||                    |          |ffV  *d S )Nzuseless-suppressionzsuppressed-message)r&   r8   r)   r	   get_msg_display_stringrT   )r0   r4   warningr=   rb   enablefrom_ignored_liness           r1   "iter_spurious_suppression_messagesz,FileState.iter_spurious_suppression_messages  s/      #9??AA 		 		NGU %  f $t/AA  'LL
 0"99'BB8     04D4F4L4L4N4N/O/O 	 	+Wem%  *D55g>>3     	 	r3   c                    | j         S )N)r-   )r0   s    r1   get_effective_max_line_numberz'FileState.get_effective_max_line_number)  s    ..r3   )NNN)
r   r   r   r   r   r   r   r   r   r   )r4   r   r5   r6   r   r   )
r4   r   r   rB   r<   r   rC   rD   r   r   )
r<   r   r=   rD   r   rB   rO   rP   r   r   )
r<   r   rb   rP   r^   r   r_   rP   r   r   )rf   )
r<   r   rb   rP   rg   r   rU   rh   r   r   )rk   rl   r?   rh   rb   rm   r   r   )r4   r   r   rr   )r   rm   )__name__
__module____qualname____doc__r2   rA   r;   rM   rZ   rj   rq   ry   r{   rR   r3   r1   r   r   "   s       FF #37$(	& #(& & & & & &PW W W W&"Q "Q "Q "QHF F F FP? ? ? ?2 D D D D D6   $   8/ / / / / /r3   r   )
__future__r   r'   sysr!   r   collections.abcr   typingr   r   astroidr   pylint.constantsr	   r
   r   version_infor   typing_extensionspylint.messager   r   rh   rP   r   MessageStateDictr   rR   r3   r1   <module>r      sg  
 # " " " " "     



  # # # # # # $ $ $ $ $ $ & & & & & & & &                v *)))))) IHHHHHHHH T#t)_,- H/ H/ H/ H/ H/ H/ H/ H/ H/ H/r3   