§
    öyIf  ã                  óì   — d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
 ddlmZ ddlmZmZ dd	lmZ dd
lmZ erddlmZ ej        ej        ej        ej        j        fZ G d„ de¦  «        Zdd„ZdS )z*Check for use of nested min/max functions.é    )ÚannotationsN)ÚTYPE_CHECKING)ÚnodesÚobjects)ÚContext)ÚBaseChecker)Úonly_required_for_messagesÚ
safe_infer)Ú	PY39_PLUS)Ú	INFERENCE)ÚPyLinterc                  ó„   — e Zd ZdZdZdZddiZedd
„¦   «         Zedd„¦   «         Z	 e
d¦  «        dd„¦   «         Zdd„ZdS )ÚNestedMinMaxCheckerzÇMultiple nested min/max calls on the same line will raise multiple messages.

    This behaviour is intended as it would slow down the checker to check
    for nested call with minimal benefits.
    )zbuiltins.minzbuiltins.maxÚnested_min_maxÚW3301)z@Do not use nested call of '%s'; it's possible to do '%s' insteadúnested-min-maxzHNested calls ``min(1, min(2, 3))`` can be rewritten as ``min(1, 2, 3)``.Únodeúnodes.NodeNGÚreturnÚboolc                óÌ   — t          |t          j        ¦  «        sdS t          |j        ¦  «        }t          |t          j        ¦  «        o|                     ¦   «         | j        v S )NF)Ú
isinstancer   ÚCallr
   ÚfuncÚFunctionDefÚqnameÚ
FUNC_NAMES)Úclsr   Úinferreds      úR/var/www/piapp/venv/lib/python3.11/site-packages/pylint/checkers/nested_min_max.pyÚis_min_max_callz#NestedMinMaxChecker.is_min_max_call1   sX   € å˜$¥¤
Ñ+Ô+ð 	Ø�5å˜dœiÑ(Ô(ˆå�x¥Ô!2Ñ3Ô3ð 3Ø—’Ñ Ô  C¤NÐ2ð	
ó    ú
nodes.Callúlist[nodes.Call]c                ó.   ‡ ‡— ˆ ˆfd„‰j         D ¦   «         S )Nc                ó¬   •— g | ]P}‰                      |¦  «        r9|j        j        ‰j        j        k    rt          |j        j        ¦  «        d k    ¯N|‘ŒQS )é   )r!   r   ÚnameÚlenÚparentÚargs)Ú.0Úargr   r   s     €€r    ú
<listcomp>z;NestedMinMaxChecker.get_redundant_calls.<locals>.<listcomp>>   si   ø€ ð 
ð 
ð 
àà×#Ò# CÑ(Ô(ð	
ð
 ”H”M T¤Y¤^Ò3Ð3õ ˜œ
œÑ(Ô(¨1Ò,Ð,ð ð -Ð,Ð,r"   )r+   )r   r   s   ``r    Úget_redundant_callsz'NestedMinMaxChecker.get_redundant_calls<   s6   øø€ ð
ð 
ð 
ð 
ð 
à”yð
ñ 
ô 
ð 	
r"   r   ÚNonec                ó  — |                       |¦  «        sd S |                      |¦  «        }|sd S t          j        |¦  «        }t          |¦  «        dk    r²t	          |j        ¦  «        D ]u\  }}t          |t          j        ¦  «        r!t          d„ |j        D ¦   «         ¦  «        r d S ||v r1|j        d |…         |j        z   |j        |dz   d …         z   |_         nŒv|                      |¦  «        }t          |¦  «        dk    °²t	          |j        ¦  «        D ]¦\  }}t          |t          j
        ¦  «        s‡|                      |¦  «        rrt          j        t          j        |j        dt          j        d d d d d ¬¦  «        dd¬¦  «        }||_        |j        d |…         |gz   |j        |dz   |…         z   |_        Œ§|                      d||j        j        |                     ¦   «         ft,          ¬¦  «         d S )Nr   c              3  óJ   K  — | ]}t          |t          j        ¦  «        V — Œd S ©N)r   r   ÚGeneratorExp)r,   Úas     r    ú	<genexpr>z1NestedMinMaxChecker.visit_call.<locals>.<genexpr>Y   s@   è è € ð 7ð 7Ø:;•J˜q¥%Ô"4Ñ5Ô5ð7ð 7ð 7ð 7ð 7ð 7r"   r'   )ÚlinenoÚ
col_offsetÚ
end_linenoÚend_col_offsetr*   )Úctxr7   r8   r*   r9   r:   r   )r   r+   Ú
confidence)r!   r/   Úcopyr)   Ú	enumerater+   r   r   r   ÚanyÚConstÚ_is_splattable_expressionÚStarredr   ÚLoadr7   ÚNodeNGÚvalueÚadd_messager   r(   Ú	as_stringr   )Úselfr   Úredundant_callsÚ
fixed_nodeÚir-   ÚidxÚ
splat_nodes           r    Ú
visit_callzNestedMinMaxChecker.visit_callK   s[  € à×#Ò# DÑ)Ô)ð 	ØˆFà×2Ò2°4Ñ8Ô8ˆØð 	ØˆFå”Y˜t‘_”_ˆ
Ý�/Ñ"Ô" QÒ&Ð&Ý# J¤OÑ4Ô4ð ð ‘��3õ ˜c¥5¤:Ñ.Ô.ð µ3ð 7ð 7Ø?B¼xð7ñ 7ô 7ñ 4ô 4ð ð �F�Fà˜/Ð)Ð)à"œ¨¨¨Ô+¨c¬hÑ6¸¼ÈÈQÉÈÈÔ9QÑQð ”Oð �Eð	 *ð #×6Ò6°zÑBÔBˆOõ �/Ñ"Ô" QÒ&Ð&õ" " *¤/Ñ2Ô2ð 	ð 	‰HˆC�Ý˜c¥5¤;Ñ/Ô/ð Ø×1Ò1°#Ñ6Ô6ð Ý!&¤Ý#œLØ"œzØ#$Ý$œ|Ø#'Ø'+Ø'+Ø+/Ø#'ð ñ  ô  ð $%Ø'(ð"ñ "ô "�Jð (+�JÔ$à"œ¨¨¨Ô-Ø%˜,ñ'à$œ/¨#°©'°C¨-Ô8ñ9ð ”Oøð 	×ÒØØØ”)”. *×"6Ò"6Ñ"8Ô"8Ð9Ý ð	 	ñ 	
ô 	
ð 	
ð 	
ð 	
r"   r-   c                óp  — t          |t          j        ¦  «        r?|j        dk    r4|                      |j        ¦  «        o|                      |j        ¦  «        S t          |t          j        ¦  «        rF|j        dk    r;t          r4|                      |j        ¦  «        o|                      |j        ¦  «        S t          |¦  «        }|r| 	                    ¦   «         dv rdS t          |p|t          j
        t          j        t          j        t          j        t          j        gt          ¢R ¦  «        rdS dS )zaReturns true if expression under min/max could be converted to splat
        expression.
        ú+ú|>   úbuiltins.listúbuiltins.tupleTF)r   r   ÚBinOpÚoprA   ÚleftÚrightr   r
   ÚpytypeÚListÚTupleÚSetÚListCompÚDictCompÚ
DICT_TYPES)rH   r-   r   s      r    rA   z-NestedMinMaxChecker._is_splattable_expression…   s1  € õ
 �c�5œ;Ñ'Ô'ð 	<¨C¬F°cªM¨MØ×1Ò1Ø”ñô ð <à×0Ò0°´Ñ;Ô;ð<õ �c�5œ;Ñ'Ô'ð 	<¨C¬F°cªM¨M½i¨MØ×1Ò1Ø”ñô ð <à×0Ò0°´Ñ;Ô;ð<õ ˜c‘?”?ˆØð 	˜ŸšÑ)Ô)Ð-PÐPÐPØ�4ÝØˆO˜å”
Ý”Ý”	Ý”Ý”ðõ ðð ñ

ô 

ð 	ð �4àˆur"   N)r   r   r   r   )r   r#   r   r$   )r   r#   r   r0   )r-   r   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r(   ÚmsgsÚclassmethodr!   r/   r	   rN   rA   © r"   r    r   r      s»   € € € € € ðð ð 2€Jà€Dàð 
ð€Dð ð
ð 
ð 
ñ „[ð
ð ð
ð 
ð 
ñ „[ð
ð  ÐÐ 0Ñ1Ô1ð7
ð 7
ð 7
ñ 2Ô1ð7
ðrð ð ð ð ð r"   r   Úlinterr   r   r0   c                óJ   — |                       t          | ¦  «        ¦  «         d S r3   )Úregister_checkerr   )rf   s    r    Úregisterri   §   s%   € Ø
×ÒÕ/°Ñ7Ô7Ñ8Ô8Ð8Ð8Ð8r"   )rf   r   r   r0   )rb   Ú
__future__r   r=   Útypingr   Úastroidr   r   Úastroid.constr   Úpylint.checkersr   Úpylint.checkers.utilsr	   r
   Úpylint.constantsr   Úpylint.interfacesr   Úpylint.lintr   Ú
DictValuesÚDictKeysÚ	DictItemsÚnode_classesÚDictr^   r   ri   re   r"   r    ú<module>rx      sA  ðð
 1Ð 0à "Ð "Ð "Ð "Ð "Ð "à €€€Ø  Ð  Ð  Ð  Ð  Ð  à "Ð "Ð "Ð "Ð "Ð "Ð "Ð "Ø !Ð !Ð !Ð !Ð !Ð !à 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø HÐ HÐ HÐ HÐ HÐ HÐ HÐ HØ &Ð &Ð &Ð &Ð &Ð &Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'àð %Ø$Ð$Ð$Ð$Ð$Ð$ð ÔØÔØÔØ	ÔÔð	€
ðEð Eð Eð Eð E˜+ñ Eô Eð EðP9ð 9ð 9ð 9ð 9ð 9r"   