
    zi+                        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d	dhZ G d
 dej                  ZddZdS )    )annotations)TYPE_CHECKING)nodes)checkers
interfaces)utils)PyLinterappendremoveaddc                      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       u/var/www/tmov.alphamb/tmov_inventario/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   )	r3   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   )
r3   r   r<   attrnamenamer   r7   rH   rJ   rK   )r   r!   rP   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   )r3   r   Assignr6   	SubscriptrH   r;   rL   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)rM   r   r7   rH   rJ   rK   r3   r   r8   rV   rS   _LIST_MODIFIER_METHODSr    r   r!   rP   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   )rZ   r3   r   r;   rT   r6   rH   parenttarget
AssignNameslicer   r7   r9   r<   rS   )r    r   r!   rP   rU   s        r#   r>   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\   )rM   r   r7   rH   rJ   rK   r3   r   r:   rV   rS   _SET_MODIFIER_METHODSr^   s       r#   r?   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   )rT   )r.   r/   r   s     r#   r0   zJModifiedIterationChecker._deleted_iteration_target_cond.<locals>.<genexpr>   s=       
 
 N
 
 
 
 
 
r%   )r3   r   DelNamer`   Forra   rb   BaseContainerr5   r   find_assigned_names_recursive)r    r   r!   s    ` r#   r-   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   rE   )r   rN   r!   rO   rP   rQ   r   rE   )r   r&   r!   rO   r   rE   )r   rf   r!   r&   r   rE   )__name__
__module____qualname____doc__rT   msgsoptionsr   only_required_for_messagesr$   r   r(   staticmethodrM   rV   rZ   r=   r>   r?   r-   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   )ru   s    r#   registerrx      s%    
4V<<=====r%   N)ru   r	   r   r   )
__future__r   typingr   astroidr   pylintr   r   pylint.checkersr   pylint.lintr	   r]   re   BaseCheckerr   rx   r   r%   r#   <module>r      s   
 # " " " " "                   ' ' ' ' ' ' ' ' ! ! ! ! ! ! %$$$$$$ #H- ) n
 n
 n
 n
 n
x3 n
 n
 n
b> > > > > >r%   