
    *eP                    ^   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e          Z/ddZ0d dZ1ddZ2d dZ3ddZ4d dZ5d dZ6ddZ7d dZ8d dZ9d 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                  J    e Zd ZdZddZddZdd
ZddZddZddZ	ddZ
dS )DefaultPluginz/Type checker plugin that is enabled by default.fullnamestrreturn(Callable[[FunctionContext], Type] | Nonec                J    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.   s       4lib/python3.11/site-packages/mypy/plugins/default.pyget_function_hookzDefaultPlugin.get_function_hook+   sH    77777777&&44333!IIt    3Callable[[FunctionSigContext], FunctionLike] | Nonec                \    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r3   r'   r:   r;   s       r4   get_function_signature_hookz)DefaultPlugin.get_function_signature_hook5   s`     	43333333SSS5588855...<<tr6   1Callable[[MethodSigContext], FunctionLike] | Nonec                   ddl m}m} |dk    rt          S |d t          D             v rt
          S |d t          D             v rt          S |dk    r|j        S ||j        k    r|j	        S t                      }t          D ]b}|                    |dz              |                    |dz              |                    |d	z              |                    |d
z              c||v rt          S d S )Nr   r,   typing.Mapping.getc                    h | ]}|d z   S z.setdefault .0ns     r4   	<setcomp>z:DefaultPlugin.get_method_signature_hook.<locals>.<setcomp>I       EEE!m+EEEr6   c                    h | ]}|d z   S z.poprF   rG   s     r4   rJ   z:DefaultPlugin.get_method_signature_hook.<locals>.<setcomp>K       >>>!f*>>>r6   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)r3   r'   r-   r.   typed_dict_updatesrI   s         r4   get_method_signature_hookz'DefaultPlugin.get_method_signature_hookB   s-    	87777777+++44EE_EEEEE;;>>o>>>>>4444400KKK!GG UU  	3 	3A""1y=111""1y=111""1z>222""1z>2222)))77tr6   &Callable[[MethodContext], Type] | Nonec                   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 t          D             v rt          S |d t          D             v rt          S |d	 t          D             v rt          S |d
k    r|j        S |dk    r|j        S ||j        k    r|j        S ||j        k    r|j        S d S )Nr   r,   rC   zbuiltins.int.__pow__zbuiltins.int.__neg__)zbuiltins.tuple.__mul__zbuiltins.tuple.__rmul__c                    h | ]}|d z   S rE   rF   rG   s     r4   rJ   z0DefaultPlugin.get_method_hook.<locals>.<setcomp>i   rK   r6   c                    h | ]}|d z   S rM   rF   rG   s     r4   rJ   z0DefaultPlugin.get_method_hook.<locals>.<setcomp>k   rN   r6   c                    h | ]}|d z   S )z.__delitem__rF   rG   s     r4   rJ   z0DefaultPlugin.get_method_hook.<locals>.<setcomp>m   s    FFF!n,FFFr6   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_argumentr2   s       r4   get_method_hookzDefaultPlugin.get_method_hook^   s   77777777+++**///##///##NNN%%EE_EEEEE11>>o>>>>>**FFoFFFFF..44400111--FFF!BBEEE!VVtr6   )Callable[[AttributeContext], Type] | Nonec                    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-   ro   array_value_callbackarray_raw_callbackENUM_NAME_ACCESSenum_name_callbackENUM_VALUE_ACCESSenum_value_callback)r3   r'   r-   ro   s       r4   get_attribute_hookz DefaultPlugin.get_attribute_hooky   sw    ........,,,..,,,,,///++000,,tr6   (Callable[[ClassDefContext], None] | Nonec                    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   r9   )
r/   r:   r;   dataclass_makersdataclass_tag_callbackattr_class_makersattr_dataclass_makersattr_frozen_makersattr_define_makersattr_tag_callbackr?   s       r4   get_class_decorator_hookz&DefaultPlugin.get_class_decorator_hook   sy    33333333 {33355///566653335333**tr6   (Callable[[ClassDefContext], bool] | Nonec                8   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          S ||j        v rt          |j	        d d          S ||j        v rt          |j	        d d          S d S )Nr   )r:   r;   	functoolsT)auto_attribs_default)r   frozen_default)r   slots_default)r/   r:   r;   r   ry   dataclass_class_maker_callbackfunctools_total_ordering_makers'functools_total_ordering_maker_callbackr{   attr_class_maker_callbackr|   r   r}   r~   )r3   r'   r:   r;   r   s        r4   get_class_decorator_hook_2z(DefaultPlugin.get_class_decorator_hook_2   s     	?>>>>>>>>>{333==BBBDD000224445:QUVVVV111/d[_    111/dZ^    tr6   N)r'   r(   r)   r*   )r'   r(   r)   r7   )r'   r(   r)   rA   )r'   r(   r)   rZ   )r'   r(   r)   rm   )r'   r(   r)   rw   )r'   r(   r)   r   )__name__
__module____qualname____doc__r5   r@   rY   rl   rv   r   r   rF   r6   r4   r&   r&   (   s        99         8   6      &     r6   r&   ctxr   r)   r   c                   | j         }t          | j        t                    rt	          | j                  dk    rt	          | j        d                   dk    rt          | j        d         d         t                    rlt	          |j                  dk    rSt	          |j                  dk    r:t	          | j        d                   dk    r| j        d         d         j	        }t          | j        j                            |                    }|j        }|r| j        d         d         }t          |t                    rOt          |t                    r:t	          |j                  dk    r"|                    t!                                }|j        d         }t          |t"                    sJ |                    |j        d         t%          ||g          g|          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_modifiedrU   r!   r   )r   	signaturekey
value_typer   default_argtvs          r4   rO   rO      s    %I38]++MMQ!!sx{1~w// "	#$$))	#$$))!!hqk!n"$SX^%7%7%<%<==
% 	(1+a.K:}55K{H55K )**a// (55CEE5JJ
 $Q'Bb+.....**$.q13H*VXIY3Z3Z[! +    r6   r   r   c                   t          | j        t                    rEt          | j                  dk    r,t          | j        d                   dk    rt          | j        d         d         | j        d         d                   }|| j        S g }|D ]}t          | j        j	        
                    |                    }|	| j        c S t          | j                  dk    r|                    |           ht          | j                  dk    rt          | j        d                   dk    rt          | j        d                   dk    r| j        d         d         }t          |t                    rdt          |j	                  dk    rLt          |t                    r7|                    |                    t                                           I|                    |           |                    | j        d         d                    t          | 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   rU   r   r   )r   keysoutput_typesr   r   r   s         r4   r_   r_      s)    	38]++!3!##a !!Q&&'Aa8H8KLL<**#% 	= 	=C(););C)@)@AAJ!....3=!!Q&&##J////S]##q((Sq1A-B-Ba-G-GCPSPXYZP[L\L\`aLaLa!hqk!n{H55	=K-..!33":}== 4 !''
(@(@suu(@(U(UVVVV ''
333 ''a(8(;<<<s}""

+++$\222""r6   c                &   | j         }| j                            dg           }t          | j        t
                    r2t          | j                  dk    rt          | 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        }| j        j                            |          }|rN|j
        d         }t          |t                    sJ t          ||g          }|                    ||g|          S |                    ||j	        d         g          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   typs          r4   rQ   rQ     so    %Iw))."==H38]++TMMQ!!sx{1~w// "	#$$))	#$$))!!hqk!n"X^'',,
 	T $Q'Bb+.....'R(899C**h_s*SSS""h	8KA8N-O"PPPr6   c                ~   t          | j        t                    rt          | j                  dk    rt          | j        d                   dk    rt          | j        d         d         | j        d         d                   }|O| j                            t          j
        | j        t          j                   t          t          j                  S g }|D ]}|| j        j        v r+| j        j                            | j        || j                   | j        j                            |          }|r|                    |           r| j        j                            | j        || j                   t          t          j                  c S t          | j        d                   dk    rt1          |          S t          | j                  dk    r`t          | j        d                   dk    rBt          | j        d                   dk    r$t1          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   s        r4   rd   rd     s    	38]++N!##a !!Q&&'Aa8H8KLL<GLL E&    
 9/000 		5 		5Cch,,,;;CHc3;WWW++C00J 5"":....33CHc3;OOOy344444sx{q  (5551$$S]1-=)>)>!)C)CCHUVKHXHX\]H]H]()L;)La8H8K)LMMM""r6   c                   | j         }| j                            dg           }t          | j        t
                    rt          | j                  dk    rt          | j        d                   dk    rt          | j        d         d         t                    rt          |j	                  dk    rot          | j        d                   dk    rQ| j        d         d         j
        }| j        j                            |          }|r|                    ||g          S |                    ||j	        d         g          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   s        r4   rP   rP   B  s!    %Iw))."==H38]++MMMQ!!sx{1~w// "	#$$))!!hqk!n"X^'',,
 	M**h
5K*LLL""h	8KA8N-O"PPPr6   c                   t          | j        t                    rt          | j                  dk    rt          | j        d                   dk    rt          | j        d                   dk    ryt          | j        d         d         | j        d         d                   }|O| j                            t          j
        | j        t          j                   t          t          j                  S | j        d         d         }g }|D ]}| j        j                            |          }|F| j        j                            | j        || j                   t          t          j                  c S t+          ||          sA| j        j                            ||| j                   t          t          j                  c S |                    |           t1          |          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   s         r4   rc   rc   Y  s    	38]++%2!##a !!Q&&a !!Q&&'Aa8H8KLL<GLL E&    
 9/000}Q'* 	+ 	+C++C00J!33CHc3;OOOy344444 lJ77 5GG *ck   y344444z****$[111""r6   c                   t          | j        t                    r2t          | j                  dk    rt          | j        d                   dk    rt          | j        d         d         | j        d         d                   }|O| j                            t          j
        | j        t          j                   t          t          j                  S |D ]u}|| j        j        v r,| j        j                            | j        || j                   <|| j        j        vr+| j        j                            | j        || j                   v| 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   s      r4   re   re     s0    	38]++P!##a !!Q&&'Aa8H8KLL<GLL E&    
 9/000 	P 	PCch,,,;;CHc3;WWWWCHN**33CHc3;OOO""r6   c                   | j         }t          | j        t                    rt	          |j                  dk    rt          |j        d                   }t          |t                    s|S |                                }|                    t                                }| j
        r|| j
        d         rn| j        j                                        5  t          | j                            | j
        d         d         |                    }ddd           n# 1 swxY w Y   g }t          |t                    r|g}n@t          |t                    r+d t!          |                                          D             }g }|D ]}|                    |j        |j        z  |j                                        z            }| j        j        j        s(|                    t/          |j                            }|                    |           |rt3          |          }|                    |g          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                <    g | ]}t          |t                    |S rF   )r   r   )rH   ts     r4   
<listcomp>z8typed_dict_update_signature_callback.<locals>.<listcomp>  s8          !!]33      r6   )
item_namesr   )r   r   r   r   r   r   r#   as_anonymousr   rU   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items           r4   rW   rW     ss    %I#(M** =s93F/G/G1/L/L"9#6q#9::(M22 	((**)))>>8 	8 	8**,,  *G//AX/VV                L(M22  (zHi00    -h.E.E.G.GHH     
 E" # #--#+#9B<L#Ln))++#, .   w3 I--bh-HHDT"""" 8077&&(&<<<s   ;DD"%D"c                .   t          | j                  dk    rt          | j        d                   dk    rt          | j        d                   dk    r| j        d         d         }t          |t                    r|j        }nOt          |t                    r3|j        dk    r(t          |j        t                    r|j        j         }n| j	        S |dk    r| 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exponents      r4   r`   r`     s     3=Q3s}Q'7#8#8A#=#=#cmTUFVBWBW[\B\B\hqk!nc7## 	+yHHY'' 	+CFcMMjSZ>[>[MHH **q==7--nbAAA7--.>CCC""r6   c                l   t          | j        t                    r| j        j        | j        j        j        }| j        j        j        }t          |t                    rwt          | j        j	        d                   rt          | |          S | j                            t          | | j        | j        j        | j        j                            S nYt          | j        t                    r?| j        j        }| j        j        }t          |t                    rt          | |          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   s      r4   ra   ra     s'    #(H%% @#(*C*O)/8,5eS!! 	#CG$8$<== "%(CCCCx--%0$fsxchmTWT\Tc& & & .   		 
CHk	*	* @8$eS!! 	@eVh????""r6   c                   t          | j        t                    s| j        S t	          | j        d         d                   }t          |t                    rQ|j        J|j        j        }t          |t                    r(| j        
                    | j        j        |z            S n^t          | j        t                    rD|j        }t          |t                    r(| j        
                    | j        j        |z            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   s      r4   rb   rb     s    
 ch	** '&&s}Q/233H(H%% H(*C*O)/eS!! 	H8))0F)GGG	H	CHk	*	* HeS!! 	H8))0F)GGG""r6   )r   r   r)   r   )r   r   r)   r   );
__future__r   r   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&   rO   r_   rQ   rd   rP   rc   re   rW   r`   ra   rb   rF   r6   r4   <module>r      s   " " " " " "                   ! ! ! ! ! ! < < < < < < < < < < < <                  9 8 8 8 8 8 $ $ $ $ $ $ D D D D D D D D                                 &G G G G GF G G GT% % % %P$# $# $# $#NQ Q Q Q< #  #  #  #FQ Q Q Q.(# (# (# (#V# # # #0' ' ' 'T# # # #(# # # #4# # # # # #r6   