§
    ÷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ÐD¨u�z˜%¥¤Ñ*Ô*Ð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  € åˆtŒy‰>Œ>˜QÒÐØˆFÝ˜$œ) Aœ,­¬Ñ1Ô1ð 	ØˆFå˜4œ9 Qœ<×4Ò4Ñ6Ô6Ñ7Ô7ˆÝÐDÐD¸ÐDÑDÔDÑDÔDð 	ð ˆFà×+Ò+Ñ-Ô-ˆà×-Ò-¨d°KÀÑQÔQð 		Ø /Ô 5Ô :ÐØ#×;Ò;¸DÐBSÑTÔTÐØ×ÒØ+ØØ%Ýð	 ñ ô ð ð ˆFà×*Ò*¨;¸ÑHÔHð 		Ø /Ô 5Ô ;ÐØ#×;Ò;¸DÐBSÑ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 )zõDetect 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Ä<Ñ5PÔ5PÐQ˜1Ð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ÐQ kÐQÑQÔQˆØð 	à�5ð ' qÔ)Ô1°!Ô4ˆØ-Ô5°aÔ8Ðõ �|¥UÔ%5Ñ6Ô6ð	åÐ-­uÔ/?Ñ@Ô@ð	ð �5à 0Ô 8¸Ô ;Ô @ÐàÔÐ!6Ò6ð DÝ˜?­E¬LÑ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 )zèWhen 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°I´LÀEÒ4IÐ4Ià!Ô)ˆIØ*;Ð!J  ÀÐÐà.?Ð!J  ÀUÐà×"Ò"Ñ$Ô$ˆØ$ÐLÐL tÐ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   