o
    2g                      @  s  U d dl mZ d dl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 d dlmZ d dl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* G dd deZ+G dd deZ,dZ-de.d< e- dZ/de.d< e- dZ0de.d< dOddZ1edZ2dPd d!Z3d"Z4de.d#< d$e4 dZ5de.d%< dQd*d+Z6eeef Z7d,e.d-< dRd4d5Z8dSd8d9Z9dTd;d<Z:	=dUdVdDdEZ;dWdGdHZ<dTdIdJZ=dXdMdNZ>d=S )Y    )annotations)Final
NamedTupleSequenceTypeVarUnion)	TypeAlias)format_type)ARG_POSArgumentBlockClassDefContextSymbolTableTypeInfoVar)Options)CheckerPluginInterfaceFunctionContextMethodContextMethodSigContext)add_method_to_class)
is_subtype)	AnyTypeCallableTypeFunctionLikeInstanceNoneType
OverloadedType	TypeOfAnyget_proper_typec                   @     e Zd ZU ded< ded< dS )SingledispatchTypeVarsr   return_typer   fallbackN__name__
__module____qualname____annotations__ r+   r+   S/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/plugins/singledispatch.pyr#         
 r#   c                   @  r"   )RegisterCallableInfor   register_typer   singledispatch_objNr&   r+   r+   r+   r,   r.      r-   r.   z!functools._SingleDispatchCallabler   SINGLEDISPATCH_TYPEz	.registerSINGLEDISPATCH_REGISTER_METHODz	.__call__#SINGLEDISPATCH_CALLABLE_CALL_METHODtypr   returnSingledispatchTypeVars | Nonec                 C  s   t | jdkrt| j S d S )N   )lenargsr#   )r4   r+   r+   r,   get_singledispatch_info*   s   
r:   Tr9   list[list[T]]T | Nonec                 C  s   | r| d r| d d S dS )zMGet the element that corresponds to the first argument passed to the functionr   Nr+   )r9   r+   r+   r,   get_first_arg3   s   r>   _SingleDispatchRegisterCallableREGISTER_RETURN_CLASS
functools.REGISTER_CALLABLE_CALL_METHODapir   	type_argsSequence[Type]c                 C  s   t ttg }dt |_tt |d}| dg j}t|g g|_	||g|_
||_ttdttjd t}t| |d|gt  t||S )NrA   	functoolszbuiltins.objectname__call__)r   r@   r   fullnamer   r   named_generic_typetyper   basesmroinfor   r   r   r    implementation_artifactr
   r   r   )rC   rD   defnrN   obj_typefunc_argr+   r+   r,   !make_fake_register_class_instance?   s   

rS   
_TypeAliasPluginContextctxmsgstrcontextContext | NoneNonec                 C  s&   |dur|}n| j }| j|| dS )a  Emit an error message.

    This tries to emit an error message at the location specified by `context`, falling back to the
    location specified by `ctx.context`. This is helpful when the only context information about
    where you want to put the error message may be None (like it is for `CallableType.definition`)
    and falling back to the location of the calling function is fine.N)rY   rC   fail)rV   rW   rY   err_contextr+   r+   r,   r\   S   s   	r\   r   r   c                 C  s   t t| j}t|trDt|jdk rt| d|j | j	S |jd j
dds0t| d|j | j	S t | j	}t|ts<J | j|f7  _| j	S )z#Called for functools.singledispatch   z6Singledispatch function requires at least one argumentr   T)starzGFirst argument to singledispatch function must be a positional argument)r!   r>   	arg_types
isinstancer   r8   	arg_kindsr\   
definitiondefault_return_typeis_positionalr   r9   )rV   	func_typer0   r+   r+   r,   'create_singledispatch_function_callbackc   s$   

rg   r   c                 C  s   t | jtsJ tt| j}t |ttfr.| r.|j	d j
}t|| j}t| j|}|S t |tr?t| | j|| jj |S | jS )z5Called for functools._SingleDispatchCallable.registerr   )ra   rK   r   r!   r>   r`   r   r   is_type_objitemsret_typer.   rS   rC   register_functionoptionsrd   )rV   first_arg_typer/   rD   register_callabler+   r+   r,    singledispatch_register_callback~   s   	
ro   Nr0   funcrl   r   register_argType | Nonec           	      C  s   t |}t|tsdS t|}|du rdS t||}|du r dS |j}|jd }t||s@t| d	t
||t
|||j dS dS )zRegister a functionNr   zGDispatch type {} must be subtype of fallback function first argument {})r!   ra   r   r:   get_dispatch_typer%   r`   r   r\   formatr	   rc   )	rV   r0   rp   rl   rq   metadatadispatch_typer%   fallback_dispatch_typer+   r+   r,   rk      s*   	



rk   r   c                 C  s    |d ur|S | j r| j d S d S )Nr   )r`   )rp   rq   r+   r+   r,   rs      s
   
rs   c                 C  sN   | j }t|tr$t|j }t| j}|dur$t| |j|| j	j
|j |S | jS )z7Called on the function after passing a type to registerN)rK   ra   r   r.   r9   r>   r`   rk   r0   rC   rl   r/   rd   )rV   rn   rD   rp   r+   r+   r,   4call_singledispatch_function_after_register_argument   s   


rx   r   r   c                 C  s0   t | jts	| jS t| j}|du r| jS |jS )z5Called for functools._SingleDispatchCallable.__call__N)ra   rK   r   default_signaturer:   r%   )rV   ru   r+   r+   r,   %call_singledispatch_function_callback   s   
rz   )r4   r   r5   r6   )r9   r<   r5   r=   )rC   r   rD   rE   r5   r   )rV   rU   rW   rX   rY   rZ   r5   r[   )rV   r   r5   r   )rV   r   r5   r   )N)rV   rU   r0   r   rp   r   rl   r   rq   rr   r5   r[   )rp   r   rq   rr   r5   rr   )rV   r   r5   r   )?
__future__r   typingr   r   r   r   r   typing_extensionsr   rT   mypy.messagesr	   
mypy.nodesr
   r   r   r   r   r   r   r   mypy.optionsr   mypy.pluginr   r   r   r   mypy.plugins.commonr   mypy.subtypesr   
mypy.typesr   r   r   r   r   r   r   r    r!   r#   r.   r1   r*   r2   r3   r:   r;   r>   r@   rB   rS   rU   r\   rg   ro   rk   rs   rx   rz   r+   r+   r+   r,   <module>   s<    (,





$
%
