U
    Y]¢h†  ã                   @   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   sf   zt  | d|¡W S  tk
r` } z2tjdt ¡ jjt ¡ | dd… f f|Ž|‚W 5 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   ú1/tmp/pip-unpacked-wheel-3vejlar1/mako/pyparser.pyr       s    

ýÿÿùør   c                   @   sŒ   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
e
 Z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 r!   )r%   r$   ©r   Únoder   r   r   Úvisit_ClassDef?   s    zFindIdentifiers.visit_ClassDefc                 C   s8   |   |j¡ | j}d| _|jD ]}|   |¡ q|| _d S ©NT)ÚvisitÚvaluer   Útargets)r   r'   Zin_aÚnr   r   r   Úvisit_AssignB   s    
zFindIdentifiers.visit_Assignc                 C   sF   |j d k	r|  |j ¡ |jd k	r,|  |j¡ |jD ]}|  |¡ q2d S r!   )r$   r%   Útyper*   Úbody©r   r'   Z	statementr   r   r   Úvisit_ExceptHandlerN   s    


z#FindIdentifiers.visit_ExceptHandlerc                 G   s   |   |d¡ d S r)   )Ú_visit_function)r   r'   Úargsr   r   r   Úvisit_LambdaV   s    zFindIdentifiers.visit_Lambdac                 C   s   |   |j¡ |  |d¡ d S r   )r%   r$   r3   r&   r   r   r   Úvisit_FunctionDefY   s    z!FindIdentifiers.visit_FunctionDefc                 C   s:   | j r,|jD ]}|  |j¡ |  |j¡ qn
|  |¡ d S r!   ©r   Ú
generatorsr*   ÚtargetÚiterZgeneric_visit©r   r'   Úcompr   r   r   Úvisit_ListComp]   s
    
zFindIdentifiers.visit_ListCompc                 C   s:   | j r,|jD ]}|  |j¡ |  |j¡ qn
|  |¡ d S r!   r7   r;   r   r   r   Úvisit_DictCompg   s
    
zFindIdentifiers.visit_DictCompc                 c   s.   |D ]$}t |tjƒr"|jE d H  q|V  qd S r!   )Ú
isinstanceÚ_astÚTupleÚelts)r   r4   r
   r   r   r   Ú_expand_tupleso   s    zFindIdentifiers._expand_tuplesc                 C   sj   | j }d| _ | j}| dd„ |  |jj¡D ƒ¡| _|rD|  |j¡ n|jD ]}|  |¡ qJ|| _ || _d S )NTc                 S   s   g | ]}t |ƒ‘qS r   ©Úarg_id©Ú.0r
   r   r   r   Ú
<listcomp>‚   s     z3FindIdentifiers._visit_function.<locals>.<listcomp>)r   r   ÚunionrC   r4   r*   r0   )r   r'   ÚislambdaÚinfr   r-   r   r   r   r3   v   s    ÿ
zFindIdentifiers._visit_functionc                 C   sH   |   |j¡ |   |j¡ |jD ]}|   |¡ q|jD ]}|   |¡ q4d S r!   )r*   r:   r9   r0   Zorelser1   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 r!   )r?   Úctxr@   ZStorer%   ÚidÚreservedr   r"   r   Úundeclared_identifiersr#   r&   r   r   r   Ú
visit_Name–   s    ÿþ
ýzFindIdentifiers.visit_Namec                 C   s>   |j D ]2}|jd k	r"|  |j¡ q|  |j d¡d ¡ qd S )NÚ.r   )ÚnamesÚasnamer%   r$   Úsplit©r   r'   r$   r   r   r   Úvisit_Import¢   s    

zFindIdentifiers.visit_Importc                 C   sN   |j D ]B}|jd k	r"|  |j¡ q|jdkr<tjd| jŽ‚q|  |j¡ q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.)rY   )rS   rT   r%   r$   r   ZCompileExceptionr   rV   r   r   r   Úvisit_ImportFrom©   s    


 ÿûz FindIdentifiers.visit_ImportFromN)r   Ú
__module__Ú__qualname__r    r%   r(   r.   r2   r5   r6   r=   Zvisit_SetCompZvisit_GeneratorExpr>   rC   r3   rL   rQ   rW   rZ   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 r!   )r   r   Úcode_factory)r   r   r^   r   r   r   r   r    º   s    zFindTuple.__init__c                 C   st   |j D ]h}| j|f| jŽ}| jj |¡ | jj t|ƒ ¡ ¡ | jj	}| 
|j	¡| j_	| jj}| 
|j¡| j_qd S r!   )rB   r^   r   r   ZcodeargsÚappendr4   ÚExpressionGeneratorr+   r"   rI   rP   )r   r'   r-   ÚpZldiZluir   r   r   Úvisit_Tuple¿   s    
ÿÿzFindTuple.visit_TupleN)r   r[   r\   r    rb   r   r   r   r   r]   ¹   s   r]   c                   @   s   e Zd Zdd„ Zdd„ ZdS )Ú	ParseFuncc                 K   s   || _ || _d S 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   rD   rF   r   r   r   rH   Ö   s     z/ParseFunc.visit_FunctionDef.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   rD   rF   r   r   r   rH   Ú   s     )r$   r   Úfuncnamer4   Úvarargr_   r
   Ú
kwonlyargsÚkwargÚargnamesÚdefaultsÚ
kwargnamesÚkw_defaultsÚ
kwdefaultsÚvarargsÚkwargs)r   r'   rh   rj   r   r   r   r6   Ó   s    
zParseFunc.visit_FunctionDefN)r   r[   r\   r    r6   r   r   r   r   rc   Î   s   rc   c                   @   s   e Zd Zdd„ Zdd„ ZdS )r`   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Ú )Újoinro   Úresult)r   r   r   r   r+   ê   s    zExpressionGenerator.valueN)r   r[   r\   r    r+   r   r   r   r   r`   å   s   r`   )r   )Ú__doc__Úoperatorr@   Zmakor   r   r   r   rO   Ú
attrgetterrE   Zrestore__astr   ZNodeVisitorr   r]   rc   r`   r   r   r   r   Ú<module>   s   


 	