
    yIf                        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
mZmZ ddlmZ erddlmZ  G d	 d
e          ZddZdS )z;Check for use of for loops that only check for a condition.    )annotations)TYPE_CHECKING)nodes)BaseChecker)assigned_boolonly_required_for_messagesreturns_bool)HIGH)PyLinterc                      e Zd ZdZddiZ ed          dd            Zedd            Zedd            Z	edd            Z
dS )ConsiderUsingAnyOrAllCheckerconsider-using-any-or-allC0501)z`for` loop could be `%s`r   zYA for loop that checks for a condition and return a bool can be replaced with any or all.node	nodes.ForreturnNonec                   t          |j                  dk    rd S t          |j        d         t          j                  sd S t          |j        d                                                   }t          d |D                       rd S |                                }| 	                    |||          rB|j
        j        }|                     ||          }|                     d||t                     d S |                     ||          rB|j
        j
        }|                     ||          }|                     d||t                     d S d S )N   r   c              3  J   K   | ]}t          |t          j                  V  d S N)
isinstancer   If).0childs     Q/var/www/piapp/venv/lib/python3.11/site-packages/pylint/extensions/for_any_all.py	<genexpr>z9ConsiderUsingAnyOrAllChecker.visit_for.<locals>.<genexpr>+   s.      DDuz%**DDDDDD    r   )r   args
confidence)lenbodyr   r   r   listget_childrenanynext_sibling_assigned_reassigned_returnedvaluename_build_suggested_stringadd_messager
   _if_statement_returns_bool)selfr   if_childrennode_after_loopfinal_return_boolsuggested_strings         r   	visit_forz&ConsiderUsingAnyOrAllChecker.visit_for#   sq   ty>>QF$)A,11 	F49Q<446677DDDDDDD 	 F++----dKQQ 		 / 5 :#;;DBSTT+%	     F**;HH 		 / 5 ;#;;DBSTT+%	     F		 		r   r.   list[nodes.NodeNG]r/   nodes.NodeNGboolc                x    t          |           dk    sdS t          | d                   sdS t          |          S )zDetect for-loop, if-statement, return pattern:

        Ex:
            def any_uneven(items):
                for item in items:
                    if not item % 2 == 0:
                        return True
                return False
           Fr   )r!   r	   )r.   r/   s     r   r,   z7ConsiderUsingAnyOrAllChecker._if_statement_returns_boolH   sE     ;1$$5KN++ 	5 O,,,r   c                   |                                  }t          |          sdS d |D             }|sdS |d         j        d         }|j        d         }t          |t          j                  rt          |t          j                  sdS |j        d         j        }|j        |k    oHt          |t          j                  o.t          |j        t          j	                  o|j        j        |k    S )al  Detect boolean-assign, for-loop, re-assign, return pattern:

        Ex:
            def check_lines(lines, max_chars):
                long_line = False
                for line in lines:
                    if len(line) > max_chars:
                        long_line = True
                    # no elif / else statement
                return long_line
        Fc                F    g | ]}t          |t          j                  |S  )r   r   Assign)r   xs     r   
<listcomp>zNConsiderUsingAnyOrAllChecker._assigned_reassigned_returned.<locals>.<listcomp>s   s)    QQQZ5<5P5PQ1QQQr   r   )
previous_siblingr   targetsr   r   
AssignNamer)   Returnr(   Name)r   r.   r/   node_before_loopassign_childrenfirst_targettarget_before_loopnode_before_loop_names           r   r'   z:ConsiderUsingAnyOrAllChecker._assigned_reassigned_returned^   s     0022-.. 	5QQkQQQ 	5 'q)1!4-5a8 |U%566	-u/?@@	 5 0 8 ; @!66 D?EL99D?0%*==D  %*.CC		
r   r0   strc                t   | j                                         }| j                                        }t          | j        d                                                   }t          |t          j                  r|j	        dk    r|j
        }|rdnd}n|rdnd}|                                }| d| d| d	| d
S )zWhen a nodes.For node can be rewritten as an any/all statement, return a
        suggestion for that statement.

        'final_return_bool' is the boolean literal returned after the for loop if all
        conditions fail.
        r   notallznot allznot anyr%   (z for z in ))target	as_stringiternextr"   r$   r   r   UnaryOpopoperand)r   r0   loop_var	loop_iter	test_nodesuggested_functiontests          r   r*   z4ConsiderUsingAnyOrAllChecker._build_suggested_string   s     ;((**I''))	1224455	i// 	KILE4I4I!)I*;!J.?!JU""$$$LLtLL(LL	LLLLr   N)r   r   r   r   )r.   r3   r/   r4   r   r5   )r   r   r.   r3   r/   r4   r   r5   )r   r   r0   r5   r   rH   )__name__
__module____qualname__r)   msgsr   r2   staticmethodr,   r'   r*   r:   r   r   r   r      s        &D 
D   ;<<" " " =<"H - - - \-* )
 )
 )
 \)
V M M M \M M Mr   r   linterr   r   r   c                J    |                      t          |                      d S r   )register_checkerr   )r_   s    r   registerrb      s%    
8@@AAAAAr   N)r_   r   r   r   )__doc__
__future__r   typingr   astroidr   pylint.checkersr   pylint.checkers.utilsr   r   r	   pylint.interfacesr
   pylint.lint.pylinterr   r   rb   r:   r   r   <module>rk      s  
 B A " " " " " "                   ' ' ' ' ' '         
 # " " " " " .------EM EM EM EM EM; EM EM EMPB B B B B Br   