o
    í@Ëaï  ã                   @   s~   d Z ddlmZm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 ddlZG dd	„ d	ejƒZG d
d„ deƒZdS )z5 RemoveLambdas turns lambda into regular functions.  é    )ÚGlobalDeclarationsÚImportedIds)ÚTransformation)ÚMODULES)ÚmangleN)Úcopyc                       s,   e Zd Z‡ fdd„Zdd„ Zdd„ Z‡  ZS )Ú_LambdaRemoverc                    s   t t| ƒ ¡  || _|| _d S ©N)Úsuperr   Ú__init__ÚprefixÚparent)Úselfr   r   ©Ú	__class__© úH/usr/lib/python3/dist-packages/pythran/transformations/remove_lambdas.pyr      s   
z_LambdaRemover.__init__c                 C   s   t | j|ƒS r	   )Úgetattrr   )r   Úattrr   r   r   Ú__getattr__   s   z_LambdaRemover.__getattr__c           	   
   C   sN  t d | j ¡ vr&t t dtdƒ¡g¡}| j |¡ t d }|| jtdƒ< |  	|¡ d 
| jt| jƒ¡}|  t|¡}| | j¡ dd„ t|ƒD ƒ}dd„ t|ƒD ƒ|jj |j_t |t|jƒt |j¡gg d d ¡}t |t ¡ ¡ | j |¡ || j|< t |t ¡ d d ¡}|r¥t t t tdƒt ¡ d d ¡dt ¡ ¡|g| g ¡S |S )NÚ	functoolsz{0}_lambda{1}c                 S   ó    g | ]}t  |t  ¡ d d ¡‘qS r	   )ÚastÚNameÚLoad©Ú.0Ziinr   r   r   Ú
<listcomp>'   ó    ÿz/_LambdaRemover.visit_Lambda.<locals>.<listcomp>c                 S   r   r	   )r   r   ZParamr   r   r   r   r   )   r   Úpartial)r   Zglobal_declarationsÚvaluesr   ZImportÚaliasr   ÚimportsÚappendÚgeneric_visitÚformatr   ÚlenÚlambda_functionsZgatherr   Údifference_updateÚsortedÚargsZFunctionDefr   ZReturnÚbodyÚmetadataÚaddZLocalr   r   ZCallZ	Attribute)	r   ÚnodeÚimport_Zfunctools_moduleZforged_nameÚiiZbinded_argsZforged_fdefZ
proxy_callr   r   r   Úvisit_Lambda   sR   
þÿÿþü
ýù	z_LambdaRemover.visit_Lambda)Ú__name__Ú
__module__Ú__qualname__r   r   r1   Ú__classcell__r   r   r   r   r      s    r   c                       s0   e Zd ZdZ‡ fdd„Zdd„ Zdd„ Z‡  ZS )ÚRemoveLambdasaì  
    Turns lambda into top-level functions.

    >>> import gast as ast
    >>> from pythran import passmanager, backend
    >>> node = ast.parse("def foo(y): lambda x:y+x")
    >>> pm = passmanager.PassManager("test")
    >>> _, node = pm.apply(RemoveLambdas, node)
    >>> print(pm.dump(backend.Python, node))
    import functools as __pythran_import_functools
    def foo(y):
        __pythran_import_functools.partial(foo_lambda0, y)
    def foo_lambda0(y, x):
        return (y + x)
    c                    s   t t| ƒ t¡ d S r	   )r
   r6   r   r   )r   r   r   r   r   T   s   zRemoveLambdas.__init__c                 C   sP   t ƒ | _t ƒ | _|  |¡ | j|j | j |_|  jt| jƒp#t| jƒO  _|S r	   )Úlistr'   r"   r$   r+   ÚupdateÚbool©r   r.   r   r   r   Úvisit_ModuleW   s   
zRemoveLambdas.visit_Modulec                    s&   t | |jƒ‰ ‡ fdd„|jD ƒ|_|S )Nc                    s   g | ]}ˆ   |¡‘qS r   )Zvisit)r   Ún©Zlrr   r   r   a   s    z3RemoveLambdas.visit_FunctionDef.<locals>.<listcomp>)r   Únamer+   r:   r   r=   r   Úvisit_FunctionDef_   s   zRemoveLambdas.visit_FunctionDef)r2   r3   r4   Ú__doc__r   r;   r?   r5   r   r   r   r   r6   B   s
    r6   )r@   Zpythran.analysesr   r   Zpythran.passmanagerr   Zpythran.tablesr   Zpythran.conversionr   Zpythran.metadatar,   r   Zgastr   ZNodeTransformerr   r6   r   r   r   r   Ú<module>   s    4