o
    2gW                     @  s  U 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 d dlmZmZmZ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 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,m-Z-m.Z.m/Z/ G dd deZ0d3ddZ1d4ddZ2d3ddZ3d4ddZ4d3ddZ5d4ddZ6d4d d!Z7e8d"d#hZ9d$e:d%< d3d&d'Z;d4d(d)Z<d5d6d-d.Z=d4d/d0Z>d4d1d2Z?dS )7    )annotations)partial)CallableFinalN)message_registry)DictExprIntExprStrExpr	UnaryExpr)AttributeContextClassDefContextFunctionContextFunctionSigContextMethodContextMethodSigContextPlugin)try_getting_str_literals)
is_subtype)is_literal_type_likemake_simplified_union)TPDICT_FB_NAMESAnyTypeCallableTypeFunctionLikeInstanceLiteralTypeNoneType	TupleTypeTypeTypedDictType	TypeOfAnyTypeVarType	UnionTypeget_proper_typeget_proper_typesc                   @  sV   e Zd ZdZdddZdd	d
ZdddZdddZdddZd ddZ	d!ddZ
dS )"DefaultPluginz/Type checker plugin that is enabled by default.fullnamestrreturn(Callable[[FunctionContext], Type] | Nonec                 C  s\   ddl m}m}m} |dkr|jS |dkr|jS |dkr%dd l}|jjj	S |dkr,|j
S d S )Nr   )ctypesenumssingledispatchz_ctypes.Arrayzfunctools.singledispatchzfunctools.partialzenum.member)mypy.pluginsr*   r+   r,   array_constructor_callback'create_singledispatch_function_callbackmypy.plugins.functoolsplugins	functoolspartial_new_callbackenum_member_callback)selfr&   r*   r+   r,   mypy r7   L/home/garg/my-data/venv/lib/python3.10/site-packages/mypy/plugins/default.pyget_function_hook+   s   
zDefaultPlugin.get_function_hook3Callable[[FunctionSigContext], FunctionLike] | Nonec                 C  s>   ddl m}m} |dv r|jS |dv r|jS |dkr|jS d S )Nr   attrsdataclasses)zattr.evolvezattrs.evolvez
attr.assoczattrs.assoc)zattr.fieldszattrs.fieldszdataclasses.replace)r-   r<   r=   evolve_function_sig_callbackfields_function_sig_callbackreplace_function_sig_callbackr5   r&   r<   r=   r7   r7   r8   get_function_signature_hook;   s   z)DefaultPlugin.get_function_signature_hook1Callable[[MethodSigContext], FunctionLike] | Nonec                 C  s   ddl m}m} |dkrtS |dd tD v rtS |dd tD v r$tS |dkr+|jS ||jkr3|j	S t
 }tD ]}||d  ||d	  ||d
  ||d  q8||v r]tS d S )Nr   r*   r,   typing.Mapping.getc                 S     h | ]}|d  qS z.setdefaultr7   .0nr7   r7   r8   	<setcomp>O       z:DefaultPlugin.get_method_signature_hook.<locals>.<setcomp>c                 S  rF   z.popr7   rH   r7   r7   r8   rK   Q   rL   z_ctypes.Array.__setitem__z.updatez.__or__z.__ror__z.__ior__)r-   r*   r,   !typed_dict_get_signature_callbackr   (typed_dict_setdefault_signature_callback!typed_dict_pop_signature_callbackarray_setitem_callback#SINGLEDISPATCH_CALLABLE_CALL_METHOD%call_singledispatch_function_callbacksetadd$typed_dict_update_signature_callback)r5   r&   r*   r,   typed_dict_updatesrJ   r7   r7   r8   get_method_signature_hookH   s(   
z'DefaultPlugin.get_method_signature_hook&Callable[[MethodContext], Type] | Nonec                 C  s   ddl m}m} |dkrtS |dkrtS |dkrtS |dkr tS |dv r&tS |dd	 tD v r1t	S |d
d	 tD v r<t
S |dd	 tD v rGtS |dkrN|jS |dkrU|jS ||jkr]|jS ||jkre|jS |dkrrdd l}|jjjS d S )Nr   rD   rE   zbuiltins.int.__pow__zbuiltins.int.__neg__zbuiltins.int.__pos__)zbuiltins.tuple.__mul__zbuiltins.tuple.__rmul__c                 S  rF   rG   r7   rH   r7   r7   r8   rK   q   rL   z0DefaultPlugin.get_method_hook.<locals>.<setcomp>c                 S  rF   rM   r7   rH   r7   r7   r8   rK   s   rL   c                 S  rF   )z.__delitem__r7   rH   r7   r7   r8   rK   u   rL   z_ctypes.Array.__getitem__z_ctypes.Array.__iter__zfunctools.partial.__call__)r-   r*   r,   typed_dict_get_callbackint_pow_callbackint_neg_callbackint_pos_callbacktuple_mul_callbackr   typed_dict_setdefault_callbacktyped_dict_pop_callbacktyped_dict_delitem_callbackarray_getitem_callbackarray_iter_callbackSINGLEDISPATCH_REGISTER_METHOD singledispatch_register_callbackREGISTER_CALLABLE_CALL_METHOD4call_singledispatch_function_after_register_argumentr0   r1   r2   partial_call_callback)r5   r&   r*   r,   r6   r7   r7   r8   get_method_hookd   s:   


zDefaultPlugin.get_method_hook)Callable[[AttributeContext], Type] | Nonec                 C  sP   ddl m}m} |dkr|jS |dkr|jS ||jv r|jS ||jv r&|jS d S )Nr   )r*   r+   z_ctypes.Array.valuez_ctypes.Array.raw)	r-   r*   r+   array_value_callbackarray_raw_callbackENUM_NAME_ACCESSenum_name_callbackENUM_VALUE_ACCESSenum_value_callback)r5   r&   r*   r+   r7   r7   r8   get_attribute_hook   s   

z DefaultPlugin.get_attribute_hook(Callable[[ClassDefContext], None] | Nonec                 C  sR   ddl m}m} ||jv r|jS ||jv s$||jv s$||jv s$||jv r'|j	S d S )Nr   r;   )
r-   r<   r=   dataclass_makersdataclass_tag_callbackattr_class_makersattr_dataclass_makersattr_frozen_makersattr_define_makersattr_tag_callbackrA   r7   r7   r8   get_class_decorator_hook   s   




z&DefaultPlugin.get_class_decorator_hook(Callable[[ClassDefContext], bool] | Nonec                 C  s   dd l }ddlm}m} ||jv r|jS ||jjjv r |jjj	S ||j
v r(|jS ||jv r4t|jddS ||jv rAt|jd ddS ||jv rNt|jd ddS d S )Nr   r;   T)auto_attribs_default)r|   frozen_default)r|   slots_default)r0   r-   r<   r=   rs   dataclass_class_maker_callbackr1   r2   functools_total_ordering_makers'functools_total_ordering_maker_callbackru   attr_class_maker_callbackrv   r   rw   rx   )r5   r&   r6   r<   r=   r7   r7   r8   get_class_decorator_hook_2   s&   





z(DefaultPlugin.get_class_decorator_hook_2N)r&   r'   r(   r)   )r&   r'   r(   r:   )r&   r'   r(   rC   )r&   r'   r(   rY   )r&   r'   r(   rj   )r&   r'   r(   rr   )r&   r'   r(   r{   )__name__
__module____qualname____doc__r9   rB   rX   ri   rq   rz   r   r7   r7   r7   r8   r%   (   s    




!
r%   ctxr   r(   r   c                 C  s  | j }t| jtrt| jdkrt| jd dkrt| jd d trt|jdkrt|jdkrt| jd dkr| jd d j	}t
| jj|}|j}|r| jd d }t|trot|trot|jdkro|jt d}|jd }t|ts{J |j|jd t||gg|dS |S )zTry to infer a better signature type for TypedDict.get.

    This is used to get better type context for the second argument that
    depends on a TypedDict value type.
       r      required_keys	arg_typesret_type)default_signature
isinstancetyper   lenargsr	   r   	variablesvaluer#   itemsgetr   r   copy_modifiedrT   r!   r   )r   	signaturekey
value_typer   default_argtvr7   r7   r8   rN      s8   

rN   r   r   c                 C  sb  t | jtrt| jdkrt| jd dkrt| jd d | jd d }|du r,| jS g }|D ]l}t| jj	
|}|du rD| j  S t| jdkrQ|| q0t| jdkrt| jd dkrt| jd dkr| jd d }t |trt|j	dkrt |tr||jt d q0|| || jd d  q0t| jdkr|t  t|S | jS )zJInfer a precise return type for TypedDict.get with literal first argument.r   r   Nr   r   )r   r   r   r   r   r   r   default_return_typer#   r   r   appendr   r   rT   r   r   )r   keysoutput_typesr   r   r   r7   r7   r8   rZ      s:   

2
rZ   c                 C  s   | j }| jdg }t| jtrmt| jdkrmt| jd dkrmt| jd d trmt|j	dkrmt|j
dkrmt| jd dkrm| jd d j}| jj|}|rm|j
d }t|ts^J t||g}|j||g|dS |j||j	d gdS )zTry to infer a better signature type for TypedDict.pop.

    This is used to get better type context for the second argument that
    depends on a TypedDict value type.
    builtins.strr   r   r   r   r   )r   apinamed_generic_typer   r   r   r   r   r	   r   r   r   r   r   r!   r   r   )r   r   str_typer   r   r   typr7   r7   r8   rP     s&   

rP   c                 C  sP  t | jtrt| jdkrt| jd dkrt| jd d | jd d }|du r:| jjt	j
| jtjd ttjS g }|D ]3}|| jjv rQ| jj| j|| j | jj|}|r`|| q>| jj| j|| j ttj  S t| jd dkrt|S t| jdkrt| jd dkrt| jd dkrtg || jd d S | jS )z=Type check and infer a precise return type for TypedDict.pop.r   r   Ncoder   )r   r   r   r   r   r   r   r   failr   $TYPEDDICT_KEY_MUST_BE_STRING_LITERALcontextcodesLITERAL_REQr   r    
from_errorr   msgtypeddict_key_cannot_be_deletedr   r   r   typeddict_key_not_foundr   r   )r   r   value_typesr   r   r7   r7   r8   r`   ,  s4   

2r`   c                 C  s   | j }| jdg }t| jtrSt| jdkrSt| jd dkrSt| jd d trSt|j	dkrSt| jd dkrS| jd d j
}| jj|}|rS|j||gdS |j||j	d gdS )zTry to infer a better signature type for TypedDict.setdefault.

    This is used to get better type context for the second argument that
    depends on a TypedDict value type.
    r   r   r   r   r   )r   r   r   r   r   r   r   r   r	   r   r   r   r   r   )r   r   r   r   r   r7   r7   r8   rO   O  s   
rO   c                 C  sH  t | jtrt| jdkrt| jd dkrt| jd dkrt| jd d | jd d }|du rC| jjt	j
| jtjd ttjS | jjt|@ }|rW| jjj|| jd | jd d }g }|D ]:}| jj|}|du r| jj| j|| j ttj  S t||s| jj||| j ttj  S || qbt|S | jS )z@Type check TypedDict.setdefault and infer a precise return type.r   r   r   Nr   )r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   readonly_keysrT   r   readonly_keys_mutatedr   r   r   r   +typeddict_setdefault_arguments_inconsistentr   r   r   )r   r   assigned_readonly_keysdefault_typer   r   r   r7   r7   r8   r_   f  s>   


r_   c                 C  s   t | jtrht| jdkrht| jd dkrht| jd d | jd d }|du r:| jjt	j
| jtjd ttjS |D ]+}|| jjv sJ|| jjv rV| jj| j|| j q<|| jjvrg| jj| j|| j q<| jS )z!Type check TypedDict.__delitem__.r   r   Nr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r   r   r   r   r   r   r   r   )r   r   r   r7   r7   r8   ra     s&   

ra   zupdate of TypedDictz__ior__ of TypedDictr   _TP_DICT_MUTATING_METHODSc                 C  sx  | j }t| jtrt|jdkrt|jd }t|ts|S | }|jt	 d}| j
r| j
d r|jtv r9d|_| jjjdd dd t| jj| j
d d |d}W d	   n1 s^w   Y  |jrid
|_g }t|trt|g}nt|trdd t| D }g }|D ]$}|j|j|jB |j @ d}| jjjs|jt|jd}|| q|rt|}|j|gdS |S )zTry to infer a better signature type for methods that update `TypedDict`.

    This includes: `TypedDict.update`, `TypedDict.__or__`, `TypedDict.__ror__`,
    and `TypedDict.__ior__`.
    r   r   r   Tc                 S  s   |j tjkS )N)r   r   TYPEDDICT_READONLY_MUTATED)nameinfor7   r7   r8   <lambda>  s    z6typed_dict_update_signature_callback.<locals>.<lambda>)filter_errorssave_filtered_errors)type_contextNFc                 S  s   g | ]	}t |tr|qS r7   )r   r   )rI   tr7   r7   r8   
<listcomp>  s    z8typed_dict_update_signature_callback.<locals>.<listcomp>)
item_namesr   )r   r   r   r   r   r   r#   as_anonymousr   rT   r   r   r   to_be_mutatedr   r   r   get_expression_typer"   r$   relevant_itemsr   r   r   optionsextra_checkslistr   r   )r   r   arg_typeinferredpossible_tdsr   tditemr7   r7   r8   rV     sR   






rV   c                 C  s   t | jdkrTt | jd dkrTt | jd dkrT| jd d }t|tr)|j}nt|tr?|jdkr?t|jtr?|jj }n| j	S |dkrM| j
dg S | j
dg S | j	S )z1Infer a more precise return type for int.__pow__.r   r   r   -zbuiltins.intzbuiltins.float)r   r   r   r   r   r   r
   opexprr   r   r   )r   argexponentr7   r7   r8   r[     s   2
 r[   
multiplierintc                 C  s   t | jtrA| jjdurA| jjj}| jjj}t |tr>t| jj	d r+t
|| |dS | jjt
|| || jj| jjddS | jS t | jt
r\| jj}| jj}t |tr\t
|| |dS | jS )zInfer a more precise return type for int.__neg__ and int.__pos__.

    This is mainly used to infer the return type as LiteralType
    if the original underlying object is a LiteralType object.
    Nr   )r   fallback)r   r   linecolumn)last_known_value)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r7   r7   r8   r\     s*   



r\   c                 C  s
   t | dS )z{Infer a more precise return type for int.__pos__.

    This is identical to __neg__, except the value is not inverted.
    r   )r\   )r   r7   r7   r8   r]     s   
r]   c                 C  s   t | jts	| jS t| jd d }t |tr3|jdur3|jj}t |t	r0| jj
| jj| dS | jS t | jtrL|j}t |t	rL| jj
| jj| dS | jS )zInfer a more precise return type for tuple.__mul__ and tuple.__rmul__.

    This is used to return a specific sized tuple if multiplied by Literal int
    r   N)r   )r   r   r   r   r#   r   r   r   r   r   r   r   r   )r   r   r   r7   r7   r8   r^     s   

r^   )r   r   r(   r   )r   r   r(   r   )r   )r   r   r   r   r(   r   )@
__future__r   r2   r   typingr   r   mypy.errorcodes
errorcodesr   r6   r   
mypy.nodesr   r   r	   r
   mypy.pluginr   r   r   r   r   r   r   mypy.plugins.commonr   mypy.subtypesr   mypy.typeopsr   r   
mypy.typesr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   rN   rZ   rP   r`   rO   r_   ra   	frozensetr   __annotations__rV   r[   r\   r]   r^   r7   r7   r7   r8   <module>   s4    $	D 

(
'

#

/

3
