
    X-Ph:                    D   U d Z ddlmZ ddlmZmZ ddlZddlZddl	Zddl
mZ ddlmZmZmZmZmZmZmZmZ ddlmZ ddlmZ dd	lmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d
hZ&de'd<   h dZ(de'd<   dZ)de'd<    G d de          Z*	 d%d&dZ+d'dZ,d(dZ-d)d Z.d*d"Z/d+d$Z0dS ),z<Plugin for supporting the functools standard library module.    )annotations)Final
NamedTupleN)map_actuals_to_formals)ARG_POS	ARG_STAR2SYMBOL_FUNCBASE_TYPESArgKindArgumentCallExprNameExprVar)add_method_to_class)get_all_type_vars)AnyTypeCallableTypeInstance
OverloadedParamSpecFlavorParamSpecTypeType	TypeOfAnyTypeVarTypeUnboundType	UnionTypeget_proper_typezfunctools.total_orderingr   functools_total_ordering_makers>   __ge____gt____le____lt___ORDERING_METHODSzfunctools.partialPARTIALc                  $    e Zd ZU ded<   ded<   dS )_MethodInfobool	is_staticr   typeN)__name__
__module____qualname____annotations__     V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypy/plugins/functools.pyr%   r%   -   s'         OOOr.   r%   Fctxmypy.plugin.ClassDefContextauto_attribs_defaultr&   returnc                  
 t          |           

s"| j                            d| j                   dS t	          

fd          }
|         }|sdS t          |          }| j                            d          }|}|j        j        | j                            d          k    rkt          |j        j                  }t          |t                    r$|j                            d          d         dk    st          t          j                  }t"          D ]Z}
                    |          sCt'          t)          d	|          |d
t*                    g}	t-          | j        | j        ||	|           [dS )zFAdd dunder methods to classes decorated with functools.total_ordering.zNNo ordering operation defined when using "functools.total_ordering": < > <= >=Tc                    |          d u | fS Nr-   )kcomparison_methodss    r/   <lambda>z9functools_total_ordering_maker_callback.<locals>.<lambda>?   s    2DQ2G42OQR1S r.   )keyzbuiltins.bool.r&   otherN)_analyze_classapifailreasonmax_find_other_type
named_typer(   ret_typer   
isinstancer   namesplitr   r   implementation_artifactr"   getr   r   r   r   cls)r0   r2   rootroot_method
other_type	bool_typerE   proper_ret_typeadditional_opargsr8   s             @r/   'functools_total_ordering_maker_callbackrS   2   s    (,, \J	
 	
 	
 t !'S'S'S'STTTD$T*K t!+..J""?33IH CG$6$6$G$GGG)+*:*CDD44	B$**3//3v==y@AAH* Q Q "%%m44 	QS*55z4QQRD-xPPP4r.   methodr   c                   | j         rdnd}d}d}t          | j        j        | j        j                  D ]8\  }}|                                r||k    r|} n|dz  })|t          k    r|} n9|t          t          j	                  S |S )z?Find the type of the ``other`` argument in a comparison method.r      N)
r'   zipr(   	arg_kinds	arg_typesis_positionalr   r   r   rI   )rT   first_arg_poscur_pos_arg	other_argarg_kindarg_types         r/   rC   rC   Y   s    )0AAqMKI!&+"79NOO 	 	(!!## 	m++$	1KK"" IE # y8999r.   dict[str, _MethodInfo | None]c                   i }| j         j        j        dd         D ]}t          D ]}||j        v r||vr|j        |         j        }t          |t                    r8t          |j        t                    rt          |j        |j                  ||<   nt          |t                    rBt          |j                  }t          |t                    rt          |j        |          ||<   d||<   ˌ|S )zMAnalyze the class body, its parents, and return the comparison methods found.Nr<   )rK   infomror"   namesnoderF   r	   r(   r   r%   r'   r   r   is_staticmethod)r0   r8   rK   rG   re   proper_types         r/   r>   r>   o   s	    9;w|$ 0 0% 	0 	0Dsy  T1C%C%Cy+d$9:: z$)Ua?b?b /:4>49/U/U&t,dC(( !"1$)"<"<K!+|<< !3>t?SU`3a3a*40 +/"4(	0 r.   mypy.plugin.FunctionContextc                   t          | j        t          j        j                  s| j        S t          | j                  dk    r| j        S t          | j        d                   dk    r| j        S t          t          | j        d         d                   t                    r| j        S t          | | j        d         d                   S )z6Infer a more precise return type for functools.partial   r   rV   )callee)rF   r?   mypycheckerTypeCheckerdefault_return_typelenrY   r   r   handle_partial_with_calleer0   s    r/   partial_new_callbackrs      s    cgt|788 '&&
3=Q&&
3=!!&&/#-"21"566
CC '&&%c#-2B12EFFFFr.   rk   c           
         t           j        t          j        j                  s j        S t          t          |          x}t                    r%t          j         fd|j	        D                       S  j        
                    | j                  }| j        S |                                                                } j        j        d         }|                                s) j                            t           |j        g          }d}n|j        }d  j        j        d<   d}g }g g }g t%                      }	t'           j        dd          d          D ]\  }
}t'          |          D ]\  }}||	v r
|	                    |           |                    |                                j        |
         |                    |                     j        |
         |                                         j        |
         |                    t5          ||j        |j        fd	          }t%                      t'          |j                  D ]:\  }
}||
         s                    d
 t9          |          D                        ;|                    d |j        D             |fd|j        D             d          }|j        dk     r|                      j                   tC           j        d         d         ||t           j"        tB                    r j"        j#        nd           }|                      j"                    j        j$        %                    ||||          \  }}|s| j        j        d<   t          |          }t          |tL                    s j        S |rft          |j                  }t          |tN                    r|j(        j)        t           k    r j        S |                    |j        d                   }g }g }g }t'          |          D ]\  }
}tU          |j                  tU          |j                  k    rE|j        |
         }t          j        +                    | j        j,                  s|j        |
         }n|j        |
         }|r%|j        |
         tZ          j.        tZ          j/        fv rV|                    |j        |
                    |                    |           |                    |j        |
                    |sJ ta          fd|D                       r |d                  }|tZ          j1        k    s|tZ          j/        k    rtZ          j2        }|                    |           |                    |           |                    |j        |
                    |j        }t          j        +                    | j        j,                  s|j        }|                    ||||d          } j                            t           |g          }|3                    d|          }|4                                ry|j5        J |j5        6                                }tZ          j.        v r|j7                            d           tZ          j/        v r|j7                            d           ||_5        |S )Nc                0    g | ]}t          |          S r-   )rq   ).0itemr0   s     r/   
<listcomp>z.handle_partial_with_callee.<locals>.<listcomp>   s$    SSSt'T22SSSr.   rr   r<   TFrV   )startc                    |          S r6   r-   )iactual_typess    r/   r9   z,handle_partial_with_callee.<locals>.<lambda>   s    ,q/ r.   )actual_kindsactual_namesformal_kindsformal_namesactual_arg_typec                    h | ]	}|j         
S r-   )id)rv   tvs     r/   	<setcomp>z-handle_partial_with_callee.<locals>.<setcomp>   s    JJJbeJJJr.   c                    g | ]<}|t           j        k    rt           j        n|t           j        k    rt           j        n|=S r-   )r
   r   ARG_OPT	ARG_NAMEDARG_NAMED_OPT)rv   r7   s     r/   rx   z.handle_partial_with_callee.<locals>.<listcomp>   sU     
 
 
  '' /0G4E/E/Eg++1	
 
 
r.   c                P    g | ]"}|j         v st          |t                     |#S r-   )r   rF   r   )rv   r   can_infer_idss     r/   rx   z.handle_partial_with_callee.<locals>.<listcomp>   sA     
 
 
u%%ZK-H-H%  &%%r.   partial)rX   rE   	variablesspecial_sigr   )rk   rR   rX   	arg_namesanalyzedrk   rR   rX   r   context)rE   c              3  X   K   | ]$}|         t           j        t           j        fv V  %d S r6   )r
   r   ARG_STAR)rv   jactual_arg_kindss     r/   	<genexpr>z-handle_partial_with_callee.<locals>.<genexpr>$  s9      __RS#A&7?G<L*MM______r.   )rY   rX   r   rE   r   __mypy_partial#__mypy_partial_paramspec_args_bound%__mypy_partial_paramspec_kwargs_bound)8rF   r?   rl   rm   rn   ro   r   r   
make_unionitemsextract_callable_typewith_unpacked_kwargswith_normalized_var_argstype_contextis_type_objnamed_generic_typer#   rE   set	enumeraterR   addappendrX   r   rY   r   updater   copy_modifiedr   lineset_liner   r   r   expr_checker
check_callr   r   r(   fullnamerp   is_valid_inferred_typeoptionsr
   r   r   anyr   r   copy_with_extra_attr
param_specextra_attrscopy	immutable)r0   rk   callee_properfn_typelast_contextrE   wrapped_returnactual_argsactual_arg_names	seen_argsr{   paramr   aformal_to_actualr_   	defaulted	call_expr_boundpartial_kindspartial_typespartial_namesactualskindpartially_appliedretattrsr   r|   r   s   `                           @@@r/   rq   rq      s^   cgt|788 '&&?6#:#::-IFF 
#SSSS}?RSSS
 
 	
 g++F8O+PPG&& **,,EEGGG7'+L    33Gg>N=OPP# $(R  KLIchqrrl!444 5 55e$$ 	5 	5DAqI~~  MM!q!!!##CM!$4Q$7888##CM!$4Q$7888a 0 34444	5 .%%&&1111   EEM !233 L L8" 	JJ.?.I.IJJJKKKK %%
 
 &
 
 
 
 
 
 
'
 
 
 ! &  I$ ~32333 x{1~"")3CK)J)JT%%PT  I s{###w#.."" /  HAu  0#/R E""Ee\** '&& ?"5>22(H-- 	+1G71R1R**##X]1-=#>>MMM   011 7 7
7u3w'8#9#999q)H<66xQQ 0",Q/ (+H 	7'+A.73CWEV2WWW  !21!5666  ***  !21!56666NNN____W^_____ #GAJ/Dw(((DG4E,E,E,  &&&  ***  !21!56666~H<..xII $#-- .   '
$
$Wxj
9
9C

"
"#35F
G
GC##%%  ***$$&&///O EFFF 000O GHHHJr.   mypy.plugin.MethodContextc                p   t          | j        t          j        j                  rSt          | j        t                    r9| j        j        j        t          k    s| j        j	        rd| j        j	        j
        vr| j        S | j        j	        }t          |j
        d                   }t          | j                  dk    r| j        S g }g }g }t                      }t!          | j                  D ]\  }}t!          |          D ]\  }	}
|
|v r
|                    |
           |                    |
           |                    | j        |         |	                    |                    | j        |         |	                    | j        j                            ||||| j                  \  }}t          |t2                    r|                                |S d|j        v }d|j        v }d |D             }t9          d |D                       }|s.|s,| j        j        j                            || j        |           n.|r,|r*| j        j        j                            || j                   t9          d	 |D                       }|s-|s+| j        j        j                            || j        |           |S )
z@Infer a more precise return type for functools.partial.__call__.r      r   Nr   r   c                    g | ]\}t          |t                    t          |j        t                    1t          |j        j        t
                    P|j        j        ]S r-   )rF   r   re   r   r(   r   )rv   args     r/   rx   z)partial_call_callback.<locals>.<listcomp>s  sj       c8$$ sx%%	
 sx}m44  r.   c              3  @   K   | ]}|j         t          j        k    V  d S r6   )flavorr   ARGSrv   parts     r/   r   z(partial_call_callback.<locals>.<genexpr>{  s,      ]]ddk_%99]]]]]]r.   c              3  @   K   | ]}|j         t          j        k    V  d S r6   )r   r   KWARGSr   s     r/   r   z(partial_call_callback.<locals>.<genexpr>  s,      aa$'==aaaaaar.   ) rF   r?   rl   rm   rn   r(   r   r   r#   r   r   ro   r   rp   rY   r   r   rR   r   r   rX   r   r   r   r   r   r   r   r   msgtoo_few_argumentstoo_many_arguments)r0   r   partial_typer   r   r   r   r{   r   r   r   resultr   
args_boundkwargs_boundpassed_paramspec_partsargs_passedkwargs_passeds                     r/   partial_call_callbackr   H  s    sw 899'#(H--' 8=!W,,x# -38#7#===&&(&K";#45E#FGGL
3=Q&& KIch'' 9 95e$$ 	9 	9DAqI~~MM!q!!!##CM!$4Q$7888##CM!$4Q$78888	9 $//"" 0  IFA lL11 \5L5L5N5N5V6+:OOJ:k>SSL    ]]F\]]]]]K Ok O 22<N^____	 O O 33L#+NNN aaJ`aaaaaM ` ` 22<N^___Mr.   )F)r0   r1   r2   r&   r3   r&   )rT   r%   r3   r   )r0   r1   r3   r`   )r0   rh   r3   r   )r0   rh   rk   r   r3   r   )r0   r   r3   r   )1__doc__
__future__r   typingr   r   mypy.checkerrl   mypy.pluginmypy.semanalmypy.argmapr   
mypy.nodesr   r   r	   r
   r   r   r   r   mypy.plugins.commonr   mypy.typeopsr   
mypy.typesr   r   r   r   r   r   r   r   r   r   r   r   r   r,   r"   r#   r%   rS   rC   r>   rs   rq   r   r-   r.   r/   <module>r      s   B B B " " " " " " $ $ $ $ $ $ $ $             . . . . . .	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 4 3 3 3 3 3 * * * * * *                            +E)E  E E E ECCC  C C C C$ $ $ $ $    *    DI$ $ $ $ $N   ,   0G G G Go o o od> > > > > >r.   