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r„dˆ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