o
    ٰiN                     @  s~   d Z ddlmZ ddlZddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZmZ e
dZdddZdddZdddZdS )z7Utilities for constructing Python proxies of FFI types.    )annotationsN)MISSING)AnyCallableTypeTypeVarcast   )Object	TypeFieldTypeInfo_InputClsType	type_infor   clsType[_InputClsType]methods$dict[str, Callable[..., Any] | None]returnc           
        s   | j d u s	J dj}|tfkrtf}tj  dd   dd  d d< |  d< | jD ]
}| |j	< q0d fdd}|
 D ]\}}|d urT||| qG| jD ]	}||j	|j qXtj| }	j|	_tjdd|	}	ttt |	S )NzType class is already created__dict____weakref__ 	__slots____tvm_ffi_type_info__namestrfuncCallable[..., Any]r   Nonec                   sf   | dkrd} |  v rd S j |_ | |_j d|  |_d|  dj d|_| | < t| | d S )N__ffi_init____c_ffi_init__.zMethod `z` of class ``)
__module____name____qualname____doc__setattr)r   r   attrsr   r   N/home/ubuntu/.local/lib/python3.10/site-packages/tvm_ffi/dataclasses/_utils.py_add_method:   s   z%type_info_to_cls.<locals>._add_method)updated)r   r   r   r   r   r   )type_cls	__bases__objectr
   dictr   popfieldsas_propertyr   itemsr   r   typer#   r"   	functoolswrapsr   r   r   )
r   r   r   	cls_basesfieldr*   r   method_implmethodnew_clsr   r'   r)   type_info_to_cls"   s,   




r<   r,   r4   
type_fieldr   r   c                 C  s   ddl m}m } |j}t| |t}|tu r| }n#t||rnt|tttt	t
d fr1||d}ntd|j d| t||sCJ |j|_||_d S )N   )Fieldr8   )defaultzCannot recognize field: z: )r8   r?   r   getattrr   
isinstanceintfloatr   boolr4   
ValueErrordataclass_field)r,   r=   r?   r8   
field_namerhsr   r   r)   fill_dataclass_fieldS   s   

rJ   Callable[..., None]c              
   C  s$  g }|}|dur| t|j |j}|dus|  |jD ]	}|jdkr' n
qtd|j dg }g }g }g }dt	i}	|D ][}
|
jdusHJ |
j
dusOJ |
j
}|j }t	u}|jr||
j |r{||
j ||
jdf ||	d|
j < q?||
j q?|r||
j ||
jdf ||	d|
j < q?d	g}| | | d
d |D  g }|D ]!\}}|r|d| d| d| d q|| d| d q|dd| d | g d dd| dg}| dd |D  |d d|}i }t||	| |d }|S )zGenerate an ``__init__`` that forwards to the FFI constructor.

    The generated initializer has a proper Python signature built from the
    reflected field list, supporting default values and ``__post_init__``.
    Nr   z!Cannot find constructor method: `z.__ffi_init__`r   T_default_factory_Fselfc                 s  s    | ]}| d V  qdS )z=MISSINGNr   ).0r   r   r   r)   	<genexpr>       zmethod_init.<locals>.<genexpr>zif z is MISSING: z = _default_factory_z()zself.__ffi_init__(z, ))ztry:z%    fn_post_init = self.__post_init__zexcept AttributeError:z    passzelse:z    fn_post_init()zdef __init__(z):c                 s  s    | ]}d | V  qdS )z    Nr   )rN   liner   r   r)   rO      rP   z    ...
__init__)extendreversedr1   parent_type_inforeverser   r   rF   type_keyr   rG   default_factoryinitappendjoinexec)r,   r   r1   cur_type_infotype_methodargs_no_defaultsargs_with_defaultsfields_with_defaultsffi_arg_orderexec_globalsr8   rG   rZ   has_default_factoryargs
body_linesrH   is_initsource_linessource	namespacerT   r   r   r)   method_inite   sp   





rm   )r   r   r   r   r   r   r   r   )r,   r4   r=   r   r   r   )r,   r4   r   r   r   rK   )r%   
__future__r   r5   dataclassesr   typingr   r   r   r   r   corer
   r   r   r   r<   rJ   rm   r   r   r   r)   <module>   s   

1