
    e%                        d dl mZ d dl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 erd dlmZmZ eeeeef   f   Z G d	 d
      Zy)    )annotationsN)defaultdict)Iterator)TYPE_CHECKINGDictLiteral)nodes)%INCOMPATIBLE_WITH_USELESS_SUPPRESSIONMSG_STATE_SCOPE_MODULEWarningScope)MessageDefinitionMessageDefinitionStorec                      e Zd ZdZ	 ddd	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ	 d	 	 	 	 	 	 	 	 	 dd	Z	 	 	 	 	 	 	 	 dd
Z		 	 	 	 ddZ
ddZy)	FileStatez<Hold internal state specific to the currently analyzed file.NF)is_base_filestatec                   || _         i | _        i | _        t        j                  t
              | _        i | _        || _        |r|j                  | _
        nd | _
        || _        || _        y N)	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)selfmodname	msg_storenoder   s        9/usr/lib/python3/dist-packages/pylint/utils/file_state.py__init__zFileState.__init__   sr     !468:# ##C( 	 AC!.2mmD+.2D+$"3	    c                T   |j                         D ]  }| j                  ||||        t        |t        j                  t        j
                  t        j                  f      r&|j                  r|j                  d   j                  }n|j                  }| j                  ||||       y)z|Recursively walk (depth first) AST to collect block level options
        line numbers and set the state correctly.
        r   N)get_children_set_state_on_block_lines
isinstancer	   ModuleClassDefFunctionDefbody
fromlinenor   _set_message_state_in_block)r    
msgs_storer#   msg	msg_statechildfirstchildlinenos          r$   r)   z#FileState._set_state_on_block_lines8   s     &&( 	NE**:uc9M	N$ tellENNE<M<MNO		#yy|66#}}((i?OPr&   c                "   |j                   }|j                  }t        |j                               D ]Z  \  }}|}	||kD  s||k  r|j                  t
        j                  k(  rd||kD  rd}|j                  |      \  }
}|
|j                   k(  r>|
|k\  r9|j                   | j                  j                  |j                  d      v r|}
n|}
|}t        |
|dz         D ]  }t        |t        j                        r|j                   |cxk  r|k  s4n t        |t        j                        sA|j                   |cxk  r|k  r,n n)|| j                  j                  |j                  d      v r||v r||   }|}	| j                  ||||	        ||= ] y)z/Set the state of a message in a block of lines.T    N)r/   r   listitemsscoper   NODEblock_ranger   getmsgidranger*   r	   r+   _set_message_state_on_line)r    r2   linesr#   r5   firstlastlinenostateoriginal_linenofirst_last_lines                r$   r0   z%FileState._set_message_state_in_block\   s~    }}!%++-0 <	MFE$Ov~ yyL---,, E $ 0 0 8* doo-"224+B+B+F+FsyyRT+UU#F  feai0 S #46 OOt<f< 'tU\\: OOd;V;d5599#))RHH5=!$KE&*O//T5/R'S* fy<	r&   c                   |s|| j                   |j                  |f<   n(| j                   j                  |j                  |fd       	 || j                  |j                     |<   y# t        $ r ||i| j                  |j                  <   Y yw xY w)z%Set the state of a message on a line.N)r   r?   popr   KeyError)r    r2   rJ   rF   rG   s        r$   rA   z$FileState._set_message_state_on_line   s     ;JD%%syy$&78%%))399d*;TB	?7<D##CII.t4 	?26D##CII.	?s   A% %$BBc                (   |dkD  sJ |dk7  r+| j                  | j                  | j                  |||i       n| j                  ||||       	 || j                  |j
                     |<   y# t        $ r ||i| j                  |j
                  <   Y yw xY w)zASet status (enabled/disable) for a given message at a given line.r   rJ   N)r)   r   r   rA   r   r?   rM   )r    r2   rJ   statusr;   s        r$   set_msg_statuszFileState.set_msg_status   s     axxF?**  $,,dF^ ++CvtD	D;AD''		248 	D6:F^D''		2	Ds   A* *$BBc                    |t         k(  rEt        |t              sJ 	 | j                  ||f   }| j                  ||f   j                  |       yy# t        $ r Y yw xY w)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   r*   intr   r   addrM   )r    state_scoper?   rJ   	orig_lines        r$   handle_ignored_messagez FileState.handle_ignored_message   sm     00dC((( 55udmD	""E9#56::4@ 1  s   1A 	AAc              #    K   | j                   j                         D ]Q  \  }}|j                         D ]9  \  }}|r	||f| j                  vs|t        vs#d||j	                  |      ff ; S t        | j                  j                               D ]'  \  \  }}}|D ]  }d||j	                  |      |ff  ) y w)Nzuseless-suppressionzsuppressed-message)r   r:   r   r
   get_msg_display_stringr9   )r    r1   warningrB   rJ   enablefrom_ignored_liness           r$   "iter_spurious_suppression_messagesz,FileState.iter_spurious_suppression_messages   s      #99??A 		NGU % f $t/A/AA'LL/"99'B8  		 04D4F4F4L4L4N/O 	+Wem% *D55g>3  	s   9B?B?B?A)B?c                    | j                   S r   )r   )r    s    r$   get_effective_max_line_numberz'FileState.get_effective_max_line_number   s    ...r&   r   )
r!   strr"   r   r#   znodes.Module | Noner   boolreturnNone)
r1   r   r#   nodes.NodeNGr2   r   r3   dict[int, bool]rb   rc   )
r2   r   rB   re   r#   rd   r5   rR   rb   rc   )
r2   r   rJ   rR   rF   ra   rG   rR   rb   rc   )package)
r2   r   rJ   rR   rO   ra   r;   r`   rb   rc   )rT   zLiteral[0, 1, 2] | Noner?   r`   rJ   
int | Nonerb   rc   )r1   r   rb   zhIterator[tuple[Literal['useless-suppression', 'suppressed-message'], int, tuple[str] | tuple[str, int]]])rb   rg   )__name__
__module____qualname____doc__r%   r)   r0   rA   rP   rV   r]   r_   r7   r&   r$   r   r      sw   F %)	 #( * "	   
4"Q*"Q "Q 	"Q
 #"Q 
"QHFF F 	F
 F 
FP?? ? 	?
 ? 
?2 DD D 	D
 D 
D.2;>FP	$*
8/r&   r   )
__future__r   r   r   collections.abcr   typingr   r   r   astroidr	   pylint.constantsr
   r   r   pylint.messager   r   r`   rR   ra   MessageStateDictr   r7   r&   r$   <module>rs      sT   
 #  # $ / /   H T#t)_,- c/ c/r&   