
    e                        d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ  G d d	ej                        Zdd
Zy)zPOptional checker to warn when loop variables are overwritten in the loop's body.    )annotations)nodes)checkers)utils)HIGH)PyLinterc                       e Zd ZdZddiZd fdZ ej                  d      d	d       Z ej                  d      d
d       Z	 ej                  d      d
d       Z
 xZS )RedefinedLoopNameCheckerredefined-loop-nameW2901)z!Redefining %r from loop (line %s)r   z:Used when a loop variable is overwritten in the loop body.c                2    t         |   |       g | _        y N)super__init___loop_variables)selflinter	__class__s     G/usr/lib/python3/dist-packages/pylint/extensions/redefined_loop_name.pyr   z!RedefinedLoopNameChecker.__init__   s       	    c                z   |j                         }t        |t        j                  t        j                  f      sy |j                         }| j                  D ]a  \  }}}||ur|j                  |v st        j                  ||      r2| j                  d|j                  |j                  f|t                y  y Nr   )argsnode
confidence)assign_type
isinstancer   Assign	AugAssignscoper   namer   in_for_else_branchadd_message
fromlinenor   )r   r   r   
node_scope	outer_forouter_variablesouter_for_scopes          r   visit_assignnamez)RedefinedLoopNameChecker.visit_assignname"   s    &&(+eoo'FGZZ\
;?;O;O 	7I0yyO+E4L4L45   )))Y%9%9:#	 !  	r   c                R   |j                   j                  t        j                        D cg c]  }|j                   }}|D cg c]3  }| j
                  j                  j                  j                  |      s|5 }}|j                         }|D ]^  }| j                  D ]M  \  }}}	||	ur||v st        j                  ||      r(| j                  d||j                  f|t                ^ ` | j                  j!                  |||j                         f       y c c}w c c}w r   )targetnodes_of_classr   
AssignNamer!   r   configdummy_variables_rgxmatchr    r   r   r"   r#   r$   r   append)
r   r   aassigned_tovarr%   variabler&   r'   r(   s
             r   	visit_forz"RedefinedLoopNameChecker.visit_for6   s'   '+{{'A'A%BRBR'ST!qvvTT #
;;%%99??D 
 
 ZZ\
# 	H?C?S?S ;	?O_4.u7O7Ot8 $$-&	(<(<=!#'	 %  	 	##T;

$EF1 U
s   D8D$c                8    | j                   j                          y r   )r   pop)r   r   s     r   	leave_forz"RedefinedLoopNameChecker.leave_forR   s      "r   r   r   returnNone)r   znodes.AssignNamer;   r<   )r   z	nodes.Forr;   r<   )__name__
__module____qualname__r!   msgsr   r   only_required_for_messagesr)   r6   r9   __classcell__)r   s   @r   r
   r
      s     D 	 
D &U%%&;< =& &U%%&;<G =G6 &U%%&;<# =#r   r
   c                8    | j                  t        |              y r   )register_checkerr
   )r   s    r   registerrE   W   s    
4V<=r   Nr:   )__doc__
__future__r   astroidr   pylintr   pylint.checkersr   pylint.interfacesr   pylint.lintr   BaseCheckerr
   rE    r   r   <module>rO      s7   
 W "   ! "  C#x33 C#L>r   