o
    2g`                     @  sf  d Z ddlmZ ddlmZ ddlmZmZ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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" dd
l#m$Z$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/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6m7Z7m8Z8m9Z9m:Z: ddl;m<Z< ddl=m>Z>m?Z?m@Z@mAZAmBZB ddlCmDZD ddlEmFZF dtd#d$ZGdud*d+ZHdvd.d/ZIdwd1d2ZJdxd:d;ZKdydAdBZLdzdEdFZMd{dHdIZNd|dKdLZOd}dMdNZPd~dQdRZQddVdWZRddXdYZSddZd[ZTdd\d]ZUd|d^d_ZVeeef ZWG d`da daeZXddbdcZYG ddde deeZZG dfdg dgeZ[ddldmZ\ddqdrZ]dsS )a  Prepare for IR transform.

This needs to run after type checking and before generating IR.

For example, construct partially initialized FuncIR and ClassIR
objects for all functions and classes. This allows us to bind
references to functions and classes before we've generated full IR for
functions or classes.  The actual IR transform will then populate all
the missing bits, such as function bodies (basic blocks).

Also build a mapping from mypy TypeInfos to ClassIR objects.
    )annotations)defaultdict)Iterable
NamedTupleTuple)Graph)ARG_STAR	ARG_STAR2CallExprClassDef	Decorator
ExpressionFuncDef
MemberExprMypyFileNameExprOverloadedFuncDefRefExpr
SymbolNodeTypeInfoVar)refers_to_fullname)TraverserVisitor)InstanceTypeget_proper_type)PROPSET_PREFIXget_id_from_name)catch_errors)Errors)ClassIR)FUNC_CLASSMETHODFUNC_NORMALFUNC_STATICMETHODFuncDeclFuncSignature
RuntimeArg)	DeserMaps)	RInstanceRTypedict_rprimitivenone_rprimitivetuple_rprimitive)Mapper)get_func_defget_mypyc_attrsis_dataclassis_extension_classis_trait)CompilerOptions)is_same_typemapperr-   moduleslist[MypyFile]graphr   typesdict[Expression, Type]optionsr3   errorsr   returnNonec                   s  g }|D ] dd  j D }| fdd|D  q|D ]-\ }t|j jt||jjd}	t||	_	|	j	r>|jj
 |	_|jsDd |	_|	| j|j< q|D ]7\ }t j|j$ | j|j j	rkt j j|||  n
t j j|||  W d    n1 sw   Y  qM|D ]\ }| j|j }	|	j	rt|j|	 j|  q|D ] t D ]
}
t jd |
|  qq|D ]T\ }| j|j }	|	jD ]F}|	jdd  D ]<}||jv rt|	j| |j| s|jj| j}|d usJ |jrdnd}|d| d	| d
|j d j|j qqqd S )Nc                 S  s   g | ]	}t |tr|qS  )
isinstancer   ).0noder?   r?   M/home/garg/my-data/venv/lib/python3.10/site-packages/mypyc/irbuild/prepare.py
<listcomp>M   s    z"build_type_map.<locals>.<listcomp>c                   s   g | ]} |fqS r?   r?   )rA   cdefmoduler?   rC   rD   N   s    )is_abstract   traitclassz	Type of "z%" is incompatible with definition in z "")defsextendr    namefullnamer2   inforH   r1   is_ext_classdeletable_attributescopy	deletableglobal_optschildren
type_to_irr   pathlineprepare_class_defprepare_non_ext_class_def#prepare_implicit_property_accessorsget_module_func_defsprepare_func_def
attributesmror4   namesrB   error)r5   r6   r8   r9   r;   r<   classesmodule_classesrE   class_irfuncattrbase_irrB   kindr?   rF   rC   build_type_mapB   sj   	

rk   rB   r   rG   r   boolc                 C  s   | j |j d | j kS )N.)rP   rO   )rB   rG   r?   r?   rC   is_from_module   s   rn   	deser_ctxr'   c                 C  s   |D ]*}|j  D ]"}t|jtr+t|j|r+|j|jj }|| j|j< |j	| j
|j< q	q|D ]}t|D ]}t|j|j|j}|j| j| j
|< q5q/dS )z>Populate a Mapper with deserialized IR from a list of modules.N)rb   valuesr@   rB   r   rn   rd   rP   rX   ctorfunc_to_declr^   r   rO   rZ   	functionsdecl)r5   r6   ro   rG   rB   irrg   func_idr?   r?   rC   load_type_map   s   rw   Iterable[FuncDef]c                 c  s@    | j  D ]}t|jtttfrt|j| rt|jV  qdS )z?Collect all of the (non-method) functions declared in a module.N)	rb   rp   r@   rB   r   r   r   rn   r.   )rG   rB   r?   r?   rC   r^      s   r^   module_namestr
class_name
str | Nonefdefr   r$   c                 C  s>   |j rtn|jr
tnt}t|j|| |||}||j|< |S N)		is_staticr#   is_classr!   r"   r$   rO   fdef_to_sigrr   )ry   r{   r}   r5   rj   rt   r?   r?   rC   r_      s   
r_   ru   r    rE   r   FuncDef | Decoratorc                 C  s   t |trt||j||| j|j< d S t |trqt||j|j|}|js+|| j|j< n(t |jd trS|jd jdkrSt	|j |_d|_
d|jjd _|| jt	|j < |jjrs|jjsdJ d|j dd|_|jj| j|j< d S d S d S )Nr   setterTrI   z.Expected return type annotation for property '')r@   r   r_   rO   method_declsr   rg   
decoratorsr   r   is_prop_settersigargspos_onlyis_propertytypeis_prop_getterret_typeproperty_types)ru   ry   rE   r5   rB   rt   r?   r?   rC   prepare_method_def   s"   

 r   propr   c                 C  sp   t | jdkr	dS | jd }| jd }t|to7t|to7|jjo7t |jdko7t|jd to7|jd jdkS )N   Fr   rI   r   )	lenitemsr@   r   rg   r   r   r   rO   )r   getterr   r?   r?   rC   is_valid_multipart_property_def   s   


r   builtin_basec                 C  s   | dv S )N)zbuiltins.Exceptionzbuiltins.LookupErrorzbuiltins.IndexErrorzbuiltins.Warningzbuiltins.UserWarningzbuiltins.ValueErrorbuiltins.objectr?   )r   r?   r?   rC   can_subclass_builtin   s   r   rY   c                   s   j |j }|j}t|}|ddu rd|_|ddu r!d|_|jD ]'}|jdkr/d|_q$|jdkr8d|_q$|j	drKt
|jsK|d	| |j q$ fd
d|jD }	t|	dkrrtdd |	D rr|	d jrr|d| |j dd |	D |_g }
g }|jD ],}| j vr|jdkrd|_q j | }|js|| |
| |jjs|jsd|_q|jsdnd}t||kr|| |_|
|_||_t||| ||  t|||  |	D ]}|jdur|j| qt|rd|_dS dS )zPopulate the interface-level information in a class IR.

    This includes attribute and method declarations, and the MRO, among other things, but
    method bodies are generated in a later pass.
    allow_interpreted_subclassesTserializablezbuiltins.BaseExceptionPyBaseExceptionObjectzbuiltins.dictPyDictObjectz	builtins.z3Inheriting from most builtin types is unimplementedc                   s$   g | ]}|j  jv r j|j  qS r?   )r   rX   )rA   baser5   r?   rC   rD     s   $ z%prepare_class_def.<locals>.<listcomp>rI   c                 s  s    | ]}|j  V  qd S r~   r2   rA   cr?   r?   rC   	<genexpr>  s    z$prepare_class_def.<locals>.<genexpr>r   z/Non-trait base must appear first in parent listc                 S  s   g | ]}|j r|qS r?   r   r   r?   r?   rC   rD     s    r   N)rX   rQ   r/   getr   _serializablera   rP   r   
startswithr   rc   rZ   basesr   anyr2   traitsinherits_pythonappenddefnremoved_base_type_exprsrR   r   base_mroprepare_methods_and_attributesprepare_init_methodrW   r0   is_augmented)rY   ry   rE   r<   r5   ru   rQ   attrsclsr   ra   r   ri   base_idxr   r?   r   rC   r[      sd   	



(








r[   c                 C  s@  | j }|j D ]\}}|jrqt|jtrI|jjs J d| |jjsH|dvrH|	|jj}	|j
rC|	jrCt|||	| t|||	| |	|j|< qt|jttfr[t||| ||j qt|jtr|jjrt|jrz|jjD ]
}
t||| ||
 qnq|d|| j q|jjsJ t||| ||jj q|jr|j  dS dS )z+Populate attribute and method declarations.zClass member %s missing type)	__slots____deletable__(Unsupported property decorator semanticsN)rQ   rb   r   plugin_generatedr@   rB   r   r   is_classvartype_to_rtyper2   error_overlapadd_getter_declarationadd_setter_declarationr`   r   r   r   r   r   r   rc   rZ   implr   clear)rE   ru   rY   ry   r<   r5   rQ   rO   rB   
attr_rtypeitemr?   r?   rC   r   >  s8   

r   rQ   r   c              	   C  s   t  }|jD ]}|j D ]\}}|| t| ||||| qq|jdd  D ]}|jrD|j D ]\}}||vrCt| ||||| q2q(d S )NrI   )setr   r`   r   add,add_property_methods_for_attribute_if_neededra   r2   )rQ   ru   ry   r5   concrete_attributesr   rO   r   r?   r?   rC   r]   h  s"   

r]   	attr_namer   r)   c           
      C  s   | j dd D ]Y}||jv r`|j| }|j|}|du rq|j}	t|	tr4|	j|jvr4t	|||| qt|	t
rLt|	rLt	|||| t|||| q|jr`|jr`t	|||| t|||| qdS )zAdd getter and/or setter for attribute if defined as property in a base class.

    Only add declarations. The body IR will be synthesized later during irbuild.
    rI   N)ra   rX   rb   r   rB   r@   r   rO   r   r   r   r   r   r2   r   )
rQ   ru   r   r   ry   r5   r   ri   nrB   r?   r?   rC   r   {  s"   

r   c                 C  sT   t dt| dd}t|g|}t|| j||t}d|_d|_|| j|< || j	|< d S )NselfTr   )
r&   r(   r%   r$   rO   r"   r   implicitr   r   )ru   r   r   ry   self_argr   rt   r?   r?   rC   r     s   
r   c           	      C  sb   t dt| dd}t d|dd}t||gt}t| }t|| j||t}d|_d|_	|| j
|< d S )Nr   Tr   value)r&   r(   r%   r+   r   r$   rO   r"   r   r   r   )	ru   r   r   ry   r   	value_argr   setter_namert   r?   r?   rC   r     s   r   c           	      C  s   | j d j}|jsj|jslt|trn||}|j|j }|d u s*|j	r*| j d j
rD|j jdkrDt|jd tdtttdttg|j}t|j|j }t|jd| t|}t| jd |||_|j|j| j < d S d S d S d S )N__init__r   r   r   kwargsrI   )rQ   rB   r2   r   r@   r   r   rX   r   rR   r   rP   r%   r   r&   r,   r   r*   r	   r   r   num_bitmap_argsr(   r$   rO   rq   rr   )	rE   ru   ry   r5   	init_nodeinit_sigdefining_irlast_argctor_sigr?   r?   rC   r     s,   



	r   c           	        s    j |j }|j}|j D ]F}t|jttfr"t||| |j qt|jt	rT|jj
rIt|js9|d| |j |jjD ]
}t||| | q=qt||| t|j qt fdd|jD rk|d| |j d S d S )Nr   c                 3  s&    | ]}| j v o j | jV  qd S r~   )rX   rR   )rA   r   r   r?   rC   r     s   $ z,prepare_non_ext_class_def.<locals>.<genexpr>z<Non-extension classes may not inherit from extension classes)rX   rQ   rb   rp   r@   rB   r   r   r   r   r   r   rc   rZ   r   r.   r   ra   )	rY   ry   rE   r<   r5   ru   rQ   rB   r   r?   r   rC   r\     s&   
r\   c                   @     e Zd ZU ded< ded< dS )SingledispatchInfoz%dict[FuncDef, list[RegisterImplInfo]]singledispatch_implszdict[FuncDef, list[int]]decorators_to_removeN__name__
__module____qualname____annotations__r?   r?   r?   rC   r        
 r   c                 C  s2   t |}| D ]}|j|_|| qt|j|jS r~   )SingledispatchVisitorrY   current_pathacceptr   r   r   )r6   r<   visitorrG   r?   r?   rC   "find_singledispatch_register_impls  s
   r   c                      s6   e Zd ZU ded< d fddZd fddZ  ZS )r   rz   r   r<   r   r=   r>   c                   s$   t    tt| _i | _|| _d S r~   )superr   r   listr   r   r<   )r   r<   	__class__r?   rC   r      s   


zSingledispatchVisitor.__init__decr   c                   s   |j r^|j  }g }d }t|D ]E\}}t||j}|d urA| j|j |j|jf || |d ur@| j	
d| j|| j qt|drS|| | j|jg  |}q|r^|| j|j< t | d S )Nz:Calling decorator after registering function not supportedzfunctools.singledispatch)r   rT   	enumerate%get_singledispatch_register_call_inforg   r   singledispatch_funcr   dispatch_typer<   rc   r   rZ   r   
setdefaultr   r   visit_decorator)r   r   decorators_to_storer   last_non_registeridr   r   r?   rC   r     s2   




z%SingledispatchVisitor.visit_decorator)r<   r   r=   r>   )r   r   r=   r>   )r   r   r   r   r   r   __classcell__r?   r?   r   rC   r     s   
 r   c                   @  r   )RegisteredImplr   r   r   r   Nr   r?   r?   r?   rC   r   5  r   r   	decoratorr   rg   RegisteredImpl | Nonec                 C  s   t | tr0t| jdkr0t | jd tr0| j}| jd j}t |ts$d S t |tr.t	||S d S t | trR|j
s:d S t|j
d jj}t |tsJd S |j}t	| |S d S )NrI   r   )r@   r
   r   r   r   calleerB   r   r   +registered_impl_from_possible_register_call	argumentsr   variabler   r   )r   rg   r   r   arg_typerQ   r?   r?   rC   r   :  s*   





r   exprr   r   c                 C  s8   | j dkrt| jtr| jj}t|trt|j|S d S )Nregister)rO   r@   r   r   rB   r   r   rg   )r   r   rB   r?   r?   rC   r   Z  s
   
r   N)r5   r-   r6   r7   r8   r   r9   r:   r;   r3   r<   r   r=   r>   )rB   r   rG   r   r=   rl   )r5   r-   r6   r7   ro   r'   r=   r>   )rG   r   r=   rx   )
ry   rz   r{   r|   r}   r   r5   r-   r=   r$   )ru   r    ry   rz   rE   r   r5   r-   rB   r   r=   r>   )r   r   r=   rl   )r   rz   r=   rl   )rY   rz   ry   rz   rE   r   r<   r   r5   r-   r=   r>   )rE   r   ru   r    rY   rz   ry   rz   r<   r   r5   r-   r=   r>   )
rQ   r   ru   r    ry   rz   r5   r-   r=   r>   )rQ   r   ru   r    r   rz   r   r)   ry   rz   r5   r-   r=   r>   )
ru   r    r   rz   r   r)   ry   rz   r=   r>   )
rE   r   ru   r    ry   rz   r5   r-   r=   r>   )r6   r7   r<   r   r=   r   )r   r   rg   r   r=   r   )r   r   r   r   r=   r   )^__doc__
__future__r   collectionsr   typingr   r   r   
mypy.buildr   
mypy.nodesr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   mypy.semanalr   mypy.traverserr   
mypy.typesr   r   r   mypyc.commonr   r   mypyc.crashr   mypyc.errorsr   mypyc.ir.class_irr    mypyc.ir.func_irr!   r"   r#   r$   r%   r&   mypyc.ir.opsr'   mypyc.ir.rtypesr(   r)   r*   r+   r,   mypyc.irbuild.mapperr-   mypyc.irbuild.utilr.   r/   r0   r1   r2   mypyc.optionsr3   mypyc.sametyper4   rk   rn   rw   r^   r_   r   r   r   r[   r   r]   r   r   r   r   r\   RegisterImplInfor   r   r   r   r   r   r?   r?   r?   rC   <module>   sV    D 

E







O
*






8
 