B
    ram                 @   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lm	Z	 ej
rredd	d
dgZedZnedd	d
g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e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)arg_stringnameTrueFalseNoneprintargidexecc          
   K   sT   yt | d|S  tk
rN   tjdt jjt | dd f f|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 r   //tmp/pip-install-0_xzzbcd/Mako/mako/pyparser.pyr   )   s    
r   c               @   sz   e Zd Zdd Zdd Zdd Zdd Zejr6d	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__;   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_declaredB   s    zFindIdentifiers._add_declaredc             C   s   |  |j d S )N)r#   r"   )r   noder   r   r   visit_ClassDefH   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_AssignK   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_ExceptHandler]   s    

z#FindIdentifiers.visit_ExceptHandlerc             G   s   |  |d d S )NT)_visit_function)r   r$   argsr   r   r   visit_Lambdae   s    zFindIdentifiers.visit_Lambdac             C   s   |  |j | |d d S )NF)r#   r"   r/   )r   r$   r   r   r   visit_FunctionDefh   s    z!FindIdentifiers.visit_FunctionDefc             c   s<   x6|D ].}t |tjr.x|jD ]
}|V  qW q|V  qW d S )N)
isinstance_astZTupleelts)r   r0   r   r)   r   r   r   _expand_tuplesl   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>   s    z3FindIdentifiers._visit_function.<locals>.<listcomp>)r   r   unionr6   r0   r&   r,   )r   r$   islambdainfr   r)   r   r   r   r/   t   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)r3   ctxr4   ZStorer#   r   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   sP   xJ|j D ]@}|jd k	r$| |j q|jdkr<tjd| j| |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.)rJ   )rE   rF   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   py3kr.   r1   r2   r6   r/   r?   rC   rH   rK   r   r   r   r   r   :   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   rP   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   rP   r   r   Zcodeargsappendr0   ExpressionGeneratorr'   r    r:   rB   )r   r$   r)   pZldiZluir   r   r   visit_Tuple   s    zFindTuple.visit_TupleN)r   rL   rM   r   rT   r   r   r   r   rO      s   rO   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r6|t|jj tjrBg }ndd |jj	D }|jj
rn|t|jj
 || j_|jj| j_|| j_tjrg | j_n|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   funcnamer0   varargrQ   r   r   Zpy2k
kwonlyargskwargargnamesdefaults
kwargnames
kwdefaultskw_defaultsvarargskwargs)r   r$   rZ   r\   r   r   r   r2      s"    

zParseFunc.visit_FunctionDefN)r   rL   rM   r   r2   r   r   r   r   rU      s   rU   c               @   s   e Zd Zdd Zdd ZdS )rR   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 )joinra   result)r   r   r   r   r'      s    zExpressionGenerator.valueN)r   rL   rM   r   r'   r   r   r   r   rR      s   rR   )r   )__doc__operatorr4   Zmakor   r   r   r   Zmako.compatr   rN   r   rA   
attrgetterr7   Zrestore__astr   ZNodeVisitorr   rO   rU   objectrR   r   r   r   r   <module>   s$   


