o
    $n0j4                     @   s   d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	 d dl
mZ 	ddededB deee eedB f fd	d
Zdee dee fddZG dd deZejdd Zdd ZG dd deZdd ZdS )    N)dedent)Any
NamedTuple)ErrorReport)SourceRangeFactoryobj	error_msgreturnc              
   C   sj   d}zt | }t | \}}W n ty/ } zd|  d}|r&|d| 7 }t||d}~ww |||fS )z{
    Wrapper around inspect.getsourcelines and inspect.getsourcefile.

    Returns: (sourcelines, file_lino, filename)
    NzCan't get source for zs. TorchScript requires source access in order to carry out compilation, make sure original .py files are available.
)inspectgetsourcefilegetsourcelinesOSError)r   r   filenamesourcelinesfile_linenoemsg r   U/home/wildlama/miniconda3/envs/lam_a2e/lib/python3.10/site-packages/torch/_sources.pyget_source_lines_and_file   s   	




r   r   c                    s   dd  d}t | D ]\}}| dr|} nq
|du r | S | | }|dd  fdd| d| D } fdd| |d	 d D }|| || S )
a   
    This helper function accepts a list of source lines. It finds the
    indentation level of the function definition (`def`), then it indents
    all lines in the function body to a point at or greater than that
    level. This allows for comments and continued string literals that
    are at a lower indentation than the rest of the code.
    Args:
        sourcelines: function source code, separated into lines by
                        the '
' character
    Returns:
        A list of source lines that have been correctly aligned
    c                 S   s   | |  |o	t|d  S N)
startswithlen)textprefixr   r   r   remove_prefix4   s   z-normalize_source_lines.<locals>.remove_prefixNdefr   c                       g | ]	} | qS r   r   .0sr   
whitespacer   r   
<listcomp>I       z*normalize_source_lines.<locals>.<listcomp>c                    r   r   r   r   r"   r   r   r$   L   r%      )	enumeratelstripr   splitappend)r   idxilZfn_defZaligned_prefixZaligned_suffixr   r"   r   normalize_source_lines&   s&   

r.   c                       s"   e Zd Z		d fdd	Z  ZS )SourceContextTNc                    s(   t  |||| || _|| _|| _d S r   )super__init__uses_true_divisionr   funcname)selfsourcer   r   leading_whitespace_lenr2   r3   	__class__r   r   r1   X   s   	
zSourceContext.__init__)TN)__name__
__module____qualname__r1   __classcell__r   r   r7   r   r/   W   s    r/   c                  G   s   t |  S r   )r/   )argsr   r   r   make_source_contextg   s   r>   c                   C   s   t dd ddddS )N r   r&   )r/   Zmake_raw_ranger   r   r   r   
fake_rangel   s   r@   c                   @   s<   e Zd ZU ejed< eed< eed< edB ed< eed< dS )	ParsedDefastctxr5   Nr   r   )	r9   r:   r;   rB   Module__annotations__r/   strintr   r   r   r   rA   p   s   
 
rA   c           	      C   s   t | t \}}}t|}d|}t|}t|}t|j	dks,t
|j	d tjs6td| d| t|ddd t|ddd  }t||||d| j}t|||||S )Nr?   r&   r   z&Expected a single top-level function: :r
   T)r   r   Z
call_stackr.   joinr   rB   parser   body
isinstanceFunctionDefRuntimeErrorr)   r>   r9   rA   )	fnr   r   r   r5   Z
dedent_srcZpy_astr6   rC   r   r   r   	parse_defx   s$   


 rP   r   )rB   	functoolsr   textwrapr   typingr   r   Ztorch._Cr   Ztorch._C._jit_tree_viewsr   rF   tuplelistrG   r   r.   r/   cacher>   r@   rA   rP   r   r   r   r   <module>   s,   
1
