B
    18\                 @   s   d Z ddlmZ ddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZmZ dd ZG dd	 d	ejZd
d Zdd Zg dfddZdd ZdS )a:  Fixer for function definitions with tuple parameters.

def func(((a, b), c), d):
    ...

    ->

def func(x, d):
    ((a, b), c) = x
    ...

It will also support lambdas:

    lambda (x, y): x + y -> lambda t: t[0] + t[1]

    # The parens are a syntax error in Python 3
    lambda (x): x + y -> lambda x: x + y
   )pytree)token)
fixer_base)AssignNameNewlineNumber	Subscriptsymsc             C   s   t | tjo| jd jtjkS )N    )
isinstancer   Nodechildrentyper   STRING)stmt r   b/oak/stanford/groups/akundaje/marinovg/programs/Python-3.7.3/Lib/lib2to3/fixes/fix_tuple_params.pyis_docstring   s    r   c               @   s(   e Zd ZdZdZdZdd Zdd ZdS )	FixTupleParams   Ta  
              funcdef< 'def' any parameters< '(' args=any ')' >
                       ['->' any] ':' suite=any+ >
              |
              lambda=
              lambdef< 'lambda' args=vfpdef< '(' inner=any ')' >
                       ':' body=any
              >
              c                s  d|kr ||S g |d }|d }|d jd jtjkrZd}|d jd j}t  nd}d}ttjd d fd
d	}|jt	j
kr|| n@|jt	jkrx2t|jD ]$\}}	|	jt	j
kr||	|dkd qW sd S xD ]}
|d |
_qW |}|dkrdd _n&t|d j| r8|d _|d }xD ]}
|d |
_q>W |d j||< x4t|d |t d D ]}||d j| _qW |d   d S )Nlambdasuiteargsr      r   z;  Fc                s\   t  }|  }d|_t|| }|r2d|_| | tt	j
|  g d S )Nr    )r   new_namecloneprefixr   replaceappendr   r   r
   simple_stmt)Z	tuple_arg
add_prefixnargr   )end	new_linesselfr   r   handle_tupleC   s    
z.FixTupleParams.transform.<locals>.handle_tuple)r#   r   )F)transform_lambdar   r   r   INDENTvaluer   r   Leafr
   tfpdeftypedargslist	enumerateparentr   r   rangelenchanged)r(   noderesultsr   r   startindentr)   ir%   lineafterr   )r&   r'   r(   r   	transform.   sF    




 zFixTupleParams.transformc             C   s   |d }|d }t |d }|jtjkrD| }d|_|| d S t|}t|}| 	t
|}t|dd}	||	  xd| D ]X}
|
jtjkr|
j|krdd ||
j D }ttj|	 g| }|
j|_|
| qW d S )Nr   bodyinnerr   )r   c             S   s   g | ]}|  qS r   )r   ).0cr   r   r   
<listcomp>   s    z3FixTupleParams.transform_lambda.<locals>.<listcomp>)simplify_argsr   r   NAMEr   r   r    find_paramsmap_to_indexr   
tuple_namer   
post_orderr,   r   r   r
   power)r(   r5   r6   r   r=   r>   paramsZto_indexZtup_name	new_paramr$   Z
subscriptsnewr   r   r   r*   n   s(    
zFixTupleParams.transform_lambdaN)__name__
__module____qualname__	run_orderBM_compatiblePATTERNr<   r*   r   r   r   r   r      s
   
@r   c             C   sR   | j tjtjfkr| S | j tjkrBx| j tjkr<| jd } q$W | S td|  d S )Nr   zReceived unexpected node %s)r   r
   vfplistr   rC   vfpdefr   RuntimeError)r5   r   r   r   rB      s    rB   c             C   s<   | j tjkrt| jd S | j tjkr,| jS dd | jD S )Nr   c             S   s    g | ]}|j tjkrt|qS r   )r   r   COMMArD   )r?   r@   r   r   r   rA      s    zfind_params.<locals>.<listcomp>)r   r
   rS   rD   r   r   rC   r,   )r5   r   r   r   rD      s
    rD   Nc             C   s^   |d kri }xLt | D ]@\}}ttt|g}t|trJt|||d q|| ||< qW |S )N)d)r0   r	   r   strr   listrE   )
param_listr   rV   r9   objtrailerr   r   r   rE      s    
rE   c             C   s@   g }x0| D ](}t |tr(|t| q
|| q
W d|S )N_)r   rX   r!   rF   join)rY   lrZ   r   r   r   rF      s    

rF   )__doc__r   r   pgen2r   r   
fixer_utilr   r   r   r   r	   r
   r   BaseFixr   rB   rD   rE   rF   r   r   r   r   <module>   s    l