o
    7fP                     @  sf  d dl mZ d dlmZ d dl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Z/d*ddZ0d+ddZ1d*ddZ2d+ddZ3d*ddZ4d+ddZ5d+d d!Z6d*d"d#Z7d+d$d%Z8d+d&d'Z9d+d(d)Z:dS ),    )annotations)partial)CallableN)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  s0   ddl m}m} |dkr|jS |dkr|jS d S )Nr   ctypessingledispatchz_ctypes.Arrayzfunctools.singledispatch)mypy.pluginsr*   r+   array_constructor_callback'create_singledispatch_function_callbackselfr%   r*   r+    r1   M/home/ertert/spirit/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,   r6   r7   evolve_function_sig_callbackfields_function_sig_callbackreplace_function_sig_callbackr0   r%   r6   r7   r1   r1   r2   get_function_signature_hook5   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)   typing.Mapping.getc                 S     h | ]}|d  qS z.setdefaultr1   .0nr1   r1   r2   	<setcomp>I       z:DefaultPlugin.get_method_signature_hook.<locals>.<setcomp>c                 S  r?   z.popr1   rA   r1   r1   r2   rD   K   rE   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)r0   r%   r*   r+   typed_dict_updatesrC   r1   r1   r2   get_method_signature_hookB   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v r tS |dd tD v r+tS |d	d tD v r6t	S |d
d tD v rAt
S |dkrH|jS |dkrO|jS ||jkrW|jS ||jkr_|jS d S )Nr   r)   r>   zbuiltins.int.__pow__zbuiltins.int.__neg__)zbuiltins.tuple.__mul__zbuiltins.tuple.__rmul__c                 S  r?   r@   r1   rA   r1   r1   r2   rD   i   rE   z0DefaultPlugin.get_method_hook.<locals>.<setcomp>c                 S  r?   rF   r1   rA   r1   r1   r2   rD   k   rE   c                 S  r?   )z.__delitem__r1   rA   r1   r1   r2   rD   m   rE   z_ctypes.Array.__getitem__z_ctypes.Array.__iter__)r,   r*   r+   typed_dict_get_callbackint_pow_callbackint_neg_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_argumentr/   r1   r1   r2   get_method_hook^   s0   

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*   enumsz_ctypes.Array.valuez_ctypes.Array.raw)	r,   r*   rb   array_value_callbackarray_raw_callbackENUM_NAME_ACCESSenum_name_callbackENUM_VALUE_ACCESSenum_value_callback)r0   r%   r*   rb   r1   r1   r2   get_attribute_hooky   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   r5   )
r,   r6   r7   dataclass_makersdataclass_tag_callbackattr_class_makersattr_dataclass_makersattr_frozen_makersattr_define_makersattr_tag_callbackr;   r1   r1   r2   get_class_decorator_hook   s   




z&DefaultPlugin.get_class_decorator_hook(Callable[[ClassDefContext], bool] | Nonec                 C  s   ddl m}m}m} ||jv r|jS ||jv r|jS ||jv r"|j	S ||j
v r.t|j	ddS ||jv r;t|j	d ddS ||jv rHt|j	d ddS d S )Nr   )r6   r7   	functoolsT)auto_attribs_default)ru   frozen_default)ru   slots_default)r,   r6   r7   rt   rk   dataclass_class_maker_callbackfunctools_total_ordering_makers'functools_total_ordering_maker_callbackrm   attr_class_maker_callbackrn   r   ro   rp   )r0   r%   r6   r7   rt   r1   r1   r2   get_class_decorator_hook_2   s$   





z(DefaultPlugin.get_class_decorator_hook_2N)r%   r&   r'   r(   )r%   r&   r'   r4   )r%   r&   r'   r=   )r%   r&   r'   rR   )r%   r&   r'   ra   )r%   r&   r'   rj   )r%   r&   r'   rs   )__name__
__module____qualname____doc__r3   r<   rQ   r`   ri   rr   r|   r1   r1   r1   r2   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_modifiedrM   r    r   )r   	signaturekey
value_typer   default_argtvr1   r1   r2   rG      s8   

rG   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   rM   r   r   )r   keysoutput_typesr   r   r   r1   r1   r2   rS      s:   

2
rS   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   typr1   r1   r2   rI     s&   

rI   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   r1   r1   r2   rX     s4   

2rX   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   r1   r1   r2   rH   B  s   
rH   c                 C  s   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d d }g }|D ]:}| jj|}|du rm| jj| j|| j ttj  S t||s| jj||| j ttj  S || qNt|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   r   r   r   r   +typeddict_setdefault_arguments_inconsistentr   r   r   )r   r   default_typer   r   r   r1   r1   r2   rW   Y  s8   


rW   c                 C  s   t | jtrbt| jdkrbt| jd dkrbt| 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 rP| jj| j|| j q<|| jjvra| 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   r1   r1   r2   rY     s&   

rY   c                 C  sR  | j }t| jtrt|jdkrt|jd }t|ts|S | }|jt	 d}| j
r| j
d r| jj  t| jj| j
d d |d}W d   n1 sQw   Y  g }t|tra|g}nt|trqdd t| D }g }|D ]$}|j|j|jB |j @ d}| jjjs|jt|jd}|| qu|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   )type_contextNc                 S  s   g | ]	}t |tr|qS r1   )r   r   )rB   tr1   r1   r2   
<listcomp>  s    z8typed_dict_update_signature_callback.<locals>.<listcomp>)
item_namesr   )r   r   r   r   r   r   r"   as_anonymousr   rM   r   r   r   filter_errorsget_expression_typer!   r#   relevant_itemsr   r   r   optionsextra_checkslistr   r   )r   r   arg_typeinferredpossible_tdsr   tditemr1   r1   r2   rO     sD   





rO   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exponentr1   r1   r2   rT     s   2
 rT   c                 C  s   t | jtr@| jjdur@| jjj}| jjj}t |tr=t| jj	d r*t
| |dS | jjt
| | j| jj| jjddS | jS t | jt
rZ| jj}| jj}t |trZt
| |dS | jS )zInfer a more precise return type for int.__neg__.

    This is mainly used to infer the return type as LiteralType
    if the original underlying object is a LiteralType object
    N)r   fallback)r   r   linecolumn)last_known_value)r   r   r   r   r   r   intr   r   r   r   r   r   r   r   )r   r   r   r1   r1   r2   rU     s$   




rU   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   r1   r1   r2   rV     s   

rV   )r   r   r'   r   )r   r   r'   r   );
__future__r   rt   r   typingr   mypy.errorcodes
errorcodesr   mypyr   
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$   rG   rS   rI   rX   rH   rW   rY   rO   rT   rU   rV   r1   r1   r1   r2   <module>   s0    $	D 

(
'

#

+

*
