o
    i$%                     @  s   d 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mZ d6ddZd7ddZd8ddZd9ddZd:d!d"Zd;d#d$Zd<d/d0Z	1d=d>d3d4Zd5S )?z5Code generation logic for the `tvm-ffi-stubgen` tool.    )annotations)Callable   )consts)	CodeBlock)FuncInfo
ImportItem
InitConfig
ObjectInfoOptionsty_mapdict[str, str]importslist[ImportItem]returnCallable[[str], str]c                   s   d fdd}|S )Nnamestrr   c                   s8    | | } d| v r t| dd d | ddd S )N.Ttype_checking_onlyaliasr   )getappendr   rsplitr   r   r    Q/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/tvm_ffi/stub/codegen.py_run   s   z%_type_suffix_and_record.<locals>._run)r   r   r   r   r   )r   r   r    r   r   r   _type_suffix_and_record   s   r!   coder   global_funcslist[FuncInfo]optr   Nonec                   s   t | jdks	J |sdS t| jtsJ | j\}}|sd}|t| ddddtddd	g t|| d
d| ddg fdd|D d}d| j | jd gfdd|D | jd | _dS )ztGenerate function signatures for global functions.

    It processes: global/${prefix}@${import_from="tvm_ffi")
       Ntvm_ffiz.init_ffi_apiF_FFI_INIT_FUNCr   typing.TYPE_CHECKINGr   
# fmt: offz_FFI_INIT_FUNC("z", __name__)if TYPE_CHECKING:c                   s   g | ]
}|j  jd qS )indent)genr/   ).0func)	fn_ty_mapr%   r   r   
<listcomp>M       z)generate_global_funcs.<locals>.<listcomp>	# fmt: on r   c                      g | ]} | qS r   r   r1   liner.   r   r   r4   S       r   )	lenlines
isinstanceparamtupleextendr   r!   r/   )r"   r#   r   r   r%   prefiximport_fromresultsr   )r3   r/   r%   r   generate_global_funcs)   sF   




rE   obj_infor
   c                   s   t | jdks	J |}t||}|jr3|tddd dg|j|ddd|j||jdd	}ndg|j|ddd	}d
| j  | jd g fdd|D | jd | _dS )zZGenerate a class definition for an object type.

    It processes: object/${type_key}
    r'   r*   Fr+   r,   r   r.   r-   r6   r7   c                   r8   r   r   r9   r.   r   r   r4   }   r;   z#generate_object.<locals>.<listcomp>r   N)	r<   r=   r!   methodsr   r   
gen_fieldsgen_methodsr/   )r"   r   r   r%   rF   infor3   rD   r   r.   r   generate_objectX   sB   
	

rK   c                   s   i i |D ]}|j r|jg | q|jg | qr0dg tddd ddd g }rH| fddtD  r_|d | fddtD  |rx| jd dddg|dd| jd | _dS dS )zaGenerate import statements for the types used in the stub.

    It processes: import-section
    typingr*   Tr+   modr   itemsr   r/   intr   c                 S  sZ   |j dd d dttdd |D }d| }| r&| d|  d	| S | d
| S )Nc                 S  s   | j S Nr   )itemr   r   r   <lambda>   s    z=generate_import_section.<locals>._make_line.<locals>.<lambda>keyz, c                 s  s    | ]}|j V  qd S rP   )name_with_alias)r1   rQ   r   r   r   	<genexpr>   s    z>generate_import_section.<locals>._make_line.<locals>.<genexpr>r7   zfrom z import zimport )sortjoinsortedset)rM   rN   r/   names
indent_strr   r   r   
_make_line   s   z+generate_import_section.<locals>._make_linec                 3  s"    | ]} || d dV  qdS )r   r.   Nr   r1   rM   )r]   imports_concreter   r   rV          
z*generate_import_section.<locals>.<genexpr>r-   c                 3  s"    | ]} || j V  qd S rP   r.   r^   )r]   imports_ty_checkr%   r   r   rV      r`   r   r,   # isort: offz"from __future__ import annotations# isort: onr6   r   N)rM   r   rN   r   r/   rO   r   r   )r   
setdefaultrM   r   r   rA   rY   r=   )r"   r   r%   rQ   rD   r   )r]   r_   ra   r%   r   generate_import_section   sH   	

	

re   r[   set[str]c                   sr   t | jdks	J |sdS d| j  dd |D }dd
d}| jd g fddt||dD | jd | _dS )3Generate an `__all__` variable for the given names.r'   Nr7   c                 S  s   h | ]
}| d dd qS )r   r   r   )r   )r1   fr   r   r   	<setcomp>   r5   zgenerate_all.<locals>.<setcomp>r   r   r   tuple[int, str]c                 S  s8   |   rd| fS | r| d   rd| vrd| fS d| fS )Nr   _r   r'   )isupperr   r   r   r   	_sort_key   s
   zgenerate_all.<locals>._sort_keyr   c                   s   g | ]
}  d | dqS )"z",r   )r1   r   r.   r   r   r4      r5   z generate_all.<locals>.<listcomp>rS   r   )r   r   r   rj   )r<   r=   r/   rY   )r"   r[   r%   rm   r   r.   r   generate_all   s   


ro   c                 C  sb   t | jdks	J | j}| jd ddd| dd| d| dd	d
d| ddd| jd g| _dS )rg   r'   r   r,   rb   zfrom .z import *  # noqa: F403z import __all__ as __all__zif "__all__" not in globals():z    __all__ = []z__all__.extend(z__all__)rc   r6   r   N)r<   r=   r?   )r"   rM   r   r   r   generate_export   s   


rq   code_blockslist[CodeBlock]module_namer   object_infoslist[ObjectInfo]init_cfgr	   is_rootboolc                 C  sj  d}| s|d| d7 }t dd | D s|tj7 }|r1|tdd7 }|d|j d	|j d
7 }t dd | D sA|t|7 }|rK|tdd7 }dd |D }|D ]P}|j}	|j}
|	du raqT|	|	|	}	|	
ddd }|
rw|	|
|
n|
}
|
r|

ddd nd}|
r|
|vrd|
dd }|t|
|7 }|t||	|7 }qTt dd | D s|tj7 }|S )z:Generate the initial FFI API stub code for a given module. z"""FFI API bindings for ."""
c                 s      | ]}|j d kV  qdS )zimport-sectionNkindr1   r"   r   r   r   rV          z#generate_ffi_api.<locals>.<genexpr>ztvm_ffi.libinfo.load_lib_module_FFI_LOAD_LIBzLIB = _FFI_LOAD_LIB("z", "z")
c                 s  r|   )globalNr}   r   r   r   r   rV      r   ztvm_ffi.register_object_FFI_REG_OBJc                 S  s   h | ]}|j r|j qS r   )type_key)r1   rJ   r   r   r   ri     s    z#generate_ffi_api.<locals>.<setcomp>Nr   r   r   Objectrk   c                 s  r|   )rp   Nr}   r   r   r   r   rV     r   )anyCPROMPT_IMPORT_SECTION_prompt_import_objectpkgshared_target_prompt_globalsr   parent_type_keyr   r   replace_prompt_class_defPROMPT_ALL_SECTION)rr   r   rt   ru   rw   rx   r   defined_type_keysrJ   r   r   	type_nameparent_type_namer   r   r   generate_ffi_api   sD   

r   _ffi_api	submodulec                 C  sJ   dt j d| dt j d}| sd| d| S tdd | D s#|S dS )z:Generate the `__init__.py` file for the `tvm_ffi` package.
z export/z"""Package r{   c                 s  r|   )exportNr}   r   r   r   r   rV   +  r   z generate_init.<locals>.<genexpr>rz   )r   
STUB_BEGINSTUB_ENDr   )rr   rt   r   r"   r   r   r   generate_init  s   r   N)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   rF   r
   r   r&   )r"   r   r   r   r%   r   r   r&   )r"   r   r[   rf   r%   r   r   r&   )r"   r   r   r&   )rr   rs   r   r   rt   r   ru   rv   rw   r	   rx   ry   r   r   )r   )rr   rs   rt   r   r   r   r   r   )__doc__
__future__r   rL   r   rz   r   r   
file_utilsr   utilsr   r   r	   r
   r   r!   rE   rK   re   ro   rq   r   r   r   r   r   r   <module>   s   


/
*
5

@