U
    d1                     @   s  d dl Z d dlZd dl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 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 d dlmZ d dlmZ zd dlmZ  W n  e!k
r   d dlm"Z  Y nX zd d	lm#Z$ W n" e!k
r   d d
lm%Z$ Y nX e$Z&G dd de Z'eddZ(dZ)e*ee*ee* f dddZ+edZ,edZ-ee,gee- f ee, ee- dddZ.ee,gee- f ee, ee- dddZ/e j0eg e*f ed dddZ1eedddZ2ej3dd e*ed!d"d#Z4e*e5d$d%d&Z6G d'd( d(Z7d<eee* e7d)d*d+Z8d=ee5e5e*d-d.d/Z9d>ee5e5e5e*d0d1d2Z:eeef e5e5e5e*d3d4d5Z;eee ee eed6f f e5e5e5e*d3d7d8Z<ee* e5e5e5e*e*e*d9d:d;Z=dS )?    N)	Namespace)fieldsis_dataclass)TupleListIterableIteratorCallableSequenceTypeVarOptionalDictAnyUnionSetNoReturn)Enum)CodeTemplate)CSafeLoader)
SafeLoader)CSafeDumper)
SafeDumperc                       s   e Zd Zd fdd	Z  ZS )
YamlLoaderFc                    s`   g }|j D ]@\}}| j||d}||ks@td| d|jj || q
t j||d}|S )N)deepz'Found a duplicate key in the yaml. key=z, line=)valueZconstruct_objectAssertionErrorZ
start_marklineappendsuperconstruct_mapping)selfnoder   mappingZkey_nodeZ
value_nodekey	__class__ 2/tmp/pip-unpacked-wheel-ua33x9lu/torchgen/utils.pyr   /   s    zYamlLoader.construct_mapping)F)__name__
__module____qualname__r   __classcell__r&   r&   r$   r'   r   .   s   r   Target)Z
DEFINITIONZDECLARATIONZREGISTRATIONZANONYMOUS_DEFINITIONZNAMESPACED_DEFINITIONZNAMESPACED_DECLARATIONz(^|\W){}($|\W))schemareturnc                 C   s>   t d| }|d kr"td|  | \}}}||dfS )Nz(\w+)(\.\w+)?\((.*)\)zUnsupported function schema: , )rematchRuntimeErrorgroupssplit)r-   mname_paramsr&   r&   r'   split_name_paramsX   s
    r9   TS)funcxsr.   c                 c   s$   |D ]}| |}|d k	r|V  qd S Nr&   r<   r=   xrr&   r&   r'   mapMaybeg   s    rB   c                 c   s"   |D ]}| |D ]
}|V  qqd S r>   r&   r?   r&   r&   r'   	concatMapo   s    rC   )msg_fnr.   c              
   c   sz   z
d V  W nj t k
rt } zL|  }t|d}|jrH|jd  d| n|}|f|jdd   |_ W 5 d }~X Y nX d S )Nz  r   
   )	Exceptiontextwrapindentargs)rD   emsgr&   r&   r'   contextx   s    
rM   )r@   r.   c                 C   s   t dt| jd S )NzUnhandled type: {})r   formattyper(   )r@   r&   r&   r'   assert_never   s    rP   )maxsize)template_fnr.   c                 C   s
   t | S r>   )r   	from_file)rR   r&   r&   r'   _read_template   s    rT   )sr.   c                 C   s"   t | d }tj|ddS )Nlatin1little)	byteorder)hashlibsha1encodedigestint
from_bytes)rU   rZ   r&   r&   r'   string_stable_hash   s    r_   c                
   @   s  e Zd ZU eed< eed< eed< ee ed< eeeddddZeedd	d
dZeee	g e
eeeef f f ddddZee	g e
ee
eeeef f f f ddddZddeee e	egef e	egeeee f f eeeeef  ee ddddZeeddddZdS )FileManagerinstall_dirtemplate_dirdry_run	filenamesN)ra   rb   rc   r.   c                 C   s   || _ || _t | _|| _d S r>   )ra   rb   setrd   rc   )r    ra   rb   rc   r&   r&   r'   __init__   s    zFileManager.__init__)filenamecontentsr.   c              	   C   s~   z"t |d}| }W 5 Q R X W n tk
r:   d }Y nX ||krztjtj|dd t |d}|| W 5 Q R X d S )NrA   T)exist_okw)openreadIOErrorosmakedirspathdirnamewrite)r    rg   rh   fZold_contentsr&   r&   r'   _write_if_changed   s    
zFileManager._write_if_changed)rg   rR   env_callabler.   c                 C   s   d | j|}|| jks td| j| | js| }t|trd|krld}|d tj	
|7 }||d< ttj	| j|}| ||| n t|tr| || nt| d S )Nz{}/{}zduplicate file write {filename}Zgenerated_commentz@generated by torchgen/gen.pyz from {})rN   ra   rd   r   addrc   
isinstancedictrn   rp   basenamerT   joinrb   rt   
substitutestrrP   )r    rg   rR   ru   envcommenttemplater&   r&   r'   write_with_template   s    

zFileManager.write_with_template)rg   ru   r.   c                 C   s   |  ||| d S r>   )r   )r    rg   ru   r&   r&   r'   rr      s    zFileManager.write)base_env)rg   itemskey_fnru   
num_shardsr   sharded_keysr.   c                   s  ddi}dd t |D }	|g|	 }
|d k	r@|
D ]  | q0D ]F}|
D ]< | krt | tsntd |   |< qLg  |< qLqDtttt f tttt f d dfdd}| j	rd	}|D ]8}||}t
|| }||}||	| | ||| q|d
}|dkrt|}|d | }||d  }|
D ]0  d }| | | | | fdd q:| j| j d| d|  d S )Nshard_idZ
Everythingc                 S   s   g | ]}d d| iqS )r   r7   r&   ).0ir&   r&   r'   
<listcomp>   s    z-FileManager.write_sharded.<locals>.<listcomp>z'sharded keys in base_env must be a list)intofrom_r.   c                    s<   |  D ].\}}| ks&td| | |  |7  < qd S )Nzundeclared sharded key )r   r   )r   r   kv)r   r&   r'   	merge_env   s    z,FileManager.write_sharded.<locals>.merge_envr&   .c                      s    S r>   r&   r&   )shardr&   r'   <lambda>      z+FileManager.write_sharded.<locals>.<lambda>/)rangeupdaterw   listr   copyr   r|   r   rc   r_   rfindlenr   rd   discardra   )r    rg   r   r   ru   r   r   r   Z
everythingZshardsZ
all_shardsr#   r   itemZsidr}   Zdot_posbase_filename	extensionr   r&   )r   r   r'   write_sharded   sV    
 .

  
zFileManager.write_sharded)variable_namerg   r.   c                 C   s2   d |ddd t| jD }| || dS )z[Write a file containing the list of all outputs which are
        generated by this script.zset({}
    {})z
    c                 s   s   | ]}d | d  V  qdS )"Nr&   )r   r6   r&   r&   r'   	<genexpr>  s     z,FileManager.write_outputs.<locals>.<genexpr>N)rN   rz   sortedrd   rt   )r    r   rg   contentr&   r&   r'   write_outputs  s
    zFileManager.write_outputs)r(   r)   r*   r|   __annotations__boolr   rf   rt   r	   r   r   r   r   rr   r   r:   r   r]   r   r   r   r&   r&   r&   r'   r`      s6   
"Br`   )optionsra   r.   c                 C   s.   t j| jd}|r|n| j}t||| jdS )NZ	templates)ra   rb   rc   )rn   rp   rz   source_pathra   r`   rc   )r   ra   rb   r&   r&   r'   make_file_manager  s      r   P   )objrI   widthr.   c                 C   s0   t jdkr"ddlm} || ||S t| ||dS )N)   
   r   )pformat)rI   r   )sysversion_infopprintr   _pformat)r   rI   r   r   r&   r&   r'   dataclass_repr*  s    
r   )r   rI   r   curr_indentr.   c                    s   t  stdt   jj}|t|d 7 } fddt D }g }|D ]\}}|t| d }	t |rt||||	}
nBt|t	rt
||||	}
n(t|tttfrt||||	}
nt|}
|| d|
  qP|d }d| |}| d| d	S )
Nz%obj should be a dataclass, received: rF   c                    s$   g | ]}|j r|jt |jfqS r&   )reprr6   getattr)r   rs   r   r&   r'   r   D  s      z_pformat.<locals>.<listcomp>= z,
())r   r   rO   r%   r(   r   r   r   rw   rx   _format_dictr   re   tuple_format_listr   r   rz   )r   rI   r   r   
class_nameZfields_list
fields_strr6   attrZ_curr_indentZstr_repr
indent_strbodyr&   r   r'   r   8  s$    
r   )r   rI   r   r   r.   c           	      C   sv   ||d 7 }g }|   D ]J\}}t|}t|rFt||||t| nt|}|| d|  qt||||ddS )Nr   z: {})r   r   r   r   r   r   _format)	r   rI   r   r   Z	dict_reprr   r   Zk_reprZv_strr&   r&   r'   r   [  s    r   .c                    sJ    d 7   fdd| D }t | tr0dnd\}}t| ||S )NrF   c                    s*   g | ]"}t |rt| nt|qS r&   )r   r   r   )r   lr   rI   r   r&   r'   r   v  s   z _format_list.<locals>.<listcomp>)[])r   r   )rw   r   r   )r   rI   r   r   Z	list_reprstartendr&   r   r'   r   o  s    r   )r   rI   r   r   r   r   r.   c           
      C   sT   d\}}t t| |kr$d}d| }d| }d| | | }	| | |	 | S )N) r   rE   r   r/   )r   r   rz   )
r   rI   r   r   r   r   	delimiterZcurr_indent_strr   r   r&   r&   r'   r   ~  s    r   )N)r   r   )r   )>
contextlib	functoolsrY   rn   r0   rH   r   argparser   Zdataclassesr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   r   r   enumr   Ztorchgen.code_templater   Zyamlr   LoaderImportErrorr   r   ZDumperr   Z
YamlDumperr   r,   ZIDENT_REGEXr|   r9   r:   r;   rB   rC   contextmanagerrM   rP   	lru_cacherT   r]   r_   r`   r   r   r   r   r   r   r&   r&   r&   r'   <module>   s   <((	
      $
