
\[\                 @   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 Gd d	   d	 e j  Z d
 d   Z d d   Z g  d 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   4/usr/lib/python3.4/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                s6  d | k r  j  | |  Sg   | d } | d } | d j d j t j k ry d } | d j d j } t     n! d } d } t j t j d    d	     f d
 d  } | j t	 j
 k r | |  n` | j t	 j k r4xK t | j  D]7 \ } }	 |	 j t	 j
 k r | |	 d | d k q q Wn   s>d  Sx  D] }
 | d |
 _ qEW| } | d k r~d  d _ n1 t | d j |  r|  d _ | d } n  x  D] }
 | d |
 _ qW | d j | |  <x= t | d | t   d  D] } | | d j | _ qW| d j   d  S)Nlambdasuiteargsr      r   z;  Fc                s   t   j    } |  j   } d | _ t | | j    } | rN d | _ n  |  j |   j t j t	 j
 |   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_tupler"   r   )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   sB  | d } | d } t  | d  } | j t j k r\ | j   } d | _ | j |  d  St |  } t |  } |  j	 t
 |   } t | d d }	 | j |	 j    x | j   D] }
 |
 j t j k r |
 j | k r d d   | |
 j D } t j t j |	 j   g |  } |
 j | _ |
 j |  q q Wd  S)Nr   bodyinnerr   r   c             S   s   g  |  ] } | j     q Sr   )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   so   |  j  t j t j f k r |  S|  j  t j k r[ x# |  j  t j k rV |  j d }  q4 W|  St 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   sP   |  j  t j k r# t |  j d  S|  j  t j k r< |  j Sd d   |  j D S)Nr   c             S   s.   g  |  ]$ } | j  t j k r t |   q Sr   )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  } n  xh t  |   D]Z \ } } t t t |    g } t | t  rn t | | 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   sV   g  } x@ |  D]8 } t  | t  r8 | j t |   q | j |  q Wd j |  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