
    `i"+                        d Z ddlmZ ddlZddlZddlZddlZddlmZ ddl	m
Z
mZmZ ddlmZ ej         G d d	                      Zej         G d
 d                      ZddZddddddZdS )z<Utilities for parsing and generating stub files for TVM FFI.    )annotationsN)Path)Callable	GeneratorIterable   )constsc                  ~    e Zd ZU dZded<   ded<   ded<   ded	<   d
ed<   ddZedd            Zedd            Z	dS )	CodeBlockz/A block of code to be generated in a stub file.zC.STUB_BLOCK_KINDSkindzstr | tuple[str, ...]paramintlineno_startz
int | None
lineno_endz	list[str]linesreturnNonec                    | j         dv sJ dS )z-Validate the code block after initialization.>   Nexportglobalobject__all__ty-mapimport-objectimport-sectionN)r   )selfs    k/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/tvm_ffi/stub/file_utils.py__post_init__zCodeBlock.__post_init__)   s*    y 	
 	
 	
 	
 	
 	
 	
    c                    | j         sdS | j         d         }t          |          t          |                    d                    z
  S )zECalculate the indentation level of the block based on the first line.r    )r   lenlstrip)r   
first_lines     r   indentzCodeBlock.indent6   sE     z 	1Z]
:Z%6%6s%;%;!<!<<<r   lineolinestrc                   |                     t          j                  rG|t          t          j                  d                                         }t          d|| | g           S |                     t          j                  r|t          t          j                  d                                         }d |                    d          D             }t          |          dk     r|dgdt          |          z
  z  z  }t          dt          |          | | g           S |                     t          j	                  sJ |t          t          j	                  d                                         }|                     d	          rWd
}|t          d	          d                                         }d|v r#t          |                    d                    }n|df}n|                     d          r,d}|t          d          d                                         }n|                     d          r,d}|t          d          d                                         }nl|dk    rd}d}na|                     d          r,d}|t          d          d                                         }n |dk    rd}d}nt          d| d|            t          ||| dg           S )zFParse a line to create a CodeBlock if it contains a stub begin marker.Nr   r   r   r   r   r   c                6    g | ]}|                                 S  )strip).0ps     r   
<listcomp>z-CodeBlock.from_begin_line.<locals>.<listcomp>L   s     999Aaggii999r   ;    r   zglobal/r   @zobject/r   zty-map/r   zexport/r   r   zUnknown stub type `z
` at line )
startswithCSTUB_TY_MAPr"   r-   r   STUB_IMPORT_OBJECTsplittuple
STUB_BEGIN
ValueError)r&   r'   splitsstubr   r   s         r   from_begin_linezCodeBlock.from_begin_line>   s    ??1=)) 	AM**,,-3355D"     __Q122 	A011334::<<D99C999F6{{Q2$!c&kk/22$Fmm"     q|,,,,,C%%''(..00??9%% 	LDY))*0022Ee||ekk#..//__Y'' 	LDY))*0022EE__Y'' 	LDY))*0022EE%%%#DEE__Y'' 	LDY))*0022EEYDEEJ4JJ5JJKKK
 
 
 	
r   Nr   r   )r   r   )r&   r   r'   r(   r   r   )
__name__
__module____qualname____doc____annotations__r   propertyr%   staticmethodr?   r,   r   r   r   r      s         99    
 
 
 
 = = = X= 8
 8
 8
 \8
 8
 8
r   r   c                  \    e Zd ZU dZded<   ded<   ded<   ddZeddd            ZddZdS )FileInfoz)Information about a file being processed.r   pathztuple[str, ...]r   zlist[CodeBlock]code_blocksverbosebooldry_runr   c                   t          d | j        D                       }| j        |k    r,|r(t          t          j         dt          j                    dS |rCt          j        | j        |d          D ]%}|	                    d          s|	                    d          r.|	                    d          r?|	                    d          s*t          t          j
         | t          j                    |	                    d	          r?|	                    d          s*t          t          j         | t          j                    |	                    d
          r+t          t          j         | t          j                    t          |           '|| _        |s7| j                            d                    | j                  dz   d           dS )zTUpdate the file's lines based on the current code blocks and optionally show a diff.c              3  .   K   | ]}|j         D ]}|V  d S N)r   )r.   blockr'   s      r   	<genexpr>z"FileInfo.update.<locals>.<genexpr>   s1      UU5UU$UUUUUUUr   z-----> UnchangedFr3   )linetermz---z+++-+?
utf-8encodingT)r:   rK   r   printr6   	TERM_CYAN
TERM_RESETdifflibunified_diffr5   TERM_RED
TERM_GREENTERM_YELLOWrJ   
write_textjoin)r   rL   rN   	new_linesr'   s        r   updatezFileInfo.update   s   UUD,<UUUUU	:"" FDDalDDEEE5 	 ,TZRPPP    ??5)) T__U-C-C ??3''  0F0F  QZ==q|==>>>>__S))  $//%2H2H  Q\?4???@@@@__S))  Q]@D@!,@@AAAA$KKKK
 	QI  4:!6!6!= PPPtr   Ffileinclude_emptyFileInfo | Nonec           
        |                                  sJ d|              |                                 } d}|                     d                                          }t	          |d          D ]l\  }}|                                                    t          j                  r dS |                                                    t          j	                  rd}m|s|sdS ~g }d}t	          |d          D ]d\  }}|                                }	|	                    t          j
                  rQ|t          d	|           t                              ||	          }||_        |j                            |           |	                    t          j                  r[|t          d
t          j         d|           ||_        |j                            |           |                    |           d}|	                    t          j                  rTt                              ||	          }
||
_        |
j                            |           |                    |
           ~
w|	                    t          j                  rTt                              ||	          }||_        |j                            |           |                    |           ~|	                    t          j	                  rt          d| d|	           |*|                    t          dd|||g                     J|j                            |           f|t          d          t+          | t-          |          |          S )z:Parse a file to extract code blocks based on stub markers.zExpected a file, but got: FrY   rZ   r   )startNTz"Nested stub not permitted at line zUnmatched `z` found at line zUnknown stub type at line z: r3   r*   z"Unclosed stub block at end of file)rJ   r   rK   )is_fileresolve	read_text
splitlines	enumerater-   r5   r6   STUB_SKIP_FILESTUB_PREFIXr;   r<   r   r?   r   r   appendSTUB_ENDr   r7   r8   rI   r:   )rh   ri   
has_markerr   _r'   codescodelineno
clean_linety_codeimp_codes               r   	from_filezFileInfo.from_file   s{    ||~~BBBDBBBB~||~~
>>7>;;FFHH a000 	" 	"GAtzz||&&q'788 ttzz||&&q}55 "!
 	- 	4!#!%%eQ// -	( -	(LFDJ$$Q\22 +(#$%R&%R%RSSS 00DD$*!
!!$''''&&qz22 $(<$%W1:%W%Wv%W%WXXX"(
!!$'''T"""&&q}55 (#33FJGG%+"$$T***W%%%G&&q';<< ($44VZHH&,#%%d+++X&&&H&&q}55 ( !Tf!T!T
!T!TUUU! %+#)#f      
!!$''''ABBBTu5IIIIr   r   c                    t                               | j                  }|J d| j                     |j        | _        dS )zCReload the code blocks from disk while preserving original `lines`.Nz File no longer exists or valid: )rI   r~   rJ   rK   )r   sources     r   reloadzFileInfo.reload   sG    ##DI..!!#Qdi#Q#Q!!!!-r   N)rL   rM   rN   rM   r   rM   )F)rh   r   ri   rM   r   rj   r@   )	rA   rB   rC   rD   rE   rg   rG   r~   r   r,   r   r   rI   rI   z   s         33JJJ       2 AJ AJ AJ AJ \AJF. . . . . .r   rI   paths
list[Path]r   list[FileInfo]c                (    ddd fd}t           |                      }t          |d 	          }g }|D ]V}	 t                              |          }||                    |           5# t
          $ r} |           Y d
}~Od
}~ww xY w|S )zLCollect all files from the given paths and parse them into FileInfo objects.e	Exceptionr   r   c                    t          t          j         dt          j                     t          j         dd           d S )Nz[Error]
r3   T)endflush)r\   r6   ra   	traceback
format_excr^   )r   s    r   	_on_errorz collect_files.<locals>._on_error   sL    zJJI$8$:$:JALJJ	
 	
 	
 	
 	
 	
r   Generator[Path, None, None]c               3     K   D ]u} |                                  r| V  t          | d          D ]G\  }}}|D ]>}t          |          |z  }|j                                        t
          j        vr:|V  ?Hvd S )NF)follow_symlinkson_error)rm   	path_walkr   suffixlowerr6   DEFAULT_SOURCE_EXTS)r/   root_dirsfilesrh   fr   r   s         r   _walk_recursivez&collect_files.<locals>._walk_recursive   s       		 		Ayy{{ &/5S\&]&]&]  "eU!  DT

T)Ax~~''q/DDD GGGG				 		r   c                     t          |           S rQ   )r(   )r   s    r   <lambda>zcollect_files.<locals>.<lambda>   s    A r   )keyN)r   r   r   r   )r   r   )listsortedrI   r~   rt   r   )r   r   	filenamesr   rh   contentr   r   s   `      @r   collect_filesr      s    
 
 
 

 
 
 
 
 
 
 __&&''Iy&6&6777IE & &	&((..G "W%%%	  	 	 	IaLLLLLLLL	
 Ls   A00
B:B

BTFtop_downr   r   r/   r   r   rM   r   "Callable[[Exception], None] | Noner   +Iterable[tuple[Path, list[str], list[str]]]c             #     K   |                                  sdS t          | d          r |                     |||          E d{V  dS t          j        | |||          D ]\  }}}t	          |          }|||fV  dS )z@Compat wrapper for Path.walk (3.12+) with a fallback for < 3.12.Nwalkr   )topdownonerrorfollowlinks)existshasattrr   osr   )r/   r   r   r   root_strdirnamesr   r   s           r   r   r   
  s       88:: q& 66+  
 
 	
 	
 	
 	
 	
 	
 	

 	)+	#	* * * 	( 	(%(I H~~ Hi'''''	( 	(r   )r   r   r   r   )
r/   r   r   rM   r   r   r   rM   r   r   )rD   
__future__r   dataclassesr_   r   r   pathlibr   typingr   r   r   r3   r	   r6   	dataclassr   rI   r   r   r,   r   r   <module>r      sV  " C B " " " " " "      				           0 0 0 0 0 0 0 0 0 0       W
 W
 W
 W
 W
 W
 W
 W
t h. h. h. h. h. h. h. h.V! ! ! !N 37!( ( ( ( ( ( ( (r   