
    e+                        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y)    )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y)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   c                b    |j                   }|j                  D ]  }| j                  ||        y N)iterbody._modified_iterating_check_on_node_and_children)selfnodeiter_obj	body_nodes       L/usr/lib/python3/dist-packages/pylint/checkers/modified_iterating_checker.py	visit_forz"ModifiedIterationChecker.visit_for6   s2     99 	UI??	8T	U    c                v    | j                  ||       |j                         D ]  }| j                  ||        y)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E??xP	Qr"   c                    d }t        |t        j                        rt         fd|j                  D              rlt        j                        }t        |t        j                        rd}nt        |t        j                        rd}nt        |t        j                        rld}nit        t        j                  t        j                  f      sn> j                  |      rd}n) j                  |      rd}n j                  |      rd}|r3 j                  ||j!                         ft"        j$                         y y )Nc              3  B   K   | ]  }j                  |        y wr   )_deleted_iteration_target_cond).0tr   r   s     r    	<genexpr>zEModifiedIterationChecker._modified_iterating_check.<locals>.<genexpr>J   s#      2
ABD//8<2
s   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    dELL)c 2
FJll2
 /
 ''1H(EJJ/2Hejj12Heii01Huzz5??&CD//h?.F//h?.F..tX>-F((*,%//	   r"   c                V   t        | t        j                        xr t        | j                  t        j                        xrh t        | j                  j
                  t        j                        xr8 t        | j                  j
                  j                  t        j                        S r   )	r/   r   ExprvalueCallfuncr8   exprr7   r   s    r    '_is_node_expr_that_calls_attribute_namez@ModifiedIterationChecker._is_node_expr_that_calls_attribute_named   sl     tUZZ( =4::uzz2=4::??EOO<= 4::??//<		
r"   c                    t        |t        j                        r|j                  n|j                  }|t        j                  |      k(  xr- | j                  j                  j                  j                  |k(  S r   )
r/   r   r8   attrnamenamer   r3   rC   rE   rF   )r   r   	infer_valiter_obj_names       r    _common_cond_list_setz.ModifiedIterationChecker._common_cond_list_setm   sd     (EOO4  	
 U--h77 
JJOO  %%6	
r"   c                    t        | t        j                        xrZ t        | j                  d   t        j                        xr1 t        | j                  d   j
                  t        j                        S )Nr   )r/   r   Assignr2   	SubscriptrC   r7   rG   s    r    _is_node_assigns_subscript_namez8ModifiedIterationChecker._is_node_assigns_subscript_name|   sR    $- 
t||A8 @DLLO115::>	
r"   c                8   | j                  |      syt        j                  |j                  j                  j
                        }t        |t        j                        sy| j                  |||      xr& |j                  j                  j                  t        v S NF)rH   r   r3   rC   rE   rF   r/   r   r4   rN   rJ   _LIST_MODIFIER_METHODSr   r   r   rL   s       r    r9   z6ModifiedIterationChecker._modified_iterating_list_cond   sx     ;;DA$$TZZ__%9%9:	)UZZ0&&tXyA C

((,BB	
r"   c                t   | j                  |      syt        |t        j                        r|j                  |j
                  d   j                  j                  k(  rt        |j                  j                  t        j                        rvt        |j
                  d   j                  t        j                        rE|j                  j                  j                  |j
                  d   j                  j                  k(  ryt        j                  |j
                  d   j                        }t        |t        j                        sy|t        j                  |      k7  ryt        |t        j                        r|j                  }n|j                  }|j
                  d   j                  j                  |k(  S )NFr   )rR   r/   r   r7   rK   r2   rC   parenttarget
AssignNameslicer   r3   r5   r8   rJ   )r   r   r   rL   rM   s        r    r:   z6ModifiedIterationChecker._modified_iterating_dict_cond   s0    33D9 x,a!6!6!;!;;8??1153C3CD4<<?00%**=&&++t||A/D/D/I/II$$T\\!_%:%:;	)UZZ0((22h0$--M$MMM||A$$))]::r"   c                8   | j                  |      syt        j                  |j                  j                  j
                        }t        |t        j                        sy| j                  |||      xr& |j                  j                  j                  t        v S rT   )rH   r   r3   rC   rE   rF   r/   r   r6   rN   rJ   _SET_MODIFIER_METHODSrV   s       r    r;   z5ModifiedIterationChecker._modified_iterating_set_cond   sx     ;;DA$$TZZ__%9%9:	)UYY/&&tXyA B

((,AA	
r"   c                x   t        t        j                        syt        |j                  t        j                        syt        |j                  j
                  t        j                  t        j                  f      syt        fdt        j                  |j                  j
                        D              S )NFc              3  <   K   | ]  }|j                   k(    y wr   )rK   )r*   r+   r   s     r    r,   zJModifiedIterationChecker._deleted_iteration_target_cond.<locals>.<genexpr>   s!      
 N
s   )r/   r   DelNamerX   ForrY   rZ   BaseContainerr1   r   find_assigned_names_recursive)r   r   r   s    ` r    r)   z7ModifiedIterationChecker._deleted_iteration_target_cond   s     $.(//5995OO""U%5%5u7J7J$K
  
889O9OP
 
 	
r"   N)r   z	nodes.ForreturnNone)r   nodes.NodeNGr   rf   rd   re   )r   rf   r   rf   rd   re   )r   rf   rd   bool)r   z
nodes.Exprr   nodes.Name | nodes.AttributerL   znodes.List | nodes.Setrd   rg   )r   rf   r   rh   rd   rg   )r   znodes.DelNamer   rf   rd   rg   )__name__
__module____qualname____doc__rK   msgsoptionsr   only_required_for_messagesr!   r   r$   staticmethodrH   rN   rR   r9   r:   r;   r)   r   r"   r    r   r      sg   
  D


D, G%U%%!#<>VUU
Q%Q1=Q	Q ,8	< 
 
 

.
 *
 
	
 
 
 

 
,H
	
; ;,H;	;2
 
,H
	

!
-9
	
r"   r   c                8    | j                  t        |              y r   )register_checkerr   )linters    r    registerrt      s    
4V<=r"   N)rs   r	   rd   re   )
__future__r   typingr   astroidr   pylintr   r   pylint.checkersr   pylint.lintr	   rU   r]   BaseCheckerr   rt   r   r"   r    <module>r|      sN   
 #    ' !$ #H- ) n
x33 n
b>r"   