o
    í@Ëa4  ã                   @   s8   d Z ddlmZ ddlmZ ddlZG dd„ deƒZdS )z=
UnshadowParameters prevents the shadow parameter phenomenon
é    )ÚIdentifiers)ÚTransformationNc                   @   s@   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dS )ÚUnshadowParametersax  
    Prevents parameter shadowing by creating new variable.

    >>> import gast as ast
    >>> from pythran import passmanager, backend
    >>> node = ast.parse("def foo(a): a = 1")
    >>> pm = passmanager.PassManager("test")
    >>> _, node = pm.apply(UnshadowParameters, node)
    >>> print(pm.dump(backend.Python, node))
    def foo(a):
        a_ = a
        a_ = 1
    c                 C   s   t  | t¡ d S ©N)r   Ú__init__r   ©Úself© r	   úM/usr/lib/python3/dist-packages/pythran/transformations/unshadow_parameters.pyr      s   zUnshadowParameters.__init__c                    s¨   dd„ |j j D ƒˆ _i ˆ _‡ fdd„|jD ƒ ‡ fdd„|jD ƒ ˆ j ¡ D ]!\}}|j dt t |t 	¡ d d ¡gt |t 
¡ d d ¡d ¡¡ q&ˆ  jtˆ jƒO  _|S )Nc                 S   s   h | ]}|j ’qS r	   )Úid)Ú.0Úargr	   r	   r
   Ú	<setcomp>   s    z7UnshadowParameters.visit_FunctionDef.<locals>.<setcomp>c                    ó   g | ]}ˆ   |¡‘qS r	   ©Zvisit©r   Únr   r	   r
   Ú
<listcomp>    ó    z8UnshadowParameters.visit_FunctionDef.<locals>.<listcomp>c                    r   r	   r   r   r   r	   r
   r   "   r   r   )ÚargsÚargsidÚrenamingÚbodyÚitemsÚinsertÚastZAssignÚNameZStoreZLoadÚupdateÚbool)r   ÚnodeÚkÚvr	   r   r
   Úvisit_FunctionDef   s   ýþz$UnshadowParameters.visit_FunctionDefc                 C   sb   t |tjƒr+|j| jv r-|j| jvr/|j}|| jv r#|d }|| jv s|| j|j< d S d S d S d S )NÚ_)Ú
isinstancer   r   r   r   r   Zidentifiers)r   r   Únew_namer	   r	   r
   Úupdate_name.   s   

ÿûzUnshadowParameters.update_namec                 C   s<   |j D ]}|  |¡ qz|  |¡ W |S  ty   Y |S w r   )Útargetsr&   Úgeneric_visitÚAttributeError)r   r   Útargetr	   r	   r
   Úvisit_Assign6   s   
þþzUnshadowParameters.visit_Assignc                 C   s   |   |j¡ |  |¡S r   )r&   r*   r(   ©r   r   r	   r	   r
   Úvisit_AugAssign?   s   
z"UnshadowParameters.visit_AugAssignc                 C   s   |j | jv r| j|j  |_ |S r   )r   r   r,   r	   r	   r
   Ú
visit_NameC   s   zUnshadowParameters.visit_NameN)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r"   r&   r+   r-   r.   r	   r	   r	   r
   r      s    	r   )r2   Zpythran.analysesr   Zpythran.passmanagerr   Zgastr   r   r	   r	   r	   r
   Ú<module>   s
    