o
    2g3                     @  s0  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 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" d
hZ#de$d< h dZ%de$d< dZ&de$d< G dd deZ'	d+d,ddZ(d-ddZ)d.d d!Z*d/d#d$Z+d0d&d'Z,d1d)d*Z-dS )2z<Plugin for supporting the functools standard library module.    )annotations)Final
NamedTupleN)map_actuals_to_formals)ARG_POS	ARG_STAR2ArgKindArgumentCallExprFuncItemVar)add_method_to_class)get_all_type_vars)
AnyTypeCallableTypeInstance
OverloadedType	TypeOfAnyTypeVarTypeUnboundType	UnionTypeget_proper_typezfunctools.total_orderingr   functools_total_ordering_makers>   __ge____gt____le____lt___ORDERING_METHODSzfunctools.partialPARTIALc                   @  s   e Zd ZU ded< ded< dS )_MethodInfobool	is_staticr   typeN)__name__
__module____qualname____annotations__ r(   r(   N/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/plugins/functools.pyr    "   s   
 r    Fctxmypy.plugin.ClassDefContextauto_attribs_defaultr!   returnc           
        s   t |   s| jd| j dS t  fddd} | }|s"dS t|}| jd}|}|jj| jdkrRt	|jj}t
|trM|jdd d	ksRttj}tD ]} |spttd
||dtg}	t| j| j||	| qTdS )zFAdd dunder methods to classes decorated with functools.total_ordering.zNNo ordering operation defined when using "functools.total_ordering": < > <= >=Tc                   s    |  d u | fS Nr(   )kcomparison_methodsr(   r)   <lambda>4   s    z9functools_total_ordering_maker_callback.<locals>.<lambda>)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)
r*   r,   rootroot_method
other_type	bool_typer>   proper_ret_typeadditional_opargsr(   r0   r)   'functools_total_ordering_maker_callback'   s4   

rL   methodr   c                 C  sz   | j rdnd}d}d}t| jj| jjD ]\}}| r)||kr$|} n|d7 }q|tkr1|} nq|du r;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   rB   )rM   first_arg_poscur_pos_arg	other_argarg_kindarg_typer(   r(   r)   r<   N   s    

r<   dict[str, _MethodInfo | None]c                 C  s   i }| j jjdd D ]G}tD ]B}||jv rQ||vrQ|j| j}t|tr5t|jt	r5t
|j|j||< qt|trMt|j}t|t	rMt
|j|||< qd||< qq|S )zMAnalyze the class body, its parents, and return the comparison methods found.Nr5   )rD   infomror   namesnoder?   r   r#   r   r    r"   r   r   is_staticmethod)r*   r1   rD   r@   r\   proper_typer(   r(   r)   r7   d   s"   


r7   mypy.plugin.FunctionContextc                 C  sv   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	r0| jS t
| | jd d dS )z6Infer a more precise return type for functools.partial   r   rN   )callee)r?   r8   mypycheckerTypeCheckerdefault_return_typelenrQ   r   r   handle_partial_with_calleer*   r(   r(   r)   partial_new_callback|   s   ri   ra   c                   s&  t jtjjsjS t t| }tr!tfdd|j	D S jj
|jd}|d u r1jS |  }jjd }| sMjt|jg}d}n|j}d jjd< d}g }g  g }g t }	tjdd  ddD ]:\}
}t|D ]1\}}||	v rqv|	| ||  j|
 |  |j|
 |  j|
 |  qvqnt ||j|jfd	d
d}t t|jD ]\}
}||
 sqdd t|D  q|jdd |jD |fdd|jD d}|jdk r| j t!jd d | |t j"t!rj"j#nd d}| j" jj$j%|| ||d\}}|s-|jjd< t|}t |t&s:jS |r[t|j}t |t'rO|j(j)tkrRjS |j|jd d}g }g }g }t|D ]\}
}t*|jt*|jkr|j|
 }tj+|s|j|
 }n|j|
 }|r|j|
 t,j-t,j.fv r||j|
  || ||j|
  qe|sJ t/ fdd|D rĐqe |d  }|t,j0ks|t,j.krt,j1}|| || ||j|
  qe|j}tj+|s|j}|j||||d}jt|g}|2d|}|S )Nc                   s   g | ]}t  |qS r(   )rg   ).0itemrh   r(   r)   
<listcomp>   s    z.handle_partial_with_callee.<locals>.<listcomp>rh   r5   TFrN   )startc                   s    |  S r.   r(   )i)actual_typesr(   r)   r2      s    z,handle_partial_with_callee.<locals>.<lambda>)actual_kindsactual_namesformal_kindsformal_namesactual_arg_typec                 S  s   h | ]}|j qS r(   )idrj   tvr(   r(   r)   	<setcomp>   s    z-handle_partial_with_callee.<locals>.<setcomp>c                 S  s0   g | ]}|t jkrt jn	|t jkrt jn|qS r(   )r   r   ARG_OPT	ARG_NAMEDARG_NAMED_OPT)rj   r/   r(   r(   r)   rl      s    
c                   s$   g | ]}|j  v st|ts|qS r(   )ru   r?   r   rv   )can_infer_idsr(   r)   rl      s
    )rP   r>   	variablesr   )ra   rK   rP   	arg_namesanalyzedra   rK   rP   r~   context)r>   c                 3  s$    | ]} | t jt jfv V  qd S r.   )r   r   ARG_STAR)rj   j)actual_arg_kindsr(   r)   	<genexpr>  s   " z-handle_partial_with_callee.<locals>.<genexpr>)rQ   rP   r~   r>   __mypy_partial)3r?   r8   rb   rc   rd   re   r   r   
make_unionitemsextract_callable_typewith_unpacked_kwargswith_normalized_var_argstype_contextis_type_objnamed_generic_typer   r>   set	enumeraterK   addappendrP   r~   rQ   r   updater   copy_modifiedr}   lineset_liner
   r   r   expr_checker
check_callr   r   r#   fullnamerf   is_valid_inferred_typer   r   r   anyrz   r{   copy_with_extra_attr)r*   ra   callee_properfn_typelast_contextr>   wrapped_returnactual_argsactual_arg_names	seen_argsrn   paramr   aformal_to_actualrW   	defaulted	call_expr_boundpartial_kindspartial_typespartial_namesactualskindpartially_appliedretr(   )r   ro   r|   r*   r)   rg      s   














rg   mypy.plugin.MethodContextc                 C  s  t | jtjjr t | jtr | jjjtks | jj	r d| jj	j
vr#| jS | jj	j
d }t| jdkr4| jS g }g }g }t }t| jD ]0\}}t|D ]'\}}	|	|v rSqJ||	 ||	 || j| |  || j| |  qJqB| jjj||||| jd}
|
d S )z@Infer a more precise return type for functools.partial.__call__.r      r   r   )r?   r8   rb   rc   rd   r#   r   r   r   extra_attrsattrsre   rf   rQ   r   r   rK   r   r   rP   r~   r   r   r   )r*   partial_typer   r   r   r   rn   r   r   r   resultr(   r(   r)   partial_call_callback2  sB   


r   )F)r*   r+   r,   r!   r-   r!   )rM   r    r-   r   )r*   r+   r-   rX   )r*   r_   r-   r   )r*   r_   ra   r   r-   r   )r*   r   r-   r   ).__doc__
__future__r   typingr   r   mypy.checkerrb   mypy.pluginmypy.semanalmypy.argmapr   
mypy.nodesr   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    rL   r<   r7   ri   rg   r   r(   r(   r(   r)   <module>   s.    $0
'


 (