
    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 )NestedMinMaxCheckerzMultiple 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di((x!233 3  CN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((	

 HMTY^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    rt	          |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:;Jq%"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2488 	FYt__
/""Q&&#JO44  3 c5:.. 3 7 7?Bx7 7 7 4 4  FF/))"+ch6Q9QQ O E	 * #66zBBO /""Q&&" "*/22 	 	HCc5;// 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   
 c5;'' 	<CFcMM11  <00;;< c5;'' 	<CFcMMiM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          2J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"   