
    zi                        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      i/var/www/tmov.alphamb/tmov_inventario/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                r    g | ]3}                     |          r|j        j        j        j        k    1|4S  )r!   r   name).0argr   r   s     r    
<listcomp>z;NestedMinMaxChecker.get_redundant_calls.<locals>.<listcomp>>   sN     
 
 
""3''
 -0HMTY^,K,K ,K,K,Kr"   )args)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>R   s@       7 7:;Jq%"4557 7 7 7 7 7r"      )lineno
col_offset
end_linenoend_col_offsetparent)ctxr6   r7   r:   r8   r9   r   )r   r,   
confidence)r!   r-   copylen	enumerater,   r   r   r   anyConst_is_splattable_expressionStarredr   Loadr6   NodeNGvalueadd_messager   r(   	as_stringr   )selfr   redundant_calls
fixed_nodeir*   idx
splat_nodes           r    
visit_callzNestedMinMaxChecker.visit_callD   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oprB   leftrightr   r
   pytypeListTupleSetListCompDictComp
DICT_TYPES)rI   r*   r   s      r    rB   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   r.   )r*   r   r   r   )__name__
__module____qualname____doc__r   r(   msgsclassmethodr!   r-   r	   rO   rB   r'   r"   r    r   r      s          2JD 
D 
 
 
 [
 
 
 
 [
   0117
 7
 7
 217
r     r"   r   linterr   r   r.   c                J    |                      t          |                      d S r1   )register_checkerr   )rf   s    r    registerri      s%    
/7788888r"   )rf   r   r   r.   )rc   
__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   r'   r"   r    <module>rx      sA  
 1 0 " " " " " "              " " " " " " " " ! ! ! ! ! ! ' ' ' ' ' ' H H H H H H H H & & & & & & ' ' ' ' ' ' %$$$$$$ 		
~ ~ ~ ~ ~+ ~ ~ ~B9 9 9 9 9 9r"   