B
    ×‹dx  ã               @   s¶   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddlmZ ddd	d
hZe 	d¡Z
e e¡ ddd„ZG dd„ dejƒZG dd„ dejƒZG dd„ dejƒZG dd„ dƒZdS )zyHandles parsing of Python code.

Parsing to AST is done via _ast on Python > 2.5, otherwise the compiler
module is used.
é    N)Ú	_ast_util)Úcompat)Ú
exceptions)ÚutilÚTrueÚFalseÚNoneÚprintÚargÚexecc          
   K   sd   yt  | d|¡S  tk
r^ } z2tjdt ¡ jjt ¡ | dd… f f|Ž|‚W dd}~X Y nX dS )zParse an expression into ASTz	<unknown>z(%s) %s (%r)r   é2   N)	r   ÚparseÚ	Exceptionr   ZSyntaxExceptionr   Zexception_asÚ	__class__Ú__name__)ÚcodeÚmodeÚexception_kwargsÚe© r   úZ/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/mako/pyparser.pyr       s    
r   c               @   st   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚFindIdentifiersc             K   s$   d| _ d| _tƒ | _|| _|| _d S )NF)Úin_functionÚin_assign_targetsÚsetÚlocal_ident_stackÚlistenerr   )Úselfr   r   r   r   r   Ú__init__2   s
    zFindIdentifiers.__init__c             C   s&   | j s| jj |¡ n| j |¡ d S )N)r   r   Údeclared_identifiersÚaddr   )r   Únamer   r   r   Ú_add_declared9   s    zFindIdentifiers._add_declaredc             C   s   |   |j¡ d S )N)r"   r!   )r   Únoder   r   r   Úvisit_ClassDef?   s    zFindIdentifiers.visit_ClassDefc             C   s<   |   |j¡ | j}d| _x|jD ]}|   |¡ q W || _d S )NT)ÚvisitÚvaluer   Útargets)r   r#   Zin_aÚnr   r   r   Úvisit_AssignB   s    zFindIdentifiers.visit_Assignc             C   sJ   |j d k	r|  |j ¡ |jd k	r,|  |j¡ x|jD ]}|  |¡ q4W d S )N)r!   r"   Útyper%   Úbody)r   r#   Ú	statementr   r   r   Úvisit_ExceptHandlerO   s    

z#FindIdentifiers.visit_ExceptHandlerc             G   s   |   |d¡ d S )NT)Ú_visit_function)r   r#   Úargsr   r   r   Úvisit_LambdaW   s    zFindIdentifiers.visit_Lambdac             C   s   |   |j¡ |  |d¡ d S )NF)r"   r!   r.   )r   r#   r   r   r   Úvisit_FunctionDefZ   s    z!FindIdentifiers.visit_FunctionDefc             c   s2   x,|D ]$}t |tjƒr$|jE d H  q|V  qW d S )N)Ú
isinstanceÚ_astÚTupleÚelts)r   r/   r
   r   r   r   Ú_expand_tuples^   s    
zFindIdentifiers._expand_tuplesc             C   sn   | j }d| _ | j}| dd„ |  |jj¡D ƒ¡| _|rD|  |j¡ nx|jD ]}|  |¡ qLW || _ || _d S )NTc             S   s   g | ]}t |ƒ‘qS r   )Úarg_id)Ú.0r
   r   r   r   ú
<listcomp>r   s    z3FindIdentifiers._visit_function.<locals>.<listcomp>)r   r   Úunionr6   r/   r%   r+   )r   r#   ÚislambdaÚinfr   r(   r   r   r   r.   e   s    zFindIdentifiers._visit_functionc             C   sP   |   |j¡ |   |j¡ x|jD ]}|   |¡ q W x|jD ]}|   |¡ q:W d S )N)r%   ÚiterÚtargetr+   Zorelse)r   r#   r,   r   r   r   Ú	visit_For|   s    zFindIdentifiers.visit_Forc             C   sT   t |jtjƒr|  |j¡ n4|jtkrP|j| jjkrP|j| j	krP| jj
 |j¡ d S )N)r2   Úctxr3   ÚStorer"   ÚidÚreservedr   r   r   Úundeclared_identifiersr    )r   r#   r   r   r   Ú
visit_Name‡   s    
zFindIdentifiers.visit_Namec             C   sB   x<|j D ]2}|jd k	r$|  |j¡ q|  |j d¡d ¡ qW d S )NÚ.r   )ÚnamesÚasnamer"   r!   Úsplit)r   r#   r!   r   r   r   Úvisit_Import“   s    
zFindIdentifiers.visit_Importc             C   sR   xL|j D ]B}|jd k	r$|  |j¡ q|jdkr>tjd| jŽ‚q|  |j¡ qW d S )NÚ*ú£'import *' is not supported, since all identifier names must be explicitly declared.  Please use the form 'from <modulename> import <name1>, <name2>, ...' instead.)rL   )rG   rH   r"   r!   r   ZCompileExceptionr   )r   r#   r!   r   r   r   Úvisit_ImportFromš   s    


z FindIdentifiers.visit_ImportFromN)r   Ú
__module__Ú__qualname__r   r"   r$   r)   r-   r0   r1   r6   r.   r?   rE   rJ   rM   r   r   r   r   r   1   s   r   c               @   s   e Zd Zdd„ Zdd„ ZdS )Ú	FindTuplec             K   s   || _ || _|| _d S )N)r   r   Úcode_factory)r   r   rQ   r   r   r   r   r   «   s    zFindTuple.__init__c             C   sx   xr|j D ]h}| j|f| jŽ}| jj |¡ | jj t|ƒ ¡ ¡ | jj	}| 
|j	¡| j_	| jj}| 
|j¡| j_qW d S )N)r5   rQ   r   r   ZcodeargsÚappendr/   ÚExpressionGeneratorr&   r   r:   rD   )r   r#   r(   ÚpZldiZluir   r   r   Úvisit_Tuple°   s    zFindTuple.visit_TupleN)r   rN   rO   r   rU   r   r   r   r   rP   ª   s   rP   c               @   s   e Zd Zdd„ Zdd„ ZdS )Ú	ParseFuncc             K   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r   À   s    zParseFunc.__init__c             C   s¢   |j | j_dd„ |jjD ƒ}|jjr4| |jjj¡ dd„ |jjD ƒ}|jjr^| |jjj¡ || j_	|jj
| j_
|| j_|jj| j_|jj| j_|jj| j_d S )Nc             S   s   g | ]}t |ƒ‘qS r   )r7   )r8   r
   r   r   r   r9   Ç   s    z/ParseFunc.visit_FunctionDef.<locals>.<listcomp>c             S   s   g | ]}t |ƒ‘qS r   )r7   )r8   r
   r   r   r   r9   Ë   s    )r!   r   Úfuncnamer/   ÚvarargrR   r
   Ú
kwonlyargsÚkwargÚargnamesÚdefaultsÚ
kwargnamesÚkw_defaultsÚ
kwdefaultsÚvarargsÚkwargs)r   r#   r[   r]   r   r   r   r1   Ä   s    
zParseFunc.visit_FunctionDefN)r   rN   rO   r   r1   r   r   r   r   rV   ¿   s   rV   c               @   s   e Zd Zdd„ Zdd„ ZdS )rS   c             C   s   t  d¡| _| j |¡ d S )Nz    )r   ZSourceGeneratorÚ	generatorr%   )r   Zastnoder   r   r   r   ×   s    zExpressionGenerator.__init__c             C   s   d  | jj¡S )NÚ )Újoinrb   Úresult)r   r   r   r   r&   Û   s    zExpressionGenerator.valueN)r   rN   rO   r   r&   r   r   r   r   rS   Ö   s   rS   )r   )Ú__doc__Úoperatorr3   Úmakor   r   r   r   rC   Ú
attrgetterr7   Zrestore__astr   ÚNodeVisitorr   rP   rV   rS   r   r   r   r   Ú<module>   s   


y