o
    bc                     @   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   5/usr/lib/python3.10/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|v r
 ||S g |d }|d }|d jd jtjkr-d}|d jd j}t  nd}d}ttjd d fd
d	}|jt	j
krL|| n|jt	jkrjt|jD ]\}}	|	jt	j
kri||	|dkd qWsnd S D ]}
|d |
_qp|}|dkrdd _nt|d j| r|d _|d }D ]}
|d |
_q|d j||< t|d |t d D ]
}||d j| _q|d   d S )Nlambdasuiteargsr      r   z;  Fc                    s\   t  }|  }d|_t|| }|rd|_| | tt	j
|  g d S )Nr    )r   new_namecloneprefixr   replaceappendr   r   r
   simple_stmt)	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   	transform.   sH   

zFixTupleParams.transformc                 C   s   |d }|d }t |d }|jtjkr"| }d|_|| d S t|}t|}| 	t
|}t|dd}	||	  | D ],}
|
jtjkrn|
j|v rndd ||
j D }ttj|	 g| }|
j|_|
| qBd 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*   r7   r8   r   r?   r@   paramsto_indextup_name	new_paramr%   
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   sT   | j tjtjfv r| S | j tjkr$| j tjkr"| jd } | j tjks| S td|  )Nr   zReceived unexpected node %s)r   r
   vfplistr   rF   vfpdefr   RuntimeErrorr7   r   r   r   rE      s   
rE   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   COMMArG   rA   r   r   r   rD      s     zfind_params.<locals>.<listcomp>)r   r
   rY   rG   r   r   rF   r.   r[   r   r   r   rG      s
   rG   Nc                 C   sZ   |d u ri }t | D ] \}}ttt|g}t|tr$t|||d q
|| ||< q
|S )N)d)r2   r	   r   strr   listrH   )
param_listr   r]   r;   objtrailerr   r   r   rH      s   
rH   c                 C   s<   g }| D ]}t |tr|t| q|| qd|S )N_)r   r_   r!   rI   join)r`   lra   r   r   r   rI      s   

rI   )__doc__r   r   pgen2r   r   
fixer_utilr   r   r   r   r	   r
   r   BaseFixr   rE   rG   rH   rI   r   r   r   r   <module>   s     l