B
    \                 @   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   /lib/python3.7/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
   Z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   ZLeafr
   ZtfpdefZtypedargslist	enumerateparentr   r   rangelenZchanged)r'   noderesultsr   r   startindentr(   ir$   lineZ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   Z
post_orderr+   r   r   r
   Zpower)r'   r0   r1   r   r7   r8   ZparamsZto_indexZtup_nameZ	new_paramr#   Z
subscriptsnewr   r   r   r)   n   s(    
zFixTupleParams.transform_lambdaN)__name__
__module____qualname__Z	run_orderZBM_compatibleZPATTERNr6   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
   Zvfplistr   r=   vfpdefr   RuntimeError)r0   r   r   r   r<      s    r<   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   COMMAr>   )r9   r:   r   r   r   r;      s    zfind_params.<locals>.<listcomp>)r   r
   rE   r>   r   r   r=   r+   )r0   r   r   r   r>      s
    r>   Nc             C   s^   |d kri }xLt | D ]@\}}ttt|g}t|trJt|||d q|| ||< qW |S )N)d)r,   r	   r   strr   listr?   )
param_listr   rH   r4   objZtrailerr   r   r   r?      s    
r?   c             C   s@   g }x0| D ](}t |tr(|t| q
|| q
W d|S )N_)r   rJ   r!   r@   join)rK   lrL   r   r   r   r@      s    

r@   )__doc__r   r   Zpgen2r   r   Z
fixer_utilr   r   r   r   r	   r
   r   ZBaseFixr   r<   r>   r?   r@   r   r   r   r   <module>   s    l