
    yIfF                        d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
 erd dlmZ ddhZh d	Z G d
 dej                  ZddZdS )    )annotations)TYPE_CHECKING)nodes)checkers
interfaces)utils)PyLinterappendremove>   addpopclearr   discardc                      e Zd ZdZdZddddZdZ ej        dd	d
          d#d            Z	d$dZ
d%dZed&d            Zed'd            Zed&d            Zd(dZd(dZd(dZd)d!Zd"S )*ModifiedIterationCheckerzChecks for modified iterators in for loops iterations.

    Currently supports `for` loops for Sets, Dictionaries and Lists.
    modified_iteration)zkIterated list '%s' is being modified inside for loop body, consider iterating through a copy of it instead.modified-iterating-listzEmitted when items are added or removed to a list being iterated through. Doing so can result in unexpected behaviour, that is why it is preferred to use a copy of the list.)z`Iterated dict '%s' is being modified inside for loop body, iterate through a copy of it instead.modified-iterating-dictziEmitted when items are added or removed to a dict being iterated through. Doing so raises a RuntimeError.)z_Iterated set '%s' is being modified inside for loop body, iterate through a copy of it instead.modified-iterating-setzhEmitted when items are added or removed to a set being iterated through. Doing so raises a RuntimeError.)W4701E4702E4703 r   r   r   node	nodes.ForreturnNonec                T    |j         }|j        D ]}|                     ||           d S N)iterbody._modified_iterating_check_on_node_and_children)selfr   iter_obj	body_nodes       ^/var/www/piapp/venv/lib/python3.11/site-packages/pylint/checkers/modified_iterating_checker.py	visit_forz"ModifiedIterationChecker.visit_for6   sC     9 	U 	UI??	8TTTT	U 	U    r%   nodes.NodeNGr$   c                    |                      ||           |                                D ]}|                     ||           dS )zFSee if node or any of its children raises modified iterating messages.N)_modified_iterating_checkget_childrenr"   )r#   r%   r$   childs       r&   r"   zGModifiedIterationChecker._modified_iterating_check_on_node_and_children>   s\     	&&y(;;;++-- 	Q 	QE??xPPPP	Q 	Qr(   c                    d }t          |t          j                  rt           fd|j        D                       rkt          j                  }t          |t          j                  rd}nt          |t          j                  rd}nt          |t          j	                  rd}nqt          t          j
        t          j        f          snJ                     |          rd}n1                     |          rd}n                     |          rd}|r8                     ||                                ft"          j                   d S d S )Nc              3  D   K   | ]}                     |          V  d S r   )_deleted_iteration_target_cond).0tr$   r#   s     r&   	<genexpr>zEModifiedIterationChecker._modified_iterating_check.<locals>.<genexpr>J   sD       2
 2
ABD//8<<2
 2
 2
 2
 2
 2
r(   r   r   r   )r   args
confidence)
isinstancer   Deleteanytargetsr   
safe_inferListDictSetName	Attribute_modified_iterating_list_cond_modified_iterating_dict_cond_modified_iterating_set_condadd_message	repr_namer   	INFERENCE)r#   r   r$   msg_idinferreds   ` `  r&   r+   z2ModifiedIterationChecker._modified_iterating_checkF   s    dEL)) 	.c 2
 2
 2
 2
 2
FJl2
 2
 2
 /
 /
 	. '11H(EJ// 22Hej11 22Hei00 21Huz5?&CDD 	.//h?? 	..FF//h?? 	..FF..tX>> 	.-F 	((**,%/	      	 	r(   boolc                   t          | t          j                  okt          | j        t          j                  oLt          | j        j        t          j                  o(t          | j        j        j        t          j                  S r   )	r6   r   ExprvalueCallfuncr?   exprr>   r   s    r&   '_is_node_expr_that_calls_attribute_namez@ModifiedIterationChecker._is_node_expr_that_calls_attribute_named   sc     tUZ(( =4:uz22=4:?EO<<= 4:?/<<		
r(   
nodes.Exprnodes.Name | nodes.Attribute	infer_valnodes.List | nodes.Setc                    t          |t          j                  r|j        n|j        }|t          j        |          k    o| j        j        j	        j        |k    S r   )
r6   r   r?   attrnamenamer   r:   rK   rM   rN   )r   r$   rS   iter_obj_names       r&   _common_cond_list_setz.ModifiedIterationChecker._common_cond_list_setm   s[     (EO44H 	
 U-h777 
JO %6	
r(   c                    t          | t          j                  oNt          | j        d         t          j                  o)t          | j        d         j        t          j                  S )Nr   )r6   r   Assignr9   	SubscriptrK   r>   rO   s    r&   _is_node_assigns_subscript_namez8ModifiedIterationChecker._is_node_assigns_subscript_name|   sN    $-- 
t|A88 @DLO15:>>	
r(   c                   |                      |          sdS t          j        |j        j        j                  }t          |t          j                  sdS | 	                    |||          o|j        j        j
        t          v S NF)rP   r   r:   rK   rM   rN   r6   r   r;   rY   rV   _LIST_MODIFIER_METHODSr#   r   r$   rS   s       r&   r@   z6ModifiedIterationChecker._modified_iterating_list_cond   s     ;;DAA 	5$TZ_%9::	)UZ00 	5&&tXyAA C
(,BB	
r(   c                   |                      |          sdS t          |t          j                  r|j        |j        d         j        j        k    rzt          |j        j        t          j	                  rVt          |j        d         j
        t          j                  r,|j        j        j        |j        d         j
        j        k    rdS t          j        |j        d         j                  }t          |t          j                  sdS |t          j        |          k    rdS t          |t          j                  r|j        }n|j        }|j        d         j        j        |k    S )NFr   )r]   r6   r   r>   rW   r9   rK   parenttarget
AssignNameslicer   r:   r<   r?   rV   )r#   r   r$   rS   rX   s        r&   rA   z6ModifiedIterationChecker._modified_iterating_dict_cond   s4    33D99 	5 x,,	a!6!;;;8?153CDD <4<?0%*== < &+t|A/D/III5$T\!_%:;;	)UZ00 	5(22225h00 	*$-MM$MM|A$)]::r(   c                   |                      |          sdS t          j        |j        j        j                  }t          |t          j                  sdS | 	                    |||          o|j        j        j
        t          v S r_   )rP   r   r:   rK   rM   rN   r6   r   r=   rY   rV   _SET_MODIFIER_METHODSra   s       r&   rB   z5ModifiedIterationChecker._modified_iterating_set_cond   s     ;;DAA 	5$TZ_%9::	)UY// 	5&&tXyAA B
(,AA	
r(   nodes.DelNamec                P   t          t          j                  sdS t          |j        t          j                  sdS t          |j        j        t          j        t          j        f          sdS t          fdt          j
        |j        j                  D                       S )NFc              3  .   K   | ]}|j         k    V  d S r   )rW   )r1   r2   r   s     r&   r3   zJModifiedIterationChecker._deleted_iteration_target_cond.<locals>.<genexpr>   s=       
 
 N
 
 
 
 
 
r(   )r6   r   DelNamerc   Forrd   re   BaseContainerr8   r   find_assigned_names_recursive)r#   r   r$   s    ` r&   r0   z7ModifiedIterationChecker._deleted_iteration_target_cond   s     $.. 	5(/5955 	5O"U%5u7J$K
 
 	 5 
 
 
 
89OPP
 
 
 
 
 	
r(   N)r   r   r   r   )r%   r)   r$   r)   r   r   )r   r)   r$   r)   r   r   )r   r)   r   rH   )r   rQ   r$   rR   rS   rT   r   rH   )r   r)   r$   rR   r   rH   )r   ri   r$   r)   r   rH   )__name__
__module____qualname____doc__rW   msgsoptionsr   only_required_for_messagesr'   r"   r+   staticmethodrP   rY   r]   r@   rA   rB   r0   r   r(   r&   r   r      s`        
  D


 D, G%U%!#<>V U U U U
Q Q Q Q   < 
 
 
 \
 
 
 
 \
 
 
 
 \

 
 
 
; ; ; ;2
 
 
 

 
 
 
 
 
r(   r   linterr	   r   r   c                J    |                      t          |                      d S r   )register_checkerr   )rx   s    r&   registerr{      s%    
4V<<=====r(   N)rx   r	   r   r   )
__future__r   typingr   astroidr   pylintr   r   pylint.checkersr   pylint.lintr	   r`   rh   BaseCheckerr   r{   r   r(   r&   <module>r      s   
 # " " " " "                   ' ' ' ' ' ' ' ' ! ! ! ! ! ! %$$$$$$ #H- DDD n
 n
 n
 n
 n
x3 n
 n
 n
b> > > > > >r(   