
    X-Ph                        U d 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mZmZmZmZmZ ddlmZmZm Z  ddl!m"Z" ddl#m$Z$m%Z% dd	l&m'Z'm(Z( dd
l)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z? ddl@mAZAmBZB ddlCmDZDmEZEmFZFmGZGmHZH ddlImJZJmKZKmLZLmMZM ddlNmOZOmPZP ddlQmRZRmSZSmTZTmUZUmVZV ddlWmXZXmYZYmZZZm[Z[m\Z\m]Z] ddl^m_Z_ dZdZ` G d d          Za G d dea          Zb G d dea          Zc G d  d!ec          Zd G d" d#ed          Zed[d%Zfd\d,Zgd-Zhd.eid/<   d[d0Zjd]d2Zkd^d4Zl	 d_d`d>ZmdadAZn	 d_dbdEZodcdHZpdddKZqdZdLZrdedNZsdfdPZtdgdRZudhdTZvdidUZw	 djdkdYZxd5S )lz9Transform class definitions from the mypy AST form to IR.    )annotations)abstractmethod)CallableFinal)EXCLUDED_ENUM_ATTRIBUTESTYPE_VAR_TUPLE_KINDAssignmentStmtCallExprClassDef	DecoratorEllipsisExprExpressionStmtFuncDefLvalue
MemberExprNameExprOverloadedFuncDefPassStmtRefExprStrExprTempNodeTypeInfo	TypeParamis_class_var)InstanceUnboundTypeget_proper_type)PROPSET_PREFIX)ClassIRNonExtClassInfo)FuncDeclFuncSignature)NAMESPACE_TYPE
BasicBlockBranchCall
InitStaticLoadAddressLoadErrorValue
LoadStatic
MethodCallRegisterReturnSetAttrTupleSetValue)RTypebool_rprimitivedict_rprimitiveis_none_rprimitiveis_object_rprimitiveis_optional_typeobject_rprimitive)	IRBuildercreate_type_params)gen_property_getter_irgen_property_setter_irhandle_ext_methodhandle_non_ext_method	load_type)dataclass_typeget_func_defis_constantis_dataclass_decorator)dict_new_opdict_set_item_op)iter_opnext_oppy_get_item_oppy_hasattr_oppy_setattr_op)dataclass_sleight_of_hand	import_opnot_implemented_oppy_calc_meta_oppytype_from_template_optype_object_op)
is_subtypebuilderr8   cdefr   returnNonec                	   |j         | j        j        vr|                     d|j                   dS | j        j        |j                  t          fdt          t          j                  dz
            D                       r|                     d|j                   j	        rDj
        D ]<}|j	        s3|                     d                    |j                  |j                   =j        r]t          |          }|t          | |          }nK|dv rt!          | |          }n6|dk    rt#          | |          }nt%          |          t'          | |          }|j        j        D ]v}t-          |t.                    r|j        rt-          |t&                    r|                     d	|j                   |j        D ]V}|                     |j                  5  |                    t9          |                     ddd           n# 1 swxY w Y   Wt-          |t:          t<          t.          f          rs|j         j        |j                  j!        r|                     |j                  5  |                    t9          |                     ddd           n# 1 swxY w Y   Ct-          |tD                    s/t-          |tF                    rt-          |j$        tJ                    rt-          |tL                    rt          |j'                  dk    r|                     d
|j                   |j'        d         }t-          |tP                    s|                     d|j                   |)                    ||           *t-          |tF                    rt-          |j$        tT                    r[|                     d|j                   xj+                                        D ]\  }}	|	j,        r|	j-        rt]          | |	|j/                  }
| j0        1                    |
           |
j2        |
j3        j         <   d}th          |z   }|j+        v rFtk          | j+        |         |j/                  }| j0        1                    |           |j2        |<   |
|fj6        |<   |7                               dS )a  Create IR for a class definition.

    This can generate both extension (native) and non-extension
    classes.  These are generated in very different ways. In the
    latter case we construct a Python type object at runtime by doing
    the equivalent of "type(name, bases, dict)" in IR. Extension
    classes are defined via C structs that are generated later in
    mypyc.codegen.emitclass.

    This is the main entry point to this module.
    z&Nested class definitions not supportedNc              3  `   K   | ](}j         |         j        j         |d z            k    V  )dS )   N)base_mrobase).0iirs     V/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/mypyc/irbuild/classdef.py	<genexpr>z&transform_class_def.<locals>.<genexpr>l   s<      
Z
Z2;q>"+a!e"44
Z
Z
Z
Z
Z
Z    rW   z9Multiple inheritance is not supported (except for traits)z5Base class "{}" does not allow interpreted subclasses)dataclassesz	attr-autoattrz7Property setters not supported in non-extension classesz1Multiple assignment in class bodies not supportedr   z9Only assignment to variables is supported in class bodiesz#Unsupported statement in class body)8infomapper
type_to_irerrorlineanyrangelenrX   allow_interpreted_subclassesmroformatfullnameis_ext_classr?   ExtClassBuilderDataClassBuilderAttrsClassBuilder
ValueErrorNonExtClassBuilderdefsbody
isinstancer   is_propertyitemscatch_errors
add_methodr@   r   r   namesnameplugin_generatedr   r   exprr   r	   lvaluesr   add_attrr   method_declsimplicitis_prop_getterr:   is_trait	functionsappendmethodsdeclr   r;   
propertiesfinalize)rQ   rR   parentcls_typecls_builderstmtitemlvaluer|   r   	getter_ir	setter_irsetter_namer\   s                @r]   transform_class_defr   W   si    y111>	JJJ		"49	-B
 
Z
Z
Z
ZeCDTDTWXDX>Y>Y
Z
Z
ZZZ ^QSWS\]]]	& f 	 	F6 KRR  I	   
 8!$''(7(F(FKK555*7D99KK+GT::KKX&&&($77	 'L 'Ld-.. &	L43C &	L+'9:: d WY]Ybccc
 ? ?))$)44 ? ?**<+=+=>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? w	3DEFF 	L yty): %%di00 ; ;&&|D'9'9:::; ; ; ; ; ; ; ; ; ; ; ; ; ; ;h'' 	Lt^,,	L1;DI|1T1T	L n-- 	L4<  A%%QSWS\]]]\!_Ffh// OQUQZ      ....n-- 	L*TY2P2P 	LMM?KKKK o++-- 9 9
d= 	9T0 	9.wdBKPPI$$Y///.7BJy~*+I(4/Kbo--2R_[94 	 !((333*3
;'#,i"8BM$ s$   #HHH3#J""J&	)J&	c                  b    e Zd ZdZddZedd            Zedd            Zedd            ZdS )ClassBuilderzKCreate IR for a class definition.

    This is an abstract base class.
    rQ   r8   rR   r   rS   rT   c                0    || _         || _        g | _        d S N)rQ   rR   attrs_to_cache)selfrQ   rR   s      r]   __init__zClassBuilder.__init__   s    	:<r_   fdefr   c                    dS )zAdd a method to the class IRN r   r   s     r]   rz   zClassBuilder.add_method         r_   r   r   r   r	   c                    dS )z Add an attribute to the class IRNr   r   r   r   s      r]   r   zClassBuilder.add_attr   r   r_   r\   r   c                    dS )z5Perform any final operations to complete the class IRNr   )r   r\   s     r]   r   zClassBuilder.finalize   r   r_   NrQ   r8   rR   r   rS   rT   r   r   rS   rT   r   r   r   r	   rS   rT   r\   r   rS   rT   )	__name__
__module____qualname____doc__r   r   rz   r   r   r   r_   r]   r   r      s         
= = = =
 + + + ^+ / / / ^/ D D D ^D D Dr_   r   c                  @     e Zd Zd fdZdd	ZddZddZddZ xZS )rs   rQ   r8   rR   r   rS   rT   c                ~    t                                          ||           |                                 | _        d S r   superr   create_non_ext_infonon_extr   rQ   rR   	__class__s      r]   r   zNonExtClassBuilder.__init__   4    $'''//11r_   r    c                   t          | j        | j                  }t          | j        | j        |          }t	          | j        | j        ||          }| j                            t          g | j        j                  }t          ||||          S r   )	populate_non_ext_basesrQ   rR   find_non_ext_metaclasssetup_non_ext_dictcall_crC   rf   r    )r   non_ext_basesnon_ext_metaclassnon_ext_dictnon_ext_annss        r]   r   z&NonExtClassBuilder.create_non_ext_info   s|    .t|TYGG24<MZZ)L$)%6
 
 |**;DINKK|]LJ[\\\r_   r   r   c                H    t          | j        | j        | j        |           d S r   )r=   rQ   r   rR   r   s     r]   rz   zNonExtClassBuilder.add_method   s"    dlDL$)TJJJJJr_   r   r   r   r	   c                    t          | j        | j        ||           t          | j        | j        ||| j        | j                   d S r   )add_non_ext_class_attr_annrQ   r   add_non_ext_class_attrrR   r   r   s      r]   r   zNonExtClassBuilder.add_attr   sL    "4<vtLLLL$,diAT	
 	
 	
 	
 	
r_   r\   r   c                   t          | j        || j        | j        j                  }t          | j        | j        |          }| j                            t          || j        j        | j        j	        t                               | j                            t          | j                                        | j                            | j        j                  |g| j        j                   t          | j        | j        | j                   d S r   )load_non_ext_classrQ   r   rR   rf   load_decorated_classaddr'   r|   module_namer#   primitive_oprD   load_globals_dictload_strcache_class_attrsr   )r   r\   non_ext_classs      r]   r   zNonExtClassBuilder.finalize   s    *4<T\49>ZZ,T\49mTT 	}dindl6NP^__	
 	
 	

 	!!..00%%din55
 IN	
 	
 	
 	$,(;TYGGGGGr_   r   rS   r    r   r   r   )	r   r   r   r   r   rz   r   r   __classcell__r   s   @r]   rs   rs      s        2 2 2 2 2 2
] 
] 
] 
]K K K K
 
 
 
H H H H H H H Hr_   rs   c                  @     e Zd Zd fdZddZddZddZddZ xZS )ro   rQ   r8   rR   r   rS   rT   c                v    t                                          ||           t          ||          | _        d S r   )r   r   allocate_classtype_objr   s      r]   r   zExtClassBuilder.__init__  s2    $'''&4Wd&C&Cr_   r|   strr   r	   boolc                    dS )z?Controls whether to skip generating a default for an attribute.Fr   r   r|   r   s      r]   skip_attr_defaultz!ExtClassBuilder.skip_attr_default  s    ur_   r   r   c                <    t          | j        | j        |           d S r   )r<   rQ   rR   r   s     r]   rz   zExtClassBuilder.add_method  s    $,	488888r_   r   r   c                   t          |j        t                    rd S t          |          s	|j        sd S | j                            | j        j                  }| j        	                    |j                  }| j        
                    t          || j                            |j                  |g|j                   | j                                        r/|j        r*| j                            ||| j        j                   d S d S d S r   )rv   rvaluer   r   is_final_defrQ   load_native_type_objectrR   rm   acceptr   rI   r   r|   rf   non_function_scopeinit_final_static)r   r   r   typvalues        r]   r   zExtClassBuilder.add_attr!  s   dk8,, 	FV$$ 	(9 	Fl22493EFF##DK00!!C!6!6v{!C!CUKTY	
 	
 	
 <**,, 	J1B 	JL**65$).IIIII	J 	J 	J 	Jr_   r\   r   c                    t          | j        | j        | j                  \  }}|j                            |           t          | j        | j        |           t          | j        | j                   d S r   )find_attr_initializersrQ   rR   r   attrs_with_defaultsupdategenerate_attr_defaults_initcreate_ne_from_eq)r   r\   r   default_assignmentss       r]   r   zExtClassBuilder.finalize0  sq    3IL$)T%;4
 4
00 	%%&9:::#DL$)=PQQQ$,	22222r_   r   r|   r   r   r	   rS   r   r   r   r   )	r   r   r   r   r   rz   r   r   r   r   s   @r]   ro   ro     s        D D D D D D
   9 9 9 9J J J J3 3 3 3 3 3 3 3r_   ro   c                  T     e Zd ZdZd fdZdd
ZddZddZd fdZd fdZ	 xZ
S )rp   TrQ   r8   rR   r   rS   rT   c                ~    t                                          ||           |                                 | _        d S r   r   r   s      r]   r   zDataClassBuilder.__init__?  r   r_   r    c                   t          | j                            t          g | j        j                  | j                            t          g | j        j                            | j                            t          g | j        j                  | j                            t          t          j
        t          j        | j        j                                      S )a  Set up a NonExtClassInfo to track dataclass attributes.

        In addition to setting up a normal extension class for dataclasses,
        we also collect its class attributes like a non-extension class so
        that we can hand them to the dataclass decorator.
        )r    rQ   r   rC   rR   rf   r   r/   r(   rO   typesrc)r   s    r]   r   z$DataClassBuilder.create_non_ext_infoC  s     LR@@LXb$).99::LR@@L[)<n>PRVR[R`aabb	
 
 	
r_   r|   r   r   r	   r   c                    |j         d uS r   r   r   s      r]   r   z"DataClassBuilder.skip_attr_defaultQ  s    y$$r_   TypeInfo | Nonec                f    t          |j                  }t          |t                    r|j        S d S r   )r   r   rv   r   )r   r   ann_types      r]   get_type_annotationz$DataClassBuilder.get_type_annotationT  s2     #49--h)) 	!= tr_   r   r   c                    t          | j        | j        ||| j                   t	          | j        | j        ||| j        | j                   t                                          ||           d S r   )	r   rQ   r   r   r   rR   r   r   r   )r   r   r   r   s      r]   r   zDataClassBuilder.add_attr\  ss    "L$,d6N	
 	
 	
 	L$,diAT	
 	
 	
 	&&&&&r_   r\   r   c                   t                                          |           | j        sJ t          | j        | j        | j        j        | j                   | j        	                    t          d | j        j        D                                 }| j                            t          | j                  pd          }| j                            t          || j        | j        j        | j        j        |g| j        j                   dS )ap  Generate code to finish instantiating a dataclass.

        This works by replacing all of the attributes on the class
        (which will be descriptors) with whatever they would be in a
        non-extension class, calling dataclass, then switching them back.

        The resulting class is an extension class and instances of it do not
        have a __dict__ (unless something else requires it).
        All methods written explicitly in the source are compiled and
        may be called through the vtable while the methods generated
        by dataclasses are interpreted and may not be.

        (If we just called dataclass without doing this, it would think that all
        of the descriptors for our attributes are default values and generate an
        incorrect constructor. We need to do the switch so that dataclass gets the
        appropriate defaults.)
        c              3  8   K   | ]}t          |          |V  d S r   )rB   )rZ   ds     r]   r^   z,DataClassBuilder.finalize.<locals>.<genexpr>}  s0      NNq4J14M4MNNNNNNNr_   unknownN)r   r   r   add_dunders_to_non_ext_dictrQ   r   rR   rf   add_annotations_to_dictr   next
decoratorsr   r?   r   rJ   dictanns)r   r\   decdataclass_type_valr   s       r]   r   zDataClassBuilder.finalizee  s    $ 	}#L$,	8T	
 	
 	
 l!!NNDI0NNNNN
 
 "\22>$)3L3L3YPYZZ%$-!2DL4EGYZIN	
 	
 	
 	
 	
r_   r   r   r   r   r	   rS   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   s   @r]   rp   rp   9  s         #2 2 2 2 2 2
 
 
 
% % % %   ' ' ' ' ' '
 
 
 
 
 
 
 
 
 
r_   rp   c                  &    e Zd ZdZdZdd	ZddZdS )rq   aS  Create IR for an attrs class where auto_attribs=False (the default).

    When auto_attribs is enabled, attrs classes behave similarly to dataclasses
    (i.e. types are stored as annotations on the class) and are thus handled
    by DataClassBuilder, but when auto_attribs is disabled the types are
    provided via attr.ib(type=...)
    Fr|   r   r   r	   rS   r   c                    dS )NTr   r   s      r]   r   z#AttrsClassBuilder.skip_attr_default  s    tr_   r   c                   t          |j        t                    r|j        j        }t          |t                    r|j        dv rd|j        j        v r|j        j                            d          }|j        j        |         }t          |t                    rEt          |j
        t                    r+|j        d         }t          |t                    sJ |j
        S d S )N)zattr.ibz	attr.attrr   r   )rv   r   r
   calleer   rm   	arg_namesindexargsr   noder   r   )r   r   r  r  	type_namer   s         r]   r   z%AttrsClassBuilder.get_type_annotation  s    dk8,, 	*['F6:..
*O'???dk333-33F;; K,U3	i22 *z).RZ7[7[ *!\!_F%fh77777$>)tr_   Nr   r  )r   r   r   r   r   r   r   r   r_   r]   rq   rq     sN          $        r_   rq   r0   c                    |j         |j        z   }|j        }|rt           |j        ||j                  g}ng }|s|r=|                     fd|D                                             ||j                  }n)                     t          t          d                    }                      j                  }                     t          t          |j        dz    j        t                              }                     t"          |||g|j                  } j        j        |j                 }	|	j        s[|	j        sT                     t/          t1          |j        dz   d  j        t3          g t4                              g d                                          t8          |                     d          t;            j        j        |j                 |j                  g|j                                        t=          ||j         j        t                                                    t>                                                                 |j                  |g|j                   |S )Nc                :    g | ]}                     |          S r   )r   )rZ   xrQ   s     r]   
<listcomp>z"allocate_class.<locals>.<listcomp>  s%    <<<AgnnQ''<<<r_   T)is_borrowed	_template_trait_vtable_setup__mypyc_attrs__)!base_type_exprsremoved_base_type_exprs	type_argsmake_generic_base_classrm   rf   extend	new_tupler   r)   r7   r   r   r*   r|   r#   r   rN   rc   rd   rb   r   builtin_baser&   r!   r"   r2   r   rI   create_mypyc_attrs_tupler'   rD   r   )
rQ   rR   
base_exprsnew_style_type_argsbasestp_basesmodnametemplatetpr\   s
   `         r]   r   r     sr   %(DDJ. ($-ATVZV_``a T( T<<<<<<<===$$UDI66;;~.?TRRRSSw233G{{$di+&=w?RTbcc H 
/(Hg1NPTPY	Z	ZB		"49	-B; 
r 
I 55'!"o66	  	 		
 	
 	
 .//$Wgn.G	.RTXT]^^	

 		   KK
2ty'*=~NNOOO 744668H8H8S8SUWXZ^Zc   Ir_   rm   r   r  list[TypeParam]rf   intc                F   |                      t          |                     d          g|          }t          | |||          }g }t	          ||          D ]d\  }}|j        t          k    r:|                     t          |g|          }	|                      t          |	g|          }|
                    |           e|                     |d|          }
t          |          dk    r	|d         }n|                     ||          }|                     t          |
|g|          }|S )zUConstruct Generic[...] base class object for a new-style generic class (Python 3.12)._typingGenericrW   r   )r   rK   r   r9   zipkindr   r   rE   rF   r   py_get_attrri   r  rG   )rQ   rm   r  rf   modtvsr	  tv
type_paramitgentargrY   s                r]   r  r    s    ..W%5%5i%@%@$A4
H
HC
Wc9d
;
;CDc9--  J?111%%gtT::B"t44BBsIt44D
4yyA~~1gd++sTBBDKr_   )ztyping._TypedDictztyping_extensions._TypedDictzFinal[tuple[str, ...]]MAGIC_TYPED_DICT_CLASSESc                D   |j         j        }| j        j        |j                  }g }d |j         j        D             D ]I}|j        dk    r|r
|j        dv r|| j        j        v r3| j        j        |         }|j        |j                            |           |j        t          v r!d}d}| 	                    |||j
                  }	n|r*|j        dk    rd}| 	                    d||j
                  }	nm|j                            d	d
          d         }
|
| j        k    r!|                     |j        |j
                  }	n |                     |j        |j
                  }	|                    |	           |j        t          v r nK|                     ||j
                  S )zmCreate base class tuple of a non-extension class.

    The tuple is passed to the metaclass constructor.
    c              3  $   K   | ]}|j         V  d S r   r   )rZ   bs     r]   r^   z)populate_non_ext_bases.<locals>.<genexpr>  s$      001000000r_   zbuiltins.object)ztyping.Sequenceztyping.Iterableztyping.Collectionztyping.Reversibleztyping.Containerztyping.SizedNtyping
_TypedDictzbuiltins.tuple_NamedTuple.rW   r   )rb   is_named_tuplerc   rd   r  rm   childrenr   r3  get_module_attrrf   rsplitcurrent_moduleload_global_strr|   load_module_attr_by_fullnamer  )rQ   rR   r;  r\   r  clsbase_irmoduler|   rY   
cls_modules              r]   r   r      s   
 Y-N		"49	-BE00	000 & &<,,, 
	cl /
 
 
 '.+++n/4G+ ''+++<333 FD**64CCDD 	U0@ @ @ D**8T49EEDD,,S!44Q7JW333..sxCC;;CL$)TTT<333E 4 UDI...r_   r  c                   |j         r|                     |j                   }n|j        j        ,| j        j        dk    r|                     dd|j                  S |j        j        r,| j        j        dk    r|                     dd|j                  S | 	                    t          t          j        t          j        |j                            }|                     t          ||g|j                  S )z6Find the metaclass of a class from its defs and bases.N)   	   r7  _TypedDictMetaNamedTupleMeta)	metaclassr   rb   typeddict_typeoptionscapi_versionr=  rf   r;  r   r(   rO   r   r   r   rM   )rQ   rR   r  declared_metaclasss       r]   r   r   2  s    ~ 
$^^DN;;9#/GO4PTZ4Z4Z **85EtyQQQY% 	R'/*F&*P*P **85EtyQQQ$[[+^-?KK
 
 >>/,>+F	RRRr_   rK  c                D   |                      t          ||                     d          g|j                  }t	          t
                    }t                      t                      t                      }}}|                     |||           |                     |           |                     |j	                  }	| 
                    |d|j                  }
|                     |
|	|g|j                  }|                     |||j                   |                     |           |                     |           |                     ||                     t          g |j                  |j                   |                     |           |                     |           |S )zInitialize the class dictionary for a non-extension class.

    This class dictionary is passed to the metaclass constructor.
    __prepare__)r   rH   r   rf   r,   r3   r$   add_bool_branchactivate_blockr|   r+  py_callassigngotor   rC   )rQ   rR   rK  r  has_preparer   
true_blockfalse_block
exit_blockcls_nameprepare_methprepare_dicts               r]   r   r   G  sg    &&	7#3#3M#B#BCTY K O,,L*4,,
jllZJK[AAA:&&&	**H&&y-KKL??<(E1BDINNLNN<ty999LL;'''NN<R!K!KTYWWWLL:&&&r_   Nr   r    r   r   r   r	   get_type_info2Callable[[AssignmentStmt], TypeInfo | None] | Nonec                   d}|d ||          }|rW| j         |j        k    r+|j        |j        k     r|                     |j                  }nt          | ||j        |j                  }|t          |j                  }t          |j        t                    r,|j        j         |                     |j        j                  }ntt          |t                    r"t          | |j        |j        |j                  }n=|                     t          t          j        t          j        |j                            }|                     |j                  }|                     t&          |j        ||g|j                   dS )zBAdd a class attribute to __annotations__ of a non-extension class.N)r?  r   rf   r   rm   r>   unanalyzed_typer   r   rv   r   original_str_exprr   r   r(   rO   r   r|   r   rD   r   )	rQ   r   r   r   r^  r   	type_infor   keys	            r]   r   r   g  s`    C !M$''	 
	U %)>>>49y~C]C]&&y'9::D4H$)TT
{"49--t+[99	_$6B ""4#7#IJJCC(++ 	_GX]D4H$)TTCC++k.*=~?QSWS\]]^^C


6;
'
'C)GL#s+CTYOOOOOr_   attr_to_cachelist[tuple[Lvalue, RType]]c                f   t          |j        t                    s|                     |j                  }|                     ||j        ||j                   |j        j        rJ|j        j        d         j	        j
        r0|j        t          vr$|                    |t          f           dS dS dS dS dS )z;Add a class attribute to __dict__ of a non-extension class.r  N)rv   r   r   r   add_to_non_ext_dictr|   rf   rb   r  r   is_enumr   r   r7   )rQ   r   r   r   rR   re  r   s          r]   r   r     s     dk8,, >,,##GV[&$)LLL IO	> 	#(0	>
 #;;;   &*;!<=====> >
	> 	> 	> 	>
 <;r_   skip,Callable[[str, AssignmentStmt], bool] | None%tuple[set[str], list[AssignmentStmt]]c                   | j         j        |j                 }|j        rt	                      g fS t	                      }g }t          |j        j                  D ]p}|| j         j        vr|j        j        j	        D ]K}t          |t                    r2t          |j        d         t                    rt          |j        d                   st          |j        t                     s|j        d         j        }|dk    r|dk    rt%          | ||j                   | |||          r|                    |          }	t          |j        t*                    r?|j        j        dk    r/t/          |	          s t1          |	          st3          |	          s!|                    |           |                    |           Mr||fS )a  Find initializers of attributes in a class body.

    If provided, the skip arg should be a callable which will return whether
    to skip generating a default for an attribute.  It will be passed the name of
    the attribute and the corresponding AssignmentStmt.
    r   	__slots____deletable__Nzbuiltins.None)rc   rd   rb   r  setreversedrk   defnrt   ru   rv   r	   r   r   r   r   r   r|   check_deletable_declarationrf   	attr_typer   rm   r6   r5   r4   r   r   )
rQ   rR   rj  rB  r   r   rb   r   r|   rt  s
             r]   r   r     s    .
#DI
.C
 uuby%% '' "1 "1w~000IN' 	1 	1D4001t|A991 %T\!_551 #4;99	1 |A+;&&?**/diHHH#T4(8(8#MM$//	 dk733 !8LP_8_8_,Y77! 4Y ? ?! !39 = =!
 !#''---#**4000?	1B  333r_   r   list[AssignmentStmt]c                ,   |sdS | j         j        |j                 }|j        rdS |                     |dt
                    5  |                                 }|D ]}|j        d         }t          |t                    sJ |j
        s4t          |j                  s |                     d|j        j                   |                    |j                  }|                     |                     |j                  ||j                  }t'          ||j        |d          }	|	                                 |                     |	           |                     t-          |                                                      ddd           dS # 1 swxY w Y   dS )zLGenerate an initialization method for default attr values (from class vars).N__mypyc_defaults_setupr   z#Unsupported default attribute valuer  )rc   rd   rb   r  enter_methodr2   r   r   rv   r   r   rA   r   warningrf   rt  r|   coercer   r.   mark_as_initializerr   r-   true)
rQ   rR   r   rB  self_varr   r   rt  valinits
             r]   r   r     s     
.
#DI
.C
 			c#;_	M	M , ,<<>>' 
	 
	D\!_Ffh/////$ Y[-E-E Y Et{GWXXXfk22I..!<!<iSSC8V[#r::D$$&&&KKF7<<>>**+++, , , , , , , , , , , , , , , , , ,s   D;F		FFclr   c                   |j         D ]}||j        vr|                    |          s|                     d| d|           ;|j        D ]'}||j        v r|                     d| d|            nN(|                    |          \  }}|                     d                    ||j        |j                  |           d S )NzAttribute "z" not definedzCannot make property "z" deletablez4Attribute "{}" not defined in "{}" (defined in "{}"))		deletable
attributeshas_attrre   rk   property_typesattr_detailsrl   r|   )rQ   r  rf   ra   rY   _s         r]   rs  rs    s      r}$$;;t$$ ?D???FFF  4...MM"L4"L"L"LdSSSE / //$//4PXXbgty  	   r_   c                    | j         j        |j                 }|                    d          r-|                    d          st	          | ||j                   dS dS dS )zHCreate a "__ne__" method from a "__eq__" method (if only latter exists).__eq____ne__N)rc   rd   rb   
has_methodgen_glue_ne_methodrf   )rQ   rR   rB  s      r]   r   r     sh    
.
#DI
.C
~~h 4x(@(@ 47C333334 4 4 4r_   rB  c                l   |                     d          }|sJ |j        j        }| j        j        }|                     |d|j                  5  |r|j        d         j        nt          }| 
                    d|          }|                     t          |                                 d|g|                    }t          t          j        |j                  }	t          |j        t                     }
|r|	rFt#                      t#                      }}|                     t%          t          j        t          j        |                    }|                     t)          |                     ||d|          ||t(          j                             |                     |           |
r	|rt           nt          }|                     |                     |d|          ||          }|                     t5          |                     |                     |           |                     t5          |                     n`|
r	|rt           nt          }|                     |                     |d|          ||          }|                     t5          |                     ddd           dS # 1 swxY w Y   dS )z2Generate a "__ne__" method from a "__eq__" method.r  r  r   rhsisnotN)
get_methodr   sigrM  strict_dunders_typingrx  ret_typer	  r   r7   add_argumentr   r+   r   rP   rL   r2   r$   r(   r   r%   translate_is_opBOOLrS  rz  unary_opr-   )rQ   rB  rf   func_ireq_sigstrict_typingrhs_typerhs_argeqvalcan_return_not_implementedreturn_boolnot_implemented_blockregular_blocknot_implementedrettyperetvals                   r]   r  r    s   nnX&&GNNN\FO9M			c8V_	=	= ( (*7N6;q>&&=N&&uh77Jw||~~x'DQQRR%/0B0G%Y%Y" /BB 	( : 	(3=<<=!%kk.35G5KTRR O KK++E?D$OO)!K	    ""=111)4]]ooL]G^^G$4$4UE4$H$H'SWXXFKKv'''""#8999KK//0000)4]]ooL]G^^G$4$4UE4$H$H'SWXXFKKv'''?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   IJ))J-0J-r\   c                    |                      |j                  }t          | ||           |                     |j        ||j        |j        g|          }|S r   )r   r|   r   rT  rK  r  r   )rQ   r\   r   rf   r[  class_type_objs         r]   r   r   G  s[     ((H$777__HgmW\BD N r_   r   c                    |j         }|}t          |          D ]P}|                    | j                  }t	          |t
                    sJ |                     ||g|j                  }Q|S )am  Apply class decorators to create a decorated (non-extension) class object.

    Given a decorated ClassDef and a register containing a
    non-extension representation of the ClassDef created via the type
    constructor, applies the corresponding decorator functions on that
    decorated ClassDef and returns a register containing the decorated
    ClassDef.
    )r   rq  r   visitorrv   r0   rT  rf   )rQ   rR   r   r   	dec_classr   	decorators          r]   r   r   T  ss     JIj!! L LHHW_--	)U+++++OOI	{INKK		r_   r   c                    |                      |j        j                  }|D ][\  }}t          |t                    sJ |                     ||j        |j                  }|                     |||j        |           \dS )z6Add class attributes to be cached to the global cache.)type_overrideN)	r   rb   rm   rv   r   r+  r|   rf   r   )rQ   r   rR   r   lvalrtypervals          r]   r   r   f  s     
)
)$)*<
=
=C% N Ne$)))))""3	49==!!$diu!MMMMN Nr_   c                     d |j         D             }|j        r|                    d            fd|D             }                     ||          S )Nc                &    g | ]}|j         D ]}|S r   )r  )rZ   ancestorr|   s      r]   r  z,create_mypyc_attrs_tuple.<locals>.<listcomp>r  s(    IIIhX5HIITTIIIIr_   __dict__c                :    g | ]}                     |          S r   )r   )rZ   ra   rQ   s     r]   r  z,create_mypyc_attrs_tuple.<locals>.<listcomp>u  s'    666Wd##666r_   )rk   inherits_pythonr   r  )rQ   r\   rf   attrsrx   s   `    r]   r  r  q  sd    II"&IIIE	 !Z   6666666EUD)))r_   Tadd_annotationsr   c                    |r|                      |d|j        |           d}|                      |d|                     |          |           |                      |d|                     | j                  |           d S )N__annotations__zmypyc filler docstringr   r   )rh  r   r   r   )rQ   r   rf   r  filler_doc_strs        r]   r   r   y  s      T##G->dSSS
 .NG4D4D^4T4TVZ[[[w7G7GH[7\7\^bcccccr_   r   )rQ   r8   rR   r   rS   r0   )
rQ   r8   rm   r   r  r$  rf   r%  rS   r0   )rQ   r8   rR   r   r  r0   rS   r0   )
rQ   r8   rR   r   rK  r0   r  r0   rS   r0   r   )rQ   r8   r   r    r   r   r   r	   r^  r_  rS   rT   )rQ   r8   r   r    r   r   r   r	   rR   r   re  rf  rS   rT   )rQ   r8   rR   r   rj  rk  rS   rl  )rQ   r8   rR   r   r   ru  rS   rT   )rQ   r8   r  r   rf   r%  rS   rT   )rQ   r8   rB  r   rf   r%  rS   rT   )
rQ   r8   r\   r   r   r    rf   r%  rS   r0   )rQ   r8   rR   r   r   r0   rS   r0   )rQ   r8   r   rf  rR   r   rS   rT   )rQ   r8   r\   r   rf   r%  rS   r0   )T)
rQ   r8   r   r    rf   r%  r  r   rS   rT   )yr   
__future__r   abcr   r7  r   r   
mypy.nodesr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
mypy.typesr   r   r   mypyc.commonr   mypyc.ir.class_irr   r    mypyc.ir.func_irr!   r"   mypyc.ir.opsr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   mypyc.ir.rtypesr1   r2   r3   r4   r5   r6   r7   mypyc.irbuild.builderr8   r9   mypyc.irbuild.functionr:   r;   r<   r=   r>   mypyc.irbuild.utilr?   r@   rA   rB   mypyc.primitives.dict_opsrC   rD   mypyc.primitives.generic_opsrE   rF   rG   rH   rI   mypyc.primitives.misc_opsrJ   rK   rL   rM   rN   rO   mypyc.subtyperP   r   r   rs   ro   rp   rq   r   r  r3  r  r   r   r   r   r   r   r   rs  r   r  r   r   r   r  r   r   r_   r]   <module>r     s   ? ? ? " " " " " "       " " " " " " " "                                           , > = = = = = = = = = ' ' ' ' ' ' 6 6 6 6 6 6 6 6 4 4 4 4 4 4 4 4                                                  @ ? ? ? ? ? ? ?              a ` ` ` ` ` ` ` ` ` ` ` C C C C C C C C                             % $ $ $ $ $o o o odD D D D D D D D00H 0H 0H 0H 0H 0H 0H 0Hf"3 "3 "3 "3 "3l "3 "3 "3JK
 K
 K
 K
 K
 K
 K
 K
\    (   @6 6 6 6r   44     // // // //dS S S S*   J IM+P +P +P +P +P\> > > >8 ^b64 64 64 64 64r, , , ,6   (4 4 4 4%( %( %( %(P
 
 
 
   $N N N N* * * * VZd d d d d d dr_   