3
՛gY                 @   s   d Z ddlmZmZmZ ddlmZ ddlZejrNe	ddddgZ
ejd	Zne	dddgZ
ejd
ZddlZeje ddlmZ 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.
    )
exceptionsutilcompat)arg_stringnameNTrueFalseNoneprintargid)	_ast_utilexecc             K   sT   yt j| d|S  tk
rN   tjdtj jjtj | 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   //usr/lib/python3/dist-packages/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__5   s
    zFindIdentifiers.__init__c             C   s&   | j s| jjj| n| jj| d S )N)r   r   declared_identifiersaddr   )r   namer   r   r   _add_declared<   s    zFindIdentifiers._add_declaredc             C   s   | j |j d S )N)r#   r"   )r   noder   r   r   visit_ClassDefB   s    zFindIdentifiers.visit_ClassDefc             C   s<   | j |j | j}d| _x|jD ]}| j | q W || _d S )NT)visitvaluer   Ztargets)r   r$   Zin_anr   r   r   visit_AssignE   s    zFindIdentifiers.visit_Assignc             C   sJ   |j d k	r| j|j  |jd k	r,| j|j x|jD ]}| j| q4W d S )N)r"   r#   typer&   body)r   r$   	statementr   r   r   visit_ExceptHandlerW   s    

z#FindIdentifiers.visit_ExceptHandlerc             G   s   | j |d d S )NT)_visit_function)r   r$   argsr   r   r   visit_Lambda_   s    zFindIdentifiers.visit_Lambdac             C   s   | j |j | j|d d S )NF)r#   r"   r.   )r   r$   r   r   r   visit_FunctionDefb   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   r/   r
   r(   r   r   r   _expand_tuplesf   s
    
zFindIdentifiers._expand_tuplesc             C   sn   | j }d| _ | j}|jdd | j|jjD | _|rD| j|j nx|jD ]}| j| 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   unionr5   r/   r&   r+   )r   r$   Zislambdainfr   r(   r   r   r   r.   n   s    zFindIdentifiers._visit_functionc             C   sP   | j |j | j |j x|jD ]}| j | q W x|jD ]}| j | 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|j n4|jtkrP|j| jjkrP|j| j	krP| jj
j|j d S )N)r2   Zctxr3   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|j q| j|j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|j q|jdkr<tjd| j| 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.)rG   )rB   rC   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-   r0   r1   r5   r.   r=   r@   rE   rH   r   r   r   r   r   3   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   rM   r   r   r   r   r      s    zFindTuple.__init__c             C   sp   xj|j D ]`}| j|f| j}| jjj| | jjjt|j  | jj	j
|j	| j_	| jjj
|j| j_qW d S )N)r4   rM   r   r   Zcodeargsappendr/   ExpressionGeneratorr'   r    r9   r?   )r   r$   r(   pr   r   r   visit_Tuple   s    zFindTuple.visit_TupleN)r   rI   rJ   r   rQ   r   r   r   r   rL      s   rL   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|jt|jj tjrBg }ndd |jj	D }|jj
rn|j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   )r6   )r7   r
   r   r   r   r8      s    z/ParseFunc.visit_FunctionDef.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )r6   )r7   r
   r   r   r   r8      s    )r"   r   funcnamer/   ZvarargrN   r   r   Zpy2kZ
kwonlyargsZkwargargnamesZdefaults
kwargnamesZ
kwdefaultsZkw_defaultsZvarargskwargs)r   r$   rT   rU   r   r   r   r1      s"    

zParseFunc.visit_FunctionDefN)r   rI   rJ   r   r1   r   r   r   r   rR      s   rR   c               @   s   e Zd Zdd Zdd ZdS )rO   c             C   s   t jd| _| jj| d S )N    z    )r   ZSourceGenerator	generatorr&   )r   Zastnoder   r   r   r      s    zExpressionGenerator.__init__c             C   s   dj | jjS )N )joinrY   result)r   r   r   r   r'      s    zExpressionGenerator.valueN)r   rI   rJ   r   r'   r   r   r   r   rO      s   rO   )r   )__doc__Zmakor   r   r   Zmako.compatr   operatorrK   r   r>   
attrgetterr6   r3   Zrestore__astr   r   ZNodeVisitorr   rL   rR   objectrO   r   r   r   r   <module>   s    


|