B
    ra                 @   s   d Z ddlZddlmZ ddlmZ ddlmZ G dd deZG dd	 d	eZG d
d deZ	G dd deZ
G dd de
ZdS )zjutilities for analyzing expressions and blocks of Python
code, as well as generating Python from AST nodes    N)compat)
exceptions)pyparserc               @   s   e Zd ZdZdd ZdS )
PythonCodez<represents information about a string containing Python codec             K   sX   || _ t | _t | _t|tjr8tj|	 df|}n|}tj
| f|}|| d S )Nexec)codesetdeclared_identifiersundeclared_identifiers
isinstancer   string_typesr   parselstripZFindIdentifiersvisit)selfr   exception_kwargsexprf r   */tmp/pip-install-0_xzzbcd/Mako/mako/ast.py__init__   s    zPythonCode.__init__N)__name__
__module____qualname____doc__r   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdd ZdS )ArgumentListzBparses a fragment of code as a comma-separated list of expressionsc             K   s|   g | _ g | _t | _t | _t|tjrZt	d|rHt	d|sH|d7 }t
j|df|}n|}t
j| tf|}|| d S )Nz\Sz,\s*$,r   )Zcodeargsargsr   r	   r
   r   r   r   rematchr   r   Z	FindTupler   r   )r   r   r   r   r   r   r   r   r   7   s    zArgumentList.__init__N)r   r   r   r   r   r   r   r   r   r   3   s   r   c                   s    e Zd ZdZ fddZ  ZS )PythonFragmentzextends PythonCode to provide identifier lookups in partial control
    statements

    e.g.::

        for x in 5:
        elif y==9:
        except (MyException, e):

    c                s   t d| t j}|s*tjd| f||drF|d |d }|dd\}}|dkrh|d }nj|dkrz|d	 }nX|d
ks|dkrd| d }n:|dkrd| d }n$|dkr|d }ntjd| f|tt	| j
|f| d S )Nz^(\w+)(?:\s+(.*?))?:\s*(#|$)z0Fragment '%s' is not a partial control statement         )forifwhilepasstryzpass
except:passelifelsezif False:pass
exceptz	try:pass
withz!Unsupported control keyword: '%s')r   r   stripSr   CompileExceptiongroupstartsuperr    r   )r   r   r   mkeywordr   )	__class__r   r   r   V   s,    



zPythonFragment.__init__)r   r   r   r   r   __classcell__r   r   )r5   r   r    I   s   r    c               @   s0   e Zd ZdZdddZdddZedd	 Zd
S )FunctionDeclzfunction declarationTc             K   sp   || _ tj|df|}tj| f|}|| t| dsJtjd| f||sl| jrltjd| j	d  f|d S )Nr   funcnamez'Code '%s' is not a function declarationz('**%s' keyword argument not allowed here)
r   r   r   Z	ParseFuncr   hasattrr   r/   kwargs
kwargnames)r   r   Zallow_kwargsr   r   r   r   r   r   r   v   s    


zFunctionDecl.__init__Fc       	      C   s>  g }| j ddd }| jddd }| jddd }| jddd }| jr^|d|d  xn|D ]f}|r|d||f  qd|r|d}|dkr|| q|d|t|	 f  qd|| qdW | j
r|d|d  xH|D ]@}|s|s|| q|d}|d|t|	 f  qW |  |S )aE  Return the argument declarations of this FunctionDecl as a printable
        list.

        By default the return value is appropriate for writing in a ``def``;
        set `as_call` to true to build arguments to be passed to the function
        instead (assuming locals with the same names as the arguments exist).
        Nr9   z**r   z%s=%s*)argnamesr<   defaults
kwdefaultsr;   appendpopr   ZExpressionGeneratorvaluevarargsreverse)	r   Zas_callZ	namedeclsr>   r<   r?   r@   namedefaultr   r   r   get_argument_expressions   s:    	




z%FunctionDecl.get_argument_expressionsc             C   s   t | jt | j S )N)tupler>   r<   )r   r   r   r   allargnames   s    zFunctionDecl.allargnamesN)T)F)r   r   r   r   r   rH   propertyrJ   r   r   r   r   r7   r   s   

9r7   c                   s    e Zd ZdZ fddZ  ZS )FunctionArgsz.the argument portion of a function declarationc                s   t t| jd| f| d S )Nzdef ANON(%s):pass)r2   rL   r   )r   r   r;   )r5   r   r   r      s    
zFunctionArgs.__init__)r   r   r   r   r   r6   r   r   )r5   r   rL      s   rL   )r   r   Zmakor   r   r   objectr   r   r    r7   rL   r   r   r   r   <module>   s   ")T